一、什么是FastCV
FastCV是高通免费发布的计算机视觉库,类似一个小一点的OpenCV库。FastCV 最大的特点就是快,这是因为高通公司针对自己的芯片做了特别的优化的缘故。缺点也特别明显,就是 FastCV 是闭源的,只提供 API,并不提供源码,而且只能运行在高通的芯片上。
目前支持的平台:
- Android 32 bit and 64 bit library
- IA-32 (x86) Win32 and MS Visual C++ 2010, 2012, and 2013
- IA-32 (x86) Win64 and MS Visual C++ 2012, and 2013
- Linux Embedded 32 bit (‘softfp’ and ‘hard’) and 64 bit library
二、FastCV API
FastCV官网提供了多种功能的API详见
https://developer.qualcomm.com/docs/fastcv/api/index.html
其中API分为如下几类:
- 向量和矩阵计算
- 图像处理(中值滤波,高斯滤波,转灰度图,二值图,传统边缘检测细化算法)
- 图像转换(scale,上下采样等)色彩格式转换
- 特征检测
- 物体运动跟踪检测
三、构建FastCV demo
首先在 FastCV 的官网上注册并下载 FastCV SDK
https://developer.qualcomm.com/software/fastcv-sdk
下载sdk后执行文件,执行安装。安装后的文件目录为
- inc目录是fastcv库的.h头文件
- lib中包括Android的64位32位.a静态库和vs2010 2012 2013的.lib库文件
- samples中包含三个fastcv的resources,分别是角点检测、加载jpeg图像和算法的合集
构建一个Android studio工程时
ndk_version:ndk16
cmake:cmke3.6.4
build.gradle:3.0.1
android-api:25
gradle:gradle-4.1-all
接下来以sample中最为复杂的fastcvDemo为例进行构建
将如上的manifest文件和jni、res、src文件夹替换构建好的Android工程,并将其中的包名还有cpp、.h文件中的函数名称替换成自己的包名
最后,因为高通官网上给出的sdk中c++编译使用的是.mk文件,兼容性过低,我们将所有的编译脚本更新为CmakeLists.txt
这里要感谢一位大佬已将将demo上传到github
https://github.com/dongxiawu/FastcvDemo
亲测可用,只要你不改变gradle和tool的版本,就是人家的什么环境你都不要动。
四、FastCVDemo解读
fastcv并没有提供源码,但是封装的函数很多,我们从demo出发,以canny边缘检测算法为例,研究fastcv从app层调用到底层实现。
首先在调用时选择filter的类型为CannyFilter,通过jni在底层将滤镜设置为canny
设置完成后,buffer的获取是在Camera的回调中进行更新
在update的jni中调用updateFilter,在这里通过一开始设置的Filter的类型,选择不同的滤镜case访问fastcv的库函数fcvFilterCanny3x3u8,在这里也可以看出,不同的算法的调用,比如上面调用的高斯滤波。
算法执行完成后,要通过render进行渲染在上面的update Jni中,先进行上图的updateFilter,再进行如下图所示的操作,该操作将yuv420数据转为RGB565
以上只是将数据转为合法数据,具体的渲染过程也是在camera的回调中,如上图,在update执行结束后调用requestRender进行渲染
最后来看一下边缘检测的效果
角点检测的算法效果
(上一篇博客有)
五、总结
fastcv的使用总体来说很方便,官网声明其速度可以比同条件下的opencv快10%-15%。但是我们并没有测试数据,后续有待测试。总体使用很方便(就一个静态库)。