最近在项目中使用到opencv,集成完之后在手机上跑了下发现性能不是很理想,于是在github上搜索了一圈,发现了百度去年新开源的flycv,宣称在arm端性能比opencv领先,扫了一下文档,感觉接口方面和opencv基本类似,于是就尝试了一下集成,下面总结一下在集成过程中遇到的问题。 因为是在android手机上跑,直接下载了flycv官方release的android包:release-v1.0.0 然后参考官方文档写了一个简单的demo程序:
#include "flycv.h"
int main(int argc, char** argv) {
fcv::Mat dst;
fcv::Mat src = fcv::imread("water.jpg");
fcv::resize(src, dst, fcv::Size(src.width() / 4, src.height() / 4));
fcv::imwrite("water_small.jpg", dst);
return 0;
}
顺利跑通,于是开始往我的代码里进行迁移,迁移完了发现resize的结果就是不对,程序总是crash,仔细检查之后才发现flycv和opencv的Mat构造方法的参数顺序不相同。
// opencv是先输入行数,再输入列数
Mat src(rows, cols, ...)
// 但flycv是先输入宽度,后输入高度
Mat src(width, height, ...)
纠正完这一点结果就能对齐了。实际跑了一下性能,在我的android手机上1080P图像缩放1/4耗时2.3ms,比opencv 4.5ms缩短了2.2ms,减少了48%,但缩放1/2耗时只减少了20%左右, 不过总体来讲性能收益还是比较明显的。