如何在Android CameraX中使用手动对焦?

14

我正在尝试在CameraX中手动对焦,就像在Camera2 API中一样。

在Camera2 API中,我使用以下代码:

final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 

captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF); 

captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, mLensFocusDistance);

在Android相机X中,是否可以进行手动对焦?如果可以,如何操作?

提前致谢。


1
你解决了在 CameraX 中如何实现这个功能吗? - Ehsan Khaveh
2
目前没有相机X能够使用 https://groups.google.com/a/android.com/forum/#!searchin/camerax-developers/focus%7Csort:date/camerax-developers/ySfolLe_AS8/hOhHRViaCgAJ - moLand
2个回答

12
使用Camera2Interop.Extender访问低级别的camera2 API,可以在CameraX中使用手动对焦。您需要像这样为预览构建器设置两个额外选项:
void setFocusDistance(ExtendableBuilder<?> builder, float distance) {
    Camera2Interop.Extender extender = new Camera2Interop.Extender(builder);
    extender.setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
    extender.setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE, distance);
}

在构建CameraX预览请求时使用它:

float focusDistance = 0F; // example: infinite focus
Preview.Builder previewBuilder = new Preview.Builder();
setFocusDistance(previewBuilder, focusDistance);
preview = previewBuilder.build();
preview.setSurfaceProvider(viewFinder.getSurfaceProvider());

请注意,您也可以以此方式设置其他camera2 CaptureRequest选项。


以下是如何查找LENS_INFO_MINIMUM_FOCUS_DISTANCE(通常为约10f)的方法:

theCamera = cameraProvider.bindToLifecycle(...
CameraCharacteristics camChars = Camera2CameraInfo
   .extractCameraCharacteristics(theCamera.getCameraInfo());
float discoveredMinFocusDistance = camChars
   .get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
Log.i("dev", "found it! " + discoveredMinFocusDistance);

不幸的是,这仅适用于启动相机时,而不是在其运行时 :/ - Fattie
@Fattie 是的,你现在应该重新启动相机以更新对焦模式 :( - Mikhail
这是荒谬的!哇啊!:O - Fattie

0
你应该将 TouchListener 设置到 textureView 上,然后设置焦点(Kotlin):
private fun setUpTapToFocus() {
    textureView.setOnTouchListener { _, event ->
        if (event.action != MotionEvent.ACTION_UP) {
            return false
        }

        val cameraControl = CameraX.getCameraControl(CameraX.LensFacing.BACK) // you can set it to front                     
        val factory = TextureViewMeteringPointFactory(textureView)
        val point = factory.createPoint(event.x, event.y)
        val action = FocusMeteringAction.Builder.from(point).build()
        cameraControl.startFocusAndMetering(action)
        return true
    }
}

希望这有所帮助。

谢谢您的回答,@Misha。然而,这与点击对焦是相同的。我正在尝试设置对焦级别。 - moLand
是的,从我所读的内容来看,我认为手动对焦意味着通过轻敲来对焦 :) - Misha Akopov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接