在我的项目中,我需要不断地捕捉摄像头流的帧。下面是我使用的当前代码片段。
为了设置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帧中的每一帧,以便进行进一步的图像处理。然而,上述代码似乎有一些问题(我只能访问底层队列中的最新图像)。事实上,我只需要访问每个帧中的一个小补丁(50x50像素),由用户指定。
这样做的原因是,我需要获得采样频率为~60 20的20个连续帧数据。如果我们在每个回调中只能访问单个帧,这似乎真的很难实现,最多只能达到30fps。
任何建议都将非常受欢迎!谢谢!
发布于 2020-07-29 02:04:04
将maxImages设置为20只是意味着队列将允许您同时获取20张图像;这并不意味着onImageAvailable回调将仅在20张图像排队时触发。一旦出现单个图像,该回调就会触发。
大多数相机设备的最高速度是30fps,所以你看到的速度并不令人惊讶。有些摄像头确实有60fps的模式,但你必须明确地切换到(60,60)的CONTROL_AE_TARGET_FPS_RANGE才能获得,而且只有当设备的CONTROL_AE_AVAILABLE_TARGET_FPS_RANGE值包含该范围时才能实现。
60fps也可能是分辨率受限的(如果你想仔细检查,请检查StreamConfigurationMap的最小帧持续时间,以了解哪些分辨率可以支持60fps )。
https://stackoverflow.com/questions/63110826
复制相似问题