2016-02-04 157 views
4

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

我见过建议使用RenderScript进行YUV与Android camera2 api的处理。使用RenderScript会获得更高的FPS费率吗? 如果是这样,请有人可以指导我如何实现,因为我是新来的android我很难掌握分配和RenderScript的概念。提前致谢。

回答

1

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

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

感谢您的回复。我只对图像的强度感兴趣,并且使用你提到的方法。不过,我现在正在使用android.media.ImageReader。而且我的应用程序最终在5-7的时候具有较低的FPS率。我想知道使用RenderScript是否能够实现更高的FPS速率。 – Hiddenkeg

+0

我还没有研究Camera2,但由于我的应用程序使用旧相机,我将需要尽快做到这一点。使用旧相机,我可以创建预览回调,其速率远远高于您描述的5-7,而且每秒钟的速度必须在20-30左右。因此,我的猜测是你应该使用PREVIEWs,而不是用实际的照片。从我看到的SO中,Camera2中的预览机制与setRepeatingRequest的CaptureRequest.Builder相关联,请参阅这里http://stackoverflow.com/questions/25462277/camera-preview-image-data-processing-with-android-l-and-camera2-api。 – Settembrini

+0

至于Renderscript(我用了很多),我非常肯定,这本身不能增加帧率,这是没有意义的。但是您可以将其用于图像的后期处理。但同意,至少可以说文档是非常不直观的。 – Settembrini

0

从理论上讲,你可以得到可用的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,Huawei Mate S和HTC One M9)上实现30fps。我能够实现这一目标的唯一方法是使用一个设备(LG G4),其结果是具有完整的配置文件。

如果您打算在onImageAvailable回调中使用它,Renderscript不会在这里为您购买任何东西。看起来,在那个时候获取图像是LEGACY设备的瓶颈,因为新的camera2 API只是简单地包装了旧的,并且可能会产生很多开销,以至于不再以30fps的速度发生回调。因此,如果Renderscript要工作,您需要创建一个Surface并找到另一种方法来抓取框架。

尽管如此,如果您退回弃用的API,我几乎可以保证您想要的任何分辨率下的30fps。至少这是我在我测试的所有设备上发现的....