【问题标题】:Manual Focus using android camera2 API使用 android camera2 API 手动对焦
【发布时间】:2017-03-20 10:34:21
【问题描述】:

我想为自己开发一个Android Camera App(有兴趣的可以分享一下),可以在视频录制时手动对焦。

我在 google 示例 Camera2 app 中添加了一个 SeekBar,但我找不到实现手动对焦的方法。

我找到了Manual focus in camera2, android,但它不适用于我的 LG G4。 库存相机应用程序几乎是完美的,因为它不允许在视频模式下手动对焦。

你们中有人有想法吗?

编辑:这里是 SeekBar 监听器的代码:

@Override
public void onStopTrackingTouch(SeekBar seekBar) {}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    float num = (((float)progress) * minimumLens / 100);
    mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, num);
}

【问题讨论】:

    标签: android api focus android-camera2 lg


    【解决方案1】:

    您需要检查您正在运行的设备是否真的支持 camera2 中的手动控制。

    关键是摄像头设备的available capabilities是否列出了MANUAL_SENSOR。如果是这样,那么您可以通过将autofocus mode 设置为OFF,然后将lens focus distance 设置为您想要的值来控制镜头。如果 MANUAL_SENSOR 未列出,则设备很可能不支持手动对焦控制(不幸的是,一些制造商在其默认相机应用程序中使用私有接口来实现手动对焦控制)。

    这些都应该进入您用来控制预览的重复请求。

    【讨论】:

    • 有一个 APK (play.google.com/store/apps/…) 可以知道设备是否支持 Camera2 API 并且 LG G4 完全支持并且 MANUAL_SENSOR 已列出。我试图将自动对焦模式设置为关闭,但是当我将镜头焦距设置为 SeekBar 的值时,它什么也没做。我编辑了我的主要帖子以添加我拥有的代码。
    • 更新预览生成器值后,您在哪里调用 mSession.setRepeatingRequest(mPreviewBuilder.build())?
    • 我其实不会调用它,但是当我在onProgressChanged()尝试时它可以工作,非常感谢!
    • 是的 - Builder.set 调用只会更新您请求中的一个字段。您仍然必须将其发送到相机以实际更改任何内容,或者通过 capture()(使用这些设置捕获单个图像)或通过 setRepeatingRequest(用于连续捕获)。
    【解决方案2】:

    Eddy Talvala 在他的回答中正确描述了所有内容,但如果您仍然觉得复杂,这里有一个代码 sn-p 将焦点设置为无穷大(其值为 0f):

    CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
    int[] capabilities = characteristics
        .get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
    
    boolean isManualFocusSupported = IntStream.of(capabilities)
        .anyMatch(x -> x == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR);
    
    if (isManualFocusSupported) {
        previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
        previewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0f);
    }
    

    【讨论】:

    • 它工作正常,请告诉我手动对焦距离捕获图像的代码。
    • 不幸的是,这在相机实际运行时不起作用:/
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多