Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ARCore中提高预览相机质量_Java_Android_Android Camera_Augmented Reality_Arcore - Fatal编程技术网

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

Java 如何在ARCore中提高预览相机质量,java,android,android-camera,augmented-reality,arcore,Java,Android,Android Camera,Augmented Reality,Arcore,我在android项目中使用ARCore。它有一个活动MainActivity.java和一个CustomArFragment.java 问题是相机的质量很低。如何提高相机预览分辨率。在未来,我需要使用摄像头识别文本,而且质量很低,很难识别。我无法在谷歌上找到解决方案。尝试了许多事情,但没有成功。请告诉我如何提高相机的质量。我是AR和android领域的新手 谢谢:) MainActivity.java: public class MainActivity extends AppCompatAc

我在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();
}
}

我在中添加了一些关于类似主题的信息。但是回答您的问题时,请检查默认使用的内容(在会话中使用)。然后,您可以通过获取感兴趣的内容(高GPU纹理大小),并通过该内容配置会话

再次阅读您的问题,如果您将来需要识别图像上的某些文本,您可能希望获得更高的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);
会话会话=新会话(requirectivity()); // ... 所选大小大小=新大小(0,0); CameraConfig selectedCameraConfig=null; CameraConfigFilter筛选器=新CameraConfigFilter(会话); List cameraConfigsList=会话。getSupportedCameraConfigs(筛选器); 对于(CameraConfig currentCameraConfig:CameraConfigList){ Size cpuImageSize=currentCameraConfig.getImageSize(); Size gpuTextureSize=currentCameraConfig.getTextureSize(); Log.d(“标记”,“CurrentCameraConfig CPU图像大小:”+cpuImageSize+“GPU纹理大小:”+gpuTextureSize); //根据您的需要调整此支票 如果(gpuTextureSize.getWidth()>selectedSize.getWidth()){ selectedSize=gpuTextureSize; selectedCameraConfig=currentCameraConfig; } } Log.d(“标记”,“选定的CameraConfig CPU图像大小:”+selectedCameraConfig.getImageSize()+“GPU纹理大小:”+selectedCameraConfig.getTextureSize()); session.setCameraConfig(selectedCameraConfig); // ... //以后不要忘记配置会话 配置(config);
Hi@Pau Guillamon,谢谢你的回答。我在CustomArFragment.java中添加了以下行:CameraConfigFilter filter=new CameraConfigFilter(会话);CameraConfig[]cameraConfigList=session.getSupportedCameraConfigs(filter.toArray)(新的CameraConfig[0]);session.setCameraConfig(cameraConfigList[0]);但它不起作用。仍然模糊。请迭代从getSupportedCameraConfigs()获得的列表,不要执行toArray(新建CameraConfig[0]);,并选择一个符合您的要求,也许搜索更高的GPU纹理图像。为了更好地理解这一点,请在日志中列出所有CameraConfig,以便您可以查看设备上可用的内容,稍后您可以根据获得的值决定要执行的操作。无需toArray(new CameraConfig[0])向我提供错误信息。因此,我将该行更改为:List cameraConfigList=session.getSupportedCameraConfigs(filter);当我迭代CameraConfigList时,我得到了以下3个值:1)com.google.ar.core。CameraConfig@fcb2ebd,2)com.google.ar.core。CameraConfig@4eeacb2 ,3)com.google.ar.core。CameraConfig@5e9f403I发现了问题,但我不知道为什么会发生……无论我设置了什么样的CameraConfig,它都没有设置。CameraConfigFilter筛选器=新CameraConfigFilter(会话);List cameraConfigList=session.getSupportedCameraConfigs(过滤器);setCameraConfig(cameraConfigList.get(i));(0
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);