如何使用Android Camera2 API捕获单个图像?

安德鲁·马歇尔

我正在使用Android Camera2 API捕获和处理图像。图像处理是对成功捕获的响应。我遇到的问题是相机捕获了2张图像,我无法更改Camera2Basic示例中的代码以确保仅捕获单个图像。可以通过向该ImageSaver.run()方法中方法添加日志记录代码来证明该问题Camera2BasicFragment.java

public void run() {
    Log.d("Camera2", "Saving image");
    ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
    ...
}

编辑-经过进一步调查后,问题似乎出在该示例的实现中,而不是API的基本要求。在示例中,以下代码跟踪摄像机的状态变化,

 private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {
                // We have nothing to do when the camera preview is working normally.
                break;
            }
            case STATE_WAITING_LOCK: {
                int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                        CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
                    // CONTROL_AE_STATE can be null on some devices
                    Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                    if (aeState == null ||
                            aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                        mState = STATE_WAITING_NON_PRECAPTURE;
                        /** CAPTURE 1 */
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            }
            case STATE_WAITING_PRECAPTURE: {
                ...
                break;
            }
            case STATE_WAITING_NON_PRECAPTURE: {
                // CONTROL_AE_STATE can be null on some devices
                Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
                    mState = STATE_PICTURE_TAKEN;
                    /** CAPTURE 2 **/
                    captureStillPicture();
                }
                break;
            }
        }
    }

我已经验证了两次调用都会captureStillPicture导致生成图像并进行处理。我不太确定正确的状态转换应该是什么。

我正在使用Motorola Nexus 6

布迪斯

从您的问题开始,我开始阅读并深入研究它,我相信这就是它的工作方式。根据文档(链接)说:

每个请求将产生一个CaptureResult并为一个或多个目标Surface产生新的帧

请注意,它说“ frame s ”。复数形式。

说,我相信您应该只考虑onCaptureCompleted回调内部的最后一帧

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android Camera2捕获歪斜的图像

来自分类Dev

使用Android Camera2 API在后台捕获视频

来自分类Dev

使用Android Camera2 API快速捕获闪光/不闪光图像

来自分类Dev

Android Camera2 空预览图像

来自分类Dev

Android Camera2 API和EXIF

来自分类Dev

使用camera2 API捕获图片而不进行预览

来自分类Dev

Android Camera2 API - 覆盖旧图像

来自分类Dev

Android camera2捕获连拍太慢

来自分类Dev

Android Camera2图像处理:什么是几何校正?

来自分类Dev

Android Camera2 同步图像和元数据

来自分类Dev

Android API 21+ Camera2 API

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

Android Camera2 API聚焦距离校准

来自分类Dev

Android Camera2 API-检测何时关注

来自分类Dev

在Android Vision API中切换到Camera2

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

Android Camera2 API 中的等效 canDisableShutterSound 方法

来自分类Dev

无法使用 Camera2 Api 启用 Flash

来自分类Dev

使用 Camera2 API 设置相机变焦

来自分类Dev

Android Camera2:如何使用SENSOR_BLACK_LEVEL_PATTERN API?

来自分类Dev

使用Android L和Camera2 API的相机预览图像数据处理

来自分类Dev

Android L-使用Camera2 API自动对焦拍摄闪光灯图像

来自分类Dev

我应该为Android使用Camera2还是Camera API?

来自分类Dev

如何使用camera2获取2个输出捕获会话

来自分类Dev

来自Android camera2 API的图像数据在Galaxy S5上翻转并压缩

来自分类Dev

Android JavaCV + Camera2

来自分类Dev

Android Camera2 getPreviewFrame

来自分类Dev

Android Camera2示例

来自分类Dev

使用Android Camera2设置视频捕获中的亮度/对比度