无法让Camera2 API touch专注于工作

问题描述 投票:0回答:1

我无法专注于在Camera2 API上正常工作。在触摸时,我似乎只关注了一秒钟然后变得非常模糊。这款手机是Nexus 5X。这是我的焦点触摸代码。

private void refocus(MotionEvent event, View view){

    //Handler for autofocus callback
    CameraCaptureSession.CaptureCallback captureCallbackHandler = new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
            super.onCaptureCompleted(session, request, result);

            if (request.getTag() == "FOCUS_TAG") {
                //the focus trigger is complete -
                //resume repeating (preview surface will get frames), clear AF trigger
                previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER, null);
                try{
                    mSession.setRepeatingRequest(previewRequest.build(), null, null);}
                catch (Exception e){

                }
            }
        }

        @Override
        public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
            super.onCaptureFailed(session, request, failure);
            Log.e(TAG, "Manual AF failure: " + failure); }
    };

    try {
        final Rect sensorArraySize = manager.getCameraCharacteristics(mCameraDevice.getId()).get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);

        //Find area size
        int x = (int)(event.getX()/(float)view.getWidth() * (float)sensorArraySize.width());
        int y = (int)(event.getY()/(float)view.getHeight() * (float)sensorArraySize.height());
        final int halfTouchWidth  = 150; //(int)motionEvent.getTouchMajor(); //TODO: this doesn't represent actual touch size in pixel. Values range in [3, 10]...
        final int halfTouchHeight = 150; //(int)motionEvent.getTouchMinor();
        MeteringRectangle rect = new MeteringRectangle(Math.max(x - halfTouchWidth,  0),
                Math.max(y - halfTouchHeight, 0),
                halfTouchWidth  * 2,
                halfTouchHeight * 2,
                MeteringRectangle.METERING_WEIGHT_MAX - 1);
        mSession.stopRepeating();
        transparentLayer.drawFeedback(rect);

        //Cancel requests
        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
        previewRequest.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
        mSession.capture(previewRequest.build(), captureCallbackHandler, null);

        //Now add a new AF trigger with focus region
        if (isMeteringAreaAFSupported()) {
            previewRequest.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{rect});
        }
        previewRequest.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
        previewRequest.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
        previewRequest.setTag("FOCUS_TAG"); //we'll capture this later for resuming the preview

        //then we ask for a single request (not repeating!)
        mSession.capture(previewRequest.build(), captureCallbackHandler, null);

    }catch (Exception e){
        e.printStackTrace();
    }

}

还有另一个辅助函数:

private boolean isMeteringAreaAFSupported() {
    try {
        return manager.getCameraCharacteristics(mCameraDevice.getId()).get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) >= 1;
    }catch (Exception e){
        return false;
    }
}

什么原因可能是焦点工作一小段时间,然后重新启动,或完全模糊?我找不到任何有用的解决方案。

谢谢大家!

android android-camera android-camera2 nexus-5x
1个回答
0
投票

我会尝试在onCaptureCompleted中将AF_TRIGGER设置为IDLE - 完全删除它并不完全明确。

除此之外,我不清楚你是如何从屏幕触摸坐标转换到计量区域的相机active array coordinates。看起来你假设坐标是相同的,这是不正确的。这不应该导致模糊,但会使你专注于一个不同于你想象的区域。

您需要正确缩放x和y(基于当前使用数字变焦时定义可见视野的crop region和活动数组矩形)

© www.soinside.com 2019 - 2024. All rights reserved.