【问题标题】: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);
    }

【问题讨论】:

    标签: android android-camera android-camera2 android-camerax


    【解决方案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”。我不想将其更改为较新的版本,因为我的整个代码都不起作用。大量错误和已弃用的功能
    猜你喜欢
    • 2020-07-29
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多