实时图像处理Android camera2 api

时间:2016-02-04 20:13:30

标签: android image-processing renderscript android-camera2

我对android很新。我尝试使用新的Android Camera2 api来构建实时图像处理应用程序。我的应用程序也需要保持良好的FPS率。根据一些例子,我设法在ImageReader类提供的onImageAvailable(ImageReader reader)方法中进行图像处理。但是通过这样做,我只能设法获得5-7 FPS左右的帧速率。

我已经看到建议使用RenderScript与Android camera2 api进行YUV处理。使用RenderScript会获得更高的FPS费率吗? 如果是这样,请有人指导我如何实现这一点,因为我是新手,我很难掌握Allocation和RenderScript的概念。提前致谢。

2 个答案:

答案 0 :(得分:1)

我不知道您想要执行什么类型的图像处理。但是如果您只对图像的强度感兴趣(即灰度值信息),则不需要对YUV数据阵列进行任何转换(例如转换为jpeg)。对于由n个像素组成的图像,强度信息由YUV数据阵列的前n个字节给出。所以,只需从YUV数据数组中删除这些字节:

 byte[] intensity = new byte[width*height];
 intensity = Arrays.copyOfRange(data, 0, width*height);

答案 1 :(得分:1)

理论上,您可以通过此调用获得可用的fps范围:

characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

并在此处设置所需的fps范围:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);

因此原则上,您应该选择具有相同下限和上限的范围,并且应该保持帧速率不变。

但是,在具有LEGACY配置文件的设备上,我测试过的设备都没能在1080p(S5,Z3 Compact,华为Mate S和HTC One M9)上达到30fps。我能够实现这一目标的唯一方法是使用一个设备(LG G4),结果是有一个完整的配置文件。

如果您打算在onImageAvailable回调中使用它,Renderscript将不会在这里购买任何东西。看起来在这一点上获取图像是LEGACY设备的瓶颈,因为新的camera2 API只是包装旧的,并且可能会产生如此大的开销,以至于回调不再以30fps发生。因此,如果要使用Renderscript,您需要创建一个Surface并找到另一种方法来抓取它的帧。

以下是踢球者......如果你回过头不推荐使用的API,我几乎可以保证你想要的任何分辨率都能达到30fps。至少这是我在我测试的所有设备上找到的......