如何提高 ARCore 中的预览相机质量

Akh*_*tal 6 java android augmented-reality android-camera arcore

我在我的 Android 项目中使用 ARCore。它有一项活动 MainActivity.java 和一项 CustomArFragment.java。

问题是相机质量非常低。如何提高相机预览分辨率。将来,我需要使用相机识别文本,并且质量如此低,很难识别。我无法在谷歌上找到解决方案。尝试了很多事情但没有成功。请任何人告诉如何提高相机质量。我在 AR 和 android 领域是全新的。

谢谢 :)

MainActivity.java:

public class MainActivity extends AppCompatActivity {

private CustomArFragment arFragment;
private TextView textView;
private AugmentedImageDatabase aid;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

arFragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
textView = findViewById(R.id.textView);

arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdate);

findViewById(R.id.registeredBtn).setOnClickListener(v -> {
    if(ActivityCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        return;
    }
    registeredImage();
});


}


private void registeredImage() {
File file = new File(getExternalFilesDir(null) + "/db.imgdb");
try {

    FileOutputStream outputStream = new FileOutputStream(file);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.earth);
    aid.addImage("earth",bitmap);
    aid.serialize(outputStream);
    outputStream.close();
    Toast.makeText(this, "image Registered", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
 }
}

private void onUpdate(FrameTime frameTime) {
frame = arFragment.getArSceneView().getArFrame();
Collection<AugmentedImage> images = frame.getUpdatedTrackables(AugmentedImage.class);
for(AugmentedImage image : images){
    if(image.getTrackingMethod() == AugmentedImage.TrackingMethod.FULL_TRACKING){
        if(image.getName().equals("lion")){
            textView.setText("LION is visible");
        }
        else if(image.getName().equals("download")){
            textView.setText("download is visible");
        }
        else{
            textView.setText("Nothing is visible till now");
        }
        Log.d("Value of textView : "," " + textView.getText());
    }
    Log.d("Value of textView1 : "," " + textView.getText());
  }
 }

 public void loadDB(Session session, Config config){
//InputStream dbStream = getResources().openRawResource(R.raw.imagedb);
try {
    File file = new File(getExternalFilesDir(null) + "/db.imgdb");
    FileInputStream dbStream = new FileInputStream(file);
    aid = AugmentedImageDatabase.deserialize(session, dbStream);
    config.setAugmentedImageDatabase(aid);
    session.configure(config);
    Log.d("TotalImages"," :  " + aid.getNumImages());

}catch (IOException e){
    e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)

CustomArFragment.java

public class CustomArFragment extends ArFragment {
@Override
protected Config getSessionConfiguration(Session session){
    getPlaneDiscoveryController().setInstructionView(null);
    Config config = new Config(session);
    config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE);
    MainActivity activity = (MainActivity) getActivity();
    activity.loadDB(session,config);
    this.getArSceneView().setupSession(session);
    return config;
}
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*mon 4

我在另一个问题中添加了一些有关类似主题的信息。但回答你的问题时,请检查默认使用的CameraConfig (在会话上使用getCameraConfig() )。然后,您可以通过getSupportedCameraConfigs()获取您感兴趣的(高 GPU 纹理大小) ,并通过setCameraConfig使用它配置会话。

再次阅读你的问题,如果你将来需要识别图像上的某些文本,你可能想要获得更高的 CPU 图像而不是 GPU 纹理大小。您仍然可以使用 CameraConfig 来检查并选择您最喜欢的,但请记住,较高的 CPU 图像会大大降低性能。您可能想检查我之前提到的问题中的答案。

编辑:使用此代码片段检查正在使用的 CameraConfig 并根据您的需要进行调整:

Session session = new Session(requireActivity());

// ...

Size selectedSize = new Size(0, 0);
CameraConfig selectedCameraConfig = null;

CameraConfigFilter filter = new CameraConfigFilter(session);
List<CameraConfig> cameraConfigsList = session.getSupportedCameraConfigs(filter);
for (CameraConfig currentCameraConfig : cameraConfigsList) {
    Size cpuImageSize = currentCameraConfig.getImageSize();
    Size gpuTextureSize = currentCameraConfig.getTextureSize();
    Log.d("TAG", "CurrentCameraConfig CPU image size:" + cpuImageSize + " GPU texture size:" + gpuTextureSize);

    // Adapt this check to your needs
    if (gpuTextureSize.getWidth() > selectedSize.getWidth()) {
        selectedSize = gpuTextureSize;
        selectedCameraConfig = currentCameraConfig;
    }
}

Log.d("TAG", "Selected CameraConfig CPU image size:" + selectedCameraConfig.getImageSize() + " GPU texture size:" + selectedCameraConfig.getTextureSize());
session.setCameraConfig(selectedCameraConfig);

// ...

// Don't forget to configure the session afterwards
session.configure(config);
Run Code Online (Sandbox Code Playgroud)