为啥CameraX预览在真机上模糊不清,怎么对焦?

Posted

技术标签:

【中文标题】为啥CameraX预览在真机上模糊不清,怎么对焦?【英文标题】:Why is CameraX preview fuzzy and blurry on real device and how to focus?为什么CameraX预览在真机上模糊不清,怎么对焦? 【发布时间】:2020-04-23 03:44:33 【问题描述】:

现在我使用 CameraX 制作了自己的相机。预览工作正常,图像正在保存。然而,预览是模糊的,几乎没有任何关于如何自动对焦甚至手动对焦的文档。因为我使用 Firebase 的机器学习工具包来识别文本,所以我的应用非常清晰非常重要。

   private void startCamera() 

        CameraX.unbindAll();

        Rational aspectRatio = new Rational (textureView.getWidth(), textureView.getHeight());
        Size screen = new Size(textureView.getWidth(), textureView.getHeight()); //size of the screen

        PreviewConfig pConfig = new PreviewConfig.Builder().setTargetAspectRatio(aspectRatio).setTargetResolution(screen).setTargetRotation(Surface.ROTATION_0).build();
        preview = new Preview(pConfig);

        preview.setOnPreviewOutputUpdateListener(
                new Preview.OnPreviewOutputUpdateListener() 
                    //to update the surface texture we  have to destroy it first then re-add it
                    @Override
                    public void onUpdated(Preview.PreviewOutput output)
                        ViewGroup parent = (ViewGroup) textureView.getParent();
                        parent.removeView(textureView);
                        parent.addView(textureView, 0);

                        textureView.setSurfaceTexture(output.getSurfaceTexture());
                        updateTransform();
                    
                );


        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder().setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build();
        imgCap = new ImageCapture(imageCaptureConfig);

        findViewById(R.id.imgCapture).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                cameraImage.setImageResource(R.drawable.cameraon);

                CameraX.unbind(preview);

                loadingDialog.startLoadingDialog();

                file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".png");
                imgCap.takePicture(file, new ImageCapture.OnImageSavedListener() 
                    @Override
                    public void onImageSaved(@NonNull File file) 

                        String filePath = file.getPath();

                        Bitmap bitmap = BitmapFactory.decodeFile(filePath);

                        rotateImage(bitmap);

                    

                    @Override
                    public void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) 
                        String msg = "Image Capture Failed : " + message;
                        Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
                        if(cause != null)
                            cause.printStackTrace();
                        
                    
                );
            

        );


        //bind to lifecycle:
        CameraX.bindToLifecycle((LifecycleOwner)this, preview, imgCap);
    

【问题讨论】:

【参考方案1】:

如果您可以分享一些代码示例,我认为回答这个问题会更有帮助。总的来说,CameraControl 类 (link to source) 有两个相关的 API

ListenableFuture<FocusMeteringResult> startFocusAndMetering(FocusMeteringAction action);

ListenableFuture<Void> cancelFocusAndMetering();

我相信您可以使用带有相关参数的startFocusMetering 来触发中心焦点或面部焦点(如果您有面部坐标)。现在,如果您在每次拍摄之前都调用此函数或在循环中运行此函数以每 500 毫秒调用一次,它可能会解决您的问题。

Github 查找后的一些代码参考:

Example 1

Example 2

Example 3

【讨论】:

您可以尝试将ImageCaptureConfig.Builder 中的setCaptureMode 设置为ImageCapture.CaptureMode.MAX_QUALITY,看看是否有帮助? 或者,如果这没有帮助,请检查我在回答中所说的内容,它使相机聚焦(最终只有单个相机硬件),所以尝试调用startFocusAndMetering(/** arguments *//) --> @ 987654332@ 尝试使用 ListenableFuture startFocusAndMetering(FocusMeteringAction action);但是我收到错误无法解析符号 FocusMeteringResult 更改为 MAX_QUALITY 没有区别 我觉得可能是因为我使用的 CameraX 版本。当前使用 alpha005 和“androidx.camera:camera-view:1.0.0-alpha02”。我不想将其更改为较新的版本,因为我的整个代码都不起作用。大量错误和已弃用的功能

以上是关于为啥CameraX预览在真机上模糊不清,怎么对焦?的主要内容,如果未能解决你的问题,请参考以下文章

kotlin 使用CameraX录制视频点击对焦,保存至相册中

为啥在真机上运行android程序,logcat不显示

CameraX AF-S / MF

小程序图片在真机上不能查看的问题

华为手机拍照无法聚焦

如何判断相机是不是聚焦成功