计算机视觉在移动端的应用,典型的如手势识别,人脸识别,流程都差不多,都是利用移动端的相机采集数据,丢给算法层,根据识别的结果来做一些业务,中间可能还要做一些图形的渲染。
本文主要讨论这中间涉及到的一些问题以及优化的思路,算是对过往工作的总结吧。大致问题有以下五点:
一,相机采集数据的格式是NV21,而算法层所需的格式是RGB,这中间需要转换,对于每秒30帧,每帧1920*1080的图像转换的耗时还是不可忽视的。
二,算法层耗时在20ms-80ms不定,这样平均下来算法输出帧率大概在15~20,而相机的原始帧率是30,这会造成明显的延时,所以如何提升算法的输出帧率是个问题。
三,整个流程是异步的,相机数据是异步的,RGB转换是异步的,算法是异步的,渲染也是异步的,如何设计整个系统让数据流稳定地跑起来,要注意线程同步的问题。
四,设计到大量的数据读写,要尽可能减少数据拷贝,尽可能复用对象
五,图形渲染,除了相机每秒30帧的预览数据,还有额外关于人脸和手的渲染效果
先说说第一点,RGB转换用Java实现肯定性能是有问题的,后来改用C++实现了,对于1280*720
的帧转换平均要10ms,1920*1080
可能要20ms左右了,Neon
实现可能效果会好不少,不过没试过。我这里是直接采用GPU来做转换的,可以参考我的Github项目