问题
我想做一些类似于在 Camera2Basic 上所做的事情样本,即:
- 使用
TextureView
从相机预览图像
- 使用
ImageReader
处理来自相机的图像
2
有一些不同:
- 我只对要处理的图像的灰色 channel (亮度)感兴趣。它们的尺寸应该在 1000 x 1000 像素左右(而不是可用的最高分辨率)
- 当要处理的图像可用时,将调用通用的
process(Image)
方法,而不是将图像保存到磁盘。这个方法做了什么超出了这个问题的范围,但是它需要大约 50 毫秒才能返回 - 应该定期处理图像数据(大约 10 FPS,但速度并不重要)而不是最终处理
如何使用 Camera2
API 完成此操作?
观察
- 我改变了创建
ImageReader
实例的方式,选择更小的尺寸和不同的格式(YUV_420_888
而不是JPEG
).Y
平面将被访问以获得亮度数据。是否有更有效的格式(因为我只是忽略了U
和V
平面)? TextureView
和ImageReader
表面都应定期填充,但填充速率不同。由于CameraCaptureSession
上只能有一个重复的CameraRequest
(可以通过调用setRepeatingRequest()
设置),我是否应该手动调用capture()
定期(例如,使用预览请求调用setRepeatingRequest()
并使用处理请求定期调用capture()
)?- 是否可以通过发送重新处理请求从预览图像中获取待处理图像来提高性能?如果可以,我该怎么做?
最佳答案
我不知道如何帮助你处理灰色 channel ,我建议你尝试研究YUV格式图像的平面并尝试从那里获取它。
同时尝试检查您可以在 CaptureBuilder 中设置的所有值,也许您可以使用 SENSOR_TEST_PATTERN_MODE、COLOR_CORRECTION_MODE 或 BLACK_LEVEL_LOCK 实现您的目标。您可以在android documentation中查看所有信息
关于只处理每 10 帧中的一帧,只需使用简单的 process() 方法丢弃这些帧:
if (result.getFrameNumber() % 10 != 0) return;
最后记得关闭您在 ImageReader OnImageAvailableListener 中收到的所有图像,以避免内存泄漏并提高性能 :P
@Override
public void onImageAvailable(ImageReader imageReader) {
Image image = null;
try {
image = imageReader.acquireNextImage();
//Do whatever you want with your Image
if (image != null) {
image.close();
}
} catch (IllegalStateException iae) {
if (image != null) {
image.close();
}
}
}
希望它能帮到你,如果我能在其他方面帮助你,请告诉我!
关于android - 使用 Camera2 预览和处理相机数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39481821/