实时图像处理 Android camera2 api

4
我对安卓开发非常陌生,我正在尝试使用新的Android Camera2 API构建实时图像处理应用程序。我的应用程序需要保持良好的FPS速率。通过参考一些示例代码,我成功地在ImageReader类的onImageAvailable(ImageReader reader)方法中实现了图像处理。但是这样做,我只能获得约5-7 FPS的帧速率。

我发现建议使用RenderScript来进行YUV处理与Android Camera2 API配合使用。使用RenderScript会提高FPS吗? 如果有人能够指导我如何实现这一点就好了,因为我对Allocation和RenderScript的概念不是很熟悉。谢谢。

2个回答

1
我不知道您想进行什么类型的图像处理。但是如果您只对图像的亮度(即灰度信息)感兴趣,您不需要将YUV数据数组转换为JPEG格式。对于由n个像素组成的图像,其强度信息由YUV数据数组的前n个字节给出。因此,只需从YUV数据数组中剪切这些字节即可:
 byte[] intensity = new byte[width*height];
 intensity = Arrays.copyOfRange(data, 0, width*height);

谢谢您的回复。我只对图像的强度感兴趣,并且正在使用您提到的方法。但是,我目前正在使用android.media.ImageReader。我的应用程序最终会出现低FPS速率约为5-7。我想知道是否通过使用RenderScript,我能否实现更高的FPS速率。 - Hiddenkeg
我还没有学习过Camera2,但由于我的应用程序使用旧的相机,所以我很快就需要这样做。使用旧的相机,我可以创建预览回调,其速率比您描述的5-7要高得多,大约每秒20-30次。因此,我的猜测是您应该使用预览而不是实际图片。从我在SO上看到的内容来看,Camera2中的预览机制与setRepeatingRequest的CaptureRequest.Builder相关联,例如在这里https://dev59.com/QV8e5IYBdhLWcg3wssLG。 - Settembrini
关于Renderscript(我经常使用),我非常确定它本身不能增加帧率,这毫无意义。但是你可以用它来进行图像后处理。但同意,文档相当不直观,至少可以这么说。 - Settembrini
感谢您提供的信息回复。我能够通过牺牲分辨率来获得更高的FPS速率。低分辨率对于我的应用程序已经足够了,最低分辨率相机给我大约30 FPS。现在我需要做的是找到一种方法来保持帧速率固定。链接 感谢您的帮助。 - Hiddenkeg

1
理论上,你可以通过这个调用获取可用的fps范围:
characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

在这里设置所需的fps范围:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);

原则上,您应该选择具有相同下限和上限的范围,这应该可以保持帧率恒定。然而,在具有传统配置文件的设备上,我测试过的所有设备都无法在1080p(S5、Z3 Compact、华为Mate S和HTC One M9)下实现30fps。我唯一能够实现这一点的方法是使用一个拥有完整配置文件的设备(LG G4)。如果您要在onImageAvailable回调中使用Renderscript,则无法获得任何好处。因为在传统设备上,在此时获取图像似乎是瓶颈,因为新的camera2 API只是包装了旧的API,并且可能会创建大量开销,导致回调不再以30fps发生。因此,如果要使用Renderscript工作,您需要创建一个Surface并找到另一种抓取帧的方法。但是,这里的关键是......如果您回退到弃用的API,我几乎可以保证您想要的任何分辨率都可以实现30fps。至少这是我在测试的所有设备上发现的......

这很有帮助。我正在尝试做类似的事情,只针对旧的糟糕的安卓平板电脑。我完全不知道我在做什么,因为我以前从未使用过相机(或Camera2)API。您是否有一些示例代码,可以供我查看? - Chase Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接