【问题标题】:Camera2 API Touch to FocusCamera2 API 触控对焦
【发布时间】:2017-01-04 16:46:32
【问题描述】:

我查看了有关触摸对焦的各种问题,但找不到“最佳”或“正确”的解决方案。我把一些答案放在一起并提出了这个实现:

mTextureView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        float positionX = (int) motionEvent.getX();
        float positionY = (int) motionEvent.getY();

        //Build the Rectangle, where the focus should be applied.
        Rect focusRect = calculateFocusRect(motionEvent.getX(), motionEvent.getY());
        MeteringRectangle meteringRectangle = new MeteringRectangle(focusRect, 500);
        final MeteringRectangle[] meterRecArray = { meteringRectangle };

        mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);

        //Set a captureRequest to cancel focus.
        try {
            mCameraCaptureSession.capture(mPreviewCaptureRequestBuilder.build(), mSessionCaptureCallback, mBackgroundHandler);
            mState = STATE_PREVIEW;
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        //Set the focusRegion.
        mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meterRecArray);
        mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meterRecArray);
        mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

        //Restart the Preview, so changes apply.
        try {
            mCameraCaptureSession.abortCaptures();
            mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequestBuilder.build(), mSessionCaptureCallback, mBackgroundHandler);
        } catch (CameraAccessException e) {
            Log.e("Camera", "RepeatingRequest Failed");
            e.printStackTrace();
        }

        return false;
    }
});

构建矩形的管理方式如下:

//Calculate a Rectangle, where the user touched the screen.
private MeteringRectangle[] calculateFocusRect(float x, float y) {
    //Size of the Rectangle.
    int areaSize = 200;

    int left = clamp((int) x - areaSize / 2, 0, mTextureView.getWidth() - areaSize);
    int top = clamp((int) y - areaSize / 2, 0, mTextureView.getHeight() - areaSize);

    RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
    Rect focusRect = new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
    MeteringRectangle meteringRectangle = new MeteringRectangle(focusRect, 1);

    return new MeteringRectangle[] {meteringRectangle};
}

//Clamp the inputs.
private int clamp(int x, int min, int max) {
    if (x > max) {
        return max;
    }
    if (x < min) {
        return min;
    }
    return x;
}

但它似乎并没有正常工作。点击后,相机似乎经常卡在无休止的扫描中。或者它聚焦并在获得焦点后立即跳回之前的焦点,图像最终变得模糊。

知道可能是什么问题吗?

【问题讨论】:

    标签: java android camera android-camera2


    【解决方案1】:

    当你设置焦点区域时,使用下面的代码,它应该可以工作:

            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON);
    

    据我所知,如果您将CONTROL_AF_MODE 设置为CONTROL_AF_MODE_CONTINUOUS_PICTURE,它将继续尝试聚焦。 该模式必须是自动的,但它必须被触发。因此,在此处启动触发器,在您的 mSessionCaptureCallbackonCaptureCompleted 方法中应该如下所示:

    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull 
                                   CaptureRequest request,
                                   @NonNull TotalCaptureResult result) {
        super.onCaptureCompleted(session, request, result);
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                                   CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(),null,null);
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多