关于Android Camera2 API 的自动对焦的坑

https://www.jianshu.com/p/280e5301b7b9

正常:
2019-12-16 13:28:56.048 6880-6880/org.cv.usingcamera D/Camera2Activity: start lockFocusing
2019-12-16 13:28:56.081 6880-7032/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:28:56.082 6880-7032/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:28:56.156 6880-7032/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:28:56.156 6880-7032/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:28:56.202 6880-7032/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:28:56.202 6880-7032/org.cv.usingcamera V/Camera2Activity: afState = 5
2019-12-16 13:28:56.202 6880-7032/org.cv.usingcamera V/Camera2Activity: before captureStillPicture() 2 
2019-12-16 13:28:56.202 6880-7032/org.cv.usingcamera V/Camera2Activity: in captureStillPicture() mState = 4
2019-12-16 13:28:56.206 6880-7032/org.cv.usingcamera E/Camera2Activity: cf.orientation:1
2019-12-16 13:28:56.206 6880-7032/org.cv.usingcamera E/Camera2Activity: cf.orientation:1 rotation:0 landscape2
2019-12-16 13:28:56.206 6880-7032/org.cv.usingcamera E/Camera2Activity: rotation:0ORIENTATIONS.get:90mSensorOrientation:90f:90
2019-12-16 13:28:56.210 6880-7032/org.cv.usingcamera D/Camera2Activity: start capturing
2019-12-16 13:28:56.260 6880-7032/org.cv.usingcamera V/Camera2Activity: mState = 4
2019-12-16 13:28:56.389 6880-7032/org.cv.usingcamera V/Camera2Activity: finish saving /storage/emulated/0/usingCamera/20191216132856(20318069).jpg

异常:
2019-12-16 13:37:27.907 6880-6880/org.cv.usingcamera D/Camera2Activity: start lockFocusing
2019-12-16 13:37:27.947 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:27.948 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.027 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.028 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.090 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.091 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.147 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.147 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.207 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.208 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.256 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.257 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.320 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.321 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.384 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.385 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.441 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.442 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.503 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.503 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.560 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.561 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.629 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.631 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.673 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.674 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 1
2019-12-16 13:37:28.756 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.757 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:28.798 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.798 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:28.861 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.862 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:28.932 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:28.933 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.000 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.001 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.047 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.048 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.123 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.123 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.163 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.164 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.225 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.226 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.296 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.297 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.344 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.345 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.417 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.419 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.475 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.476 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.544 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.545 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.577 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.577 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.649 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.652 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.703 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.704 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.766 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.766 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.832 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.833 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.896 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.897 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:29.950 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
2019-12-16 13:37:29.950 6880-7868/org.cv.usingcamera V/Camera2Activity: afState = 2
2019-12-16 13:37:30.017 6880-7868/org.cv.usingcamera V/Camera2Activity: mState = 1
 

Android Camera2 API中,自动对焦的坐标是从[-1000, 1000]的范围内进行定义的,其中(0, 0)表示图像的中心。 如果您需要将屏幕上的触摸坐标转换为适合于自动对焦的坐标,可以使用以下代码: ```java private MeteringRectangle[] getFocusAreaRect(float x, float y) { 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); return new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; } private int clamp(int value, int min, int max) { return Math.max(min, Math.min(max, value)); } ``` 这个方法将返回一个MeteringRectangle数组,其中包含一个矩形区域,该区域是在屏幕上给定的x和y坐标周围的一个固定大小。在这个例子中,我们使用了一个200x200像素的矩形区域。您可以根据需要更改这个值。 接下来,您可以将这个MeteringRectangle数组传递给CameraCaptureSession的setRepeatingRequest方法,就可以开始自动对焦了。 ```java RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); MeteringRectangle[] meteringRectangle = new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; CameraCaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); builder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangle); builder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangle); cameraCaptureSession.setRepeatingRequest(builder.build(), null, backgroundHandler); ``` 这个代码片段将启动自动对焦。请注意,我们使用了CONTROL_AF_TRIGGER_START触发器来开始自动对焦。在对焦完成后,您可以使用相同的代码将触发器设置为CONTROL_AF_TRIGGER_CANCEL,以停止自动对焦。 希望这可以帮助您解决您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值