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盲目地转换指令一个接一个,因为有更好的方法来做到这一点,但把它作为一个例子开始.
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盲目地转换指令一个接一个,因为有更好的方法来做到这一点,但把它作为一个例子开始.
相关文章推荐
- 实时检测图像中的主要边缘 opencv for Android
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
- OpenCV学习笔记(七)—— OpenCV for Android实时图像处理
- OpenCV学习笔记(七)—— OpenCV for Android实时图像处理
- SSE图像算法优化系列六:OpenCv关于灰度积分图的SSE代码学习和改进。
- OpenCV学习笔记(七)—— OpenCV for Android实时图像处理
- OpenCV学习笔记(七)—— OpenCV for Android实时图像处理
- OpenCV4Android学习之图像特征匹配算法
- 常见图像处理库(fastVCV、openCV for Android)
- alpha 图像混合算法 for RGB565
- Android平台上利用opencv进行图像的边沿检测
- Android Designing for Performance(性能优化)
- opencv for android 编译
- opencv for android 编译
- Android-图像识别项目OpenCV(1):技术选型以及NDK搭建
- 基于暗点优先膨胀的图像暗通道优化算法
- 【图像算法OpenCV】几何不变矩--Hu矩
- 数字图像基础,论坛,算法库matlab,opencv,halcon
- Opencv 图像增强算法 图像检测结果
- Android 中比较“高效”的图像模糊处理算法