OpenCV程序效率优化方法
使用指针方法遍历像素点
OpenCV中图像的存储对象为Mat类,该类提供了多种方式访问像素的的值。一般来说分为以at方法类与ptr指针的方式访问,相较之下使用指针ptr的访问方式效率将会高一些。尤其是在debug模式之下指针的效率提升更加明显,release模式则相差不大。其中原因是at方法访问像素时包含多一次的边界检查:
|
|
所以基于ptr指针的方式访问,在debug模式下效率将会有一定的提升
|
|
测试结果:
|
|
使用LUT查找表函数
一些重复性的像素处理操作可以基于查找表的思路进行效率提升,OpenCV也提供了查找表的工具函数。查找表的提升原理是预先将结果计算好存放至一张表里,后续使用直接从表里查找结果,无需每次都计算一遍。这种方法常适用于伽马变换、灰度拉伸等针对灰度值固定映射的场景。
|
|
测试结果:
|
|
使用Parallel for并行框架
对于图像处理,循环遍历像素点的操作OpenCV也提供了一个并行循环框架,基于该框架可以充分多核心处理器的并行处理能力,大大提升处理效率。但是使用循环并行框架时,需注意将外循环并行而非内循环并行,内循环并行反而可能适得其反。
|
|
测试结果:
|
|
循环展开
循环展开一种减少循环次数的优化方法,通过增加循环的累加步长减少循环的次数,减少循环次数的好处就是可以减少循环中的分之预测,从而提升效率。但缺点是使得代码膨胀,以及可读性降低。
|
|
测试结果:
|
|
内存块平铺
利用cpu的缓存优化特性,对于涉及大量数据的内存读写操作,将内存分块访问进行读写有利于提高cpu的缓存命中率,从而提高程序运行性能。而平铺(tile)这一优化技巧就是基于这一原理,但是现代编译器非常智能,在绝大多数场景下都无需程序员手动进行平铺优化,编译器在release优化级别下一般会自动平铺处理。所以一般情况下不建议手动平铺,建议在数据处理逻辑非常复杂的情况下可以尝试手动平铺优化。
|
|
测试结果:
|
|
Simd指令集优化
cpu指令集优化也是提升图像处理效率的一个有效手段,SIMD指令集优化可以实现单条指令一次计算多个数据,也是属于硬件级别的并行处理。不同架构的cpu指令集优化接口并不相同,为此OpenCV提供了统一的指令集优化框架,基于该框架编写指令集优化可以实现x86、arm等平台的加速。
|
|
测试结果:
|
|
Gapi优化框架
GApi是OpenCV 4.x推出的一个新模块,该模块基于图的方式实现程序的效率优化,将每一个处理步骤抽象为一个节点,加入处理流程(graph),把计算的流程构建成一个有向图后,最后一起计算。
|
|
测试结果:
|
|
本文由芒果浩明发布,转载请注明出处。 本文链接:https://blog.mangoeffect.net/opencv/optimization-methods-in-opencv-1.html