当前位置:   article > 正文

opencv源码--高效的二值化函数_加速opencv的二值化

加速opencv的二值化

图像二值化

最简单的就是for{if{}}的方式(方式一)。

  1. //简单但不高效的方式
  2. void SimpleBin(Mat &src, Mat &dst, int thresh, int minVal, int maxVal)
  3. {
  4. uchar* srcData = src.data;
  5. uchar* dstData = dst.data;
  6. int dataLength = src.cols*src.rows*src.channels();
  7. for (int i = 0; i < dataLength; i++)
  8. {
  9. dstData[i] = (srcData[i] >= thresh) ? maxVal : minVal;
  10. }
  11. }

看了下OpenCV的源码通过对cmake的OpenCV3.1进行调试跟踪,在不断地【F10】->【F11】->【Shift+F11】->...之后找到核心地带。

其中有很多预编译宏的加速方法,将其中不加速的部分提取出来,做简单的删改如下,(方式二)

  1. // 提取OpenCV中threshold中的关键内容,稍作删改而成
  2. void SimpleThreshold(Mat &src, Mat &dst, int thresh, int minval, int maxval)
  3. {
  4. int i, j;
  5. uchar tab[256];
  6. //int src_channels = src.channels();
  7. //int dst_channels = dst.channels();
  8. int dataLength = src.cols*src.rows*src.channels();
  9. uchar* srcData = src.data;
  10. uchar* dstData = dst.data;
  11. // ...
  12. for (i = 0; i <= thresh; i++)
  13. tab[i] = minval;
  14. for (; i < 256; i++)
  15. tab[i] = maxval;
  16. // ...
  17. for (i = 0; i < dataLength; i ++)
  18. {
  19. dstData[i] = tab[srcData[i]];
  20. }
  21. }

将OpenCV自带的threshold函数作为(方式三),三者进行测试,图片为3x1912x1000的rgb图像。处理结果完全相同,循环运行十次的耗时如下,纵轴单位为ms

OpenCV自带函数第一次调用系统的优化方式时比较耗时较长,之后再次调用则耗时极短。

根据OpenCV纯cpu优化后的方式比原始的for-if方式十次内平均提速49%,算法的力量强大。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/954904
推荐阅读
相关标签
  

闽ICP备14008679号