Opencv for Android 图像算法优化

10 篇文章 0 订阅
6 篇文章 0 订阅

参考博文

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盲目地转换指令一个接一个,因为有更好的方法来做到这一点,但把它作为一个例子开始.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值