Camera2 API 自动对焦与三星 S5

2023-11-24

我正在 Samsung S5 上使用新的 Camera2 API。该设备报告的支持的硬件级别是LEGACY,这很好。

但是,我似乎无法自动对焦该设备。触发自动对焦的请求如下所示:

previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
state = STATE_PREVIEW;
try {
  captureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, backgroundHandler);
} catch (CameraAccessException e) {
  e.printStackTrace();
}

请求发送后,请求的结果总是CONTROL_AF_STATE_ACTIVE_SCAN偶尔CONTROL_AF_STATE_NOT_FOCUSED_LOCKED.

奇怪的是,当状态CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,自动对焦返回到CONTROL_AF_STATE_ACTIVE_SCAN状态一段时间然后回到CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,导致无限聚焦循环。根据文档,当状态为CONTROL_AF_STATE_NOT_FOCUSED_LOCKED...

镜头将保持静止,直到 AF 模式 (android.control.afMode) 更改或新的 AF 触发器发送到相机设备 (android.control.afTrigger)。

我想知道这种差异是否是因为硬件水平LEGACY我应该重新使用已弃用的 Camera API,但这对于自动对焦等如此流行的功能来说似乎很疯狂。

是否有任何建议如何处理正在报告的设备LEGACY?


我分枝形式谷歌的 Camera2Basic 示例并将其更改为使用CaptureRequest.CONTROL_AF_MODE_AUTO代替CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE

您可以从 git 获取该项目并测试它 -https://github.com/pinhassi/android-Camera2Basic

或者只是将其添加到Camera2BasicFragment:

private static final long LOCK_FOCUS_DELAY_ON_FOCUSED = 5000;
private static final long LOCK_FOCUS_DELAY_ON_UNFOCUSED = 1000;

private Integer mLastAfState = null;
private Handler mUiHandler = new Handler(); // UI handler
private Runnable mLockAutoFocusRunnable = new Runnable() {

    @Override
    public void run() {
        lockAutoFocus();
    }
};


public void lockAutoFocus() {
    try {
        // This is how to tell the camera to lock focus.
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
        CaptureRequest captureRequest = mPreviewRequestBuilder.build();
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, null); // prevent CONTROL_AF_TRIGGER_START from calling over and over again
        mCaptureSession.capture(captureRequest, mCaptureCallback, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}


/**
 *
 * @return
 */
private float getMinimumFocusDistance() {
    if (mCameraId == null)
        return 0;

    Float minimumLens = null;
    try {
        CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        CameraCharacteristics c = manager.getCameraCharacteristics(mCameraId);
        minimumLens = c.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    } catch (Exception e) {
        Log.e(TAG, "isHardwareLevelSupported Error", e);
    }
    if (minimumLens != null)
        return minimumLens;
    return 0;
}

/**
 *
 * @return
 */
private boolean isAutoFocusSupported() {
    return  isHardwareLevelSupported(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) || getMinimumFocusDistance() > 0;
}

// Returns true if the device supports the required hardware level, or better.
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private boolean isHardwareLevelSupported(int requiredLevel) {
    boolean res = false;
    if (mCameraId == null)
        return res;
    try {
        CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(mCameraId);

        int deviceLevel = cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
        switch (deviceLevel) {
            case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3:
                Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_3");
                break;
            case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
                Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_FULL");
                break;
            case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
                Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY");
                break;
            case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
                Log.d(TAG, "Camera support level: INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED");
                break;
            default:
                Log.d(TAG, "Unknown INFO_SUPPORTED_HARDWARE_LEVEL: " + deviceLevel);
                break;
        }


        if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
            res = requiredLevel == deviceLevel;
        } else {
            // deviceLevel is not LEGACY, can use numerical sort
            res = requiredLevel <= deviceLevel;
        }

    } catch (Exception e) {
        Log.e(TAG, "isHardwareLevelSupported Error", e);
    }
    return res;
}

然后,添加到STATE_PREVIEW block:

        case STATE_PREVIEW: {

            // We have nothing to do when the camera preview is working normally.
            // TODO: handle auto focus
            Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
            if (afState != null && !afState.equals(mLastAfState)) {
                switch (afState) {
                    case CaptureResult.CONTROL_AF_STATE_INACTIVE:
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_INACTIVE");
                        lockAutoFocus();
                        break;
                    case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN:
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN");
                        break;
                    case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED:
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED");
                        mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
                        mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_FOCUSED);
                        break;
                    case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
                        mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
                        mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_UNFOCUSED);
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED");
                        break;
                    case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
                        mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
                        //mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_UNFOCUSED);
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED");
                        break;
                    case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN:
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN");
                        break;
                    case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED:
                        mUiHandler.removeCallbacks(mLockAutoFocusRunnable);
                        //mUiHandler.postDelayed(mLockAutoFocusRunnable, LOCK_FOCUS_DELAY_ON_FOCUSED);
                        Log.d(TAG, "CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED");
                        break;
                }
            }
            mLastAfState = afState;
            break;
        }

并替换所有出现的:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

With:

if (isAutoFocusSupported())
                                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                        CaptureRequest.CONTROL_AF_MODE_AUTO);
                            else
                                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Camera2 API 自动对焦与三星 S5 的相关文章

随机推荐

  • 使用 OpenCV 计算黑色像素

    我工作于opencv 2 4 0 and C 我正在尝试做一个练习 要求我加载 RGB 图像 将其转换为灰度并保存新图像 下一步是将灰度图像转换为二值图像并存储该图像 我的工作就这么多 我的问题是计算二进制图像中黑色像素的数量 到目前为止
  • .rodata 部分加载到可执行页面中

    所以出于好奇 我今天尝试运行这段代码 用gcc m32 1 c int main void EB is the opcode for jmp rel 8 FE is hex for 2 So this is essentially an i
  • 查找枚举值中设置的最高标志

    我使用带有 flags 属性的枚举作为跟踪状态的方式 示例如下 Created 1 Completed 2 Dispatched 4 在不写任何过于严格的内容的情况下 如果检查这个 则执行那个 如果检查那个 则执行此操作 我希望能够找到已设
  • 使用 C# 以编程方式打开超级按钮栏、电源栏和开始菜单

    如何以编程方式打开 魅力酒吧 电源选项 开始菜单 在 Windows 8 中 我希望能够从我的 C 应用程序中打开它们 找不到我需要的文档 Thanks 我敢打赌发送 Windows 密钥 以及其他密钥 根据需要 就足够了 这是关于如何通过
  • 如何更改默认 LLDB 设置

    有时我需要使用 LLDB 打印长字符串 默认 LLDB 设置会修剪打印的字符串 我必须输入以下内容 set set target max string summary length 10000 下次运行时 此设置不会保留 有没有办法设置它以
  • Tinymce html5占位符通过从textarea读取属性

    对于标准文本区域我使用这个plugin创建一个占位符 我如何扩展tinymce 以便它也以这种方式工作 例如 默认值是从 textarea 属性中读取的 然后在用户聚焦于 iframe 时清除 与 CKEditor 类似 http alfo
  • 传递的数组会丢失除第一个元素之外的所有元素

    我有一个奇怪的问题 我最近将我的应用程序从本地 xampp 安装迁移到 SUSE Enterprise Server 11 一切正常 但这一件事让我发疯 我找不到解决方案 使用以下语法通过 GET 或 POST 传递数组时 search d
  • 单引号字符串字符串插值

    我正在尝试使用 Rails 在 ActionMailer 中设置电子邮件地址 在硬编码之前 但我们现在希望将它们设为 ENV 变量 这样我们就不需要每次电子邮件更改时都修改代码 目前的定义方式如下 from Name of Person l
  • cmake:读取并编译动态生成的 cpp 文件列表

    我有一个自定义工具 可以处理给定的 IDL 文件列表并生成许多 cpp 和 h 文件作为输出 我想将这些文件添加到要在我的 CMakeLists 中编译的内容列表中 并对这些文件对 IDL 的依赖关系进行建模 为了简单起见 我将声明对任何
  • 在 JSP 中启用 JavaServerPages 标准标记库 (JSTL)

    我觉得我错过了一些东西 从表面上看 JSP 开箱即用 支持标签 如这个问题的答案显示 这个人问了一个纯 jsp 问题并得到了涉及标签的答案 但是如果我尝试运行给定的代码
  • 如何在角度材料日期选择器上添加蒙版

    我最近开始使用角度材料来构建角度形式 其中我需要使用角度材料日期选择器 但无法在输入元素上添加任何掩码 我希望用户只能输入数字并在输入时将其格式化为日期格式 MM DD YYYY html div class example contain
  • 从文本文件中删除空行[重复]

    这个问题在这里已经有答案了 我有一个文本文件 其中有一些空行 意思是上面没有任何东西并且只是占用空间的线条 它看起来像这样 The quick brown fox jumped over the lazy dog 我需要它看起来像这样 Th
  • C++ 如何避免浮点运算错误[重复]

    这个问题在这里已经有答案了 我正在编写一个以浮点数递增的循环 但我遇到了以下示例所示的浮点算术问题 for float value 2 0 value lt 2 0 value 0 2 std cout lt lt value lt lt
  • 使用中央数据库在多用户环境中更新实体框架数据

    让我解释一下标题 我在应用程序中使用实体框架代码优先 测试应用程序 出于调试目的TestApp连接到 SQLExpress 数据库 中央数据库服务器 为了简单起见 数据库包含一张表 Products TestApp 在数据网格中显示数据库中
  • 创建文件时出现 System.UnauthorizedAccessException

    我试图编写代码以便记录错误消息 我试图用日期命名该文件 并希望每天创建一个新的日志文件 经过一番查看后 我得到了以下代码 class ErrorLog public void WriteErrorToFile string error ht
  • 为什么在字符指针上使用 strcat 会崩溃? [复制]

    这个问题在这里已经有答案了 为什么这段代码会崩溃 正在使用strcat字符指针非法 include
  • 更新 iframe、历史记录和 URL。然后使其与后退按钮一起使用

    当点击浏览器上的后退按钮时 我在更新 URL 时遇到问题 我正在 Firefox 上进行测试 更新我使用的 iframe 的 src 属性后replaceState更新历史记录 如果我在此之后点击后退按钮 iframe 将返回到上一页 但
  • opencart php自定义页面不使用“信息”功能

    我想在 opencart 中创建一个自定义页面 我知道我可以使用管理区域在信息部分放置一个自定义页面 但是我想要的是一个指向其他几个页面的控制器 我不完全明白如何做到这一点 在 codeigniter 中 您将创建一个控制器和一个视图 如果
  • Python:更改 Windows 7 主音量

    我希望能够在 Python 中控制主音量 不是针对应用程序 而是针对当前活动扬声器 这似乎是一个棘手的话题 我尝试用 C 来做 但我什至无法让它在那里工作 有办法做到这一点吗 Windows 7 x64 请注意 这个问题之前没有得到回答 因
  • Camera2 API 自动对焦与三星 S5

    我正在 Samsung S5 上使用新的 Camera2 API 该设备报告的支持的硬件级别是LEGACY 这很好 但是 我似乎无法自动对焦该设备 触发自动对焦的请求如下所示 previewRequestBuilder set Captur