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