首页 > 解决方案 > 如何使用 Android Camera2 API 访问 ImageReader 队列中的所有图像

问题描述

在我的项目中,我需要连续捕捉摄像机流的帧。这是我使用的当前代码片段。

为了设置 ImageReader,我将其设置maxImages为 20。假设每次触发回调时,ImageReader 队列中都会有 20 帧。

imageReader = ImageReader.newInstance(
            optimumSize.getWidth(),
            optimumSize.getHeight(),
            ImageFormat.YUV_420_888,
            20
);

然后访问这 20 帧的每个图像。我使用了以下代码段。

imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = reader.acquireNextImage();
        while (image != null) {
            // some processing here.....
            image.close();
            image = reader.acquireNextImage();
        }
        if (image != null) {
            image.close();
        }
    }
}, processingHandler);

这里的主要障碍是能够在回调中访问 20 帧中的每一帧,以进行进一步的图像处理。然而,上述代码似乎有一些问题(我只能访问底层队列中的最新图像)。事实上,我只需要访问用户指定的每一帧中的一个小补丁(50 x 50 像素)。

这样做的原因是我需要获取采样频率为 ~60Hz 的 20 个连续帧数据。如果我们只能在每个回调中访问单帧,这似乎很难实现,最多只能达到 30fps。

任何建议都会非常受欢迎!谢谢!

标签: androidandroid-camera2image-reader

解决方案


将 maxImages 设置为 20 只是意味着队列将允许您同时获取 20 个图像;这并不意味着 onImageAvailable 回调只会在 20 个图像排队时触发。只要存在单个图像,回调就会触发。

大多数相机设备最高运行速度为 30fps,因此您所看到的速度也就不足为奇了。有些相机确实有 60fps 模式,但您必须显式切换到 (60,60) 的 CONTROL_AE_TARGET_FPS_RANGE 才能获得该模式,并且只有当设备的 CONTROL_AE_AVAILABLE_TARGET_FPS_RANGE 值包含该范围时。

60fps 也可能受分辨率限制(如果您想仔细检查,请查看 StreamConfigurationMap 以了解最短帧持续时间以找到可以支持 60fps 的分辨率)。


推荐阅读