您的位置:首页 > 移动开发 > Android开发

Opencv for Android 图像算法优化

2014-10-28 11:11 218 查看
参考博文

http://www.freeshow.net.cn/questions/0ee0d32f441dfee9a20bf9729afab9a2e7d0b4f5077823bbf85a39d91f85725b/
http://stackoverflow.com/questions/21110658/improving-opencv-performance-android-fast-object-tracking
我已经与Android和优化(我写了一个视频处理的应用程序,处理在4ms的一帧)的工作相当多,所以我希望我会给你一些中肯的答案.

首先,有没有在OpenCV中的C和C + +接口之间没有太大的区别.其实,有些代码是用C语言编写,并且有一个C + +封装接口,和一些反之亦然.两个(由Shervin EMAMI测量)之间的任何显著的差异通常是错误的库中.此外,库版本之间的差异是由改进质量或通过引入一些错误造成的.但最新的版本是相当稳定的,所以我建议您下载最新的(基于OpenCV 2.4.2)

为什么不重写?

因为你会花很多时间,你可以用非常非常好.此外,C接口较为繁琐,并有机会引入错误或内存泄漏或任何高.所以,没有C,在我看来.

建议优化

简介您的应用程序.首先做您的计算机上,因为它是非常容易.使用Visual Studio探查器,看看有什么功能,采取最.对其进行优化.从来没有优化,因为你觉得很慢,而是因为你衡量它.从最慢的函数,优化它尽可能地,然后采取第二速度较慢.

首先,专注于算法.更快的算法可以提高性能与数量级(100倍)的订单.一个C + +的技巧会给你也许2倍的性能提升.

经典的技术:

调整你的视频帧要小.很多时候,你可以从一个200x300px图像中提取,而不是1024x768的信息.第1的面积为10倍以下.

用更简单的操作,而不是复杂的.使用整数而不是浮点数.而从来不使用



double

矩阵或一个 



for

循环,执行数千次.

做尽可能少的计算成为可能.你可以只在图像的特定区域跟踪处理,而不是它的所有对所有帧的物体,?你可以做一个粗略/近似检测在一个非常小的图像,然后改进它的全画幅投资回报率?

在for循环,它可能是有意义的使用,而不是C C风格+ +.一个指向数据矩阵或一个float数组比mat.at或std :: vector的<>快得多.但改变只有当它的需要.通常情况下,很多处理(90%)的部分为双循环完成.重点关注一下.它没有任何意义,以取代向量<>所有的地方,广告使你的代码看起来就像意大利面条.

一些OpenCV函数转换数据将翻一番,处理它,然后再转换回输入格式.提防他们,他们kill在移动设备上的表现.例如:变形,缩放,类型转换.此外,色彩空间转换被称为是懒惰的.更愿意直接从本地获得的YUV灰度.

ARM处理器具有NEON.学习和使用它.据 强大

一个小例子:


float* a, *b, *c;

// init a and b to 1000001 elements

for(int i=0;i<1000001;i++)

c[i] = a[i]*b[i];



可以如下重写.这是更详细的,但我相信它的速度更快.


float* a, *b, *c;

// init a and b to 1000001 elements

float32x4_t _a, _b, _c;

int i;

for(i=0;i<1000001;i+=4)

{

a_ = vld1q_f32( &a[i] ); // load 4 floats from a in a NEON register

b_ = vld1q_f32( &b[i] );

c_ = vmulq_f32(a_, b_); // perform 4 float multiplies in parrallel

vst1q_f32( &c[i], c_); // store the four results in c

}

// the vector size is not always multiple of 4 or 8 or 16.

// Process the remaining elements

for(;i<1000001;i++)

c[i] = a[i]*b[i];



纯粹主义者
say 您必须在汇编写的,但对于普通程序员的家伙,这是一个有点令人生畏.我找到了不错的成绩书面
intrinsics ,就像上面的例子.

同时检查
this blog post 和有关NEON以下职位.

以及最后但并非最不重要,我要提一提,我有很好的成功转换的SSE优化指令(这是NEON对口的x86-64处理器)在OpenCV的霓虹灯,像
here .这是UCHAR矩阵(常规图像格式)的图像滤波代码.你should't盲目地转换指令一个接一个,因为有更好的方法来做到这一点,但把它作为一个例子开始.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: