android - 如何使用 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。
任何建议都会非常受欢迎!谢谢!
解决方案
将 maxImages 设置为 20 只是意味着队列将允许您同时获取 20 个图像;这并不意味着 onImageAvailable 回调只会在 20 个图像排队时触发。只要存在单个图像,回调就会触发。
大多数相机设备最高运行速度为 30fps,因此您所看到的速度也就不足为奇了。有些相机确实有 60fps 模式,但您必须显式切换到 (60,60) 的 CONTROL_AE_TARGET_FPS_RANGE 才能获得该模式,并且只有当设备的 CONTROL_AE_AVAILABLE_TARGET_FPS_RANGE 值包含该范围时。
60fps 也可能受分辨率限制(如果您想仔细检查,请查看 StreamConfigurationMap 以了解最短帧持续时间以找到可以支持 60fps 的分辨率)。
推荐阅读
- python - 如何更新 Flask-SQLAlchemy 关联表?
- r - 相交两个排序列表
- terraform - Terraform 兼容性错误 - 未使用 count.index
- apache-kafka - 无法使用 kafka 流将 AVRO 对象写入另一个主题
- java - 如何将 gif 图像显示为表盘磨损操作系统
- django - 在 django 模板中显示单个图像字段不起作用?
- r - 使用 R 中的 formattable() 格式化表格中的文本
- computer-science - 计算机以 32 位为一组表示信息
- python - 约束 QGraphicsItems 组的成员在一个方向上共享彼此的动作
- sql - 没有子查询的表的多次传递