opencv像素操作的加速

背景:煤矸石识别项目,需要先检测再识别,检测采用基于轮廓的定位方法,先找出轮廓,再求出轮廓的质心作为检测目标的中心点。但是遇到问题:图像边缘的煤矸石轮廓无法闭合,找到的中心店不准确,有时会出现一块石头两个中心点的情况

 

 对预处理图像进行像素操作,图像二值化后将边界全部赋值为255也就是填充为白色可以解决这个问题

 

 最开始采用的方法是遍历像素点,但是这种方法太慢

for(int row=0;row<morImg.rows;++row)
        for (int col = 0; col < morImg.cols; ++col)
        {
            if (col <= 1 || row <= 1 || col >= morImg.cols - 2 || row >= morImg.rows - 2)
                morImg.at<uchar>(row, col) = 255;
        }

耗时0.0014209s

 

 利用opencv中的setTo函数来取代遍历赋值像素的操作可以加快速度

morImg(Rect(0, 0, 2, morImg.rows)).setTo(255);
morImg(Rect(morImg.cols-2, 0, 2, morImg.rows)).setTo(255);
morImg(Rect(0, 0, morImg.cols, 2)).setTo(255);
morImg(Rect(0, morImg.rows-2, morImg.cols, 2)).setTo(255);

利用浅拷贝对边界像素直接赋值

耗时大概是遍历的五分之一

 

 

计时函数在这里

 

 把他打开,然后引入这个头文件

#include <omp.h>

就可以显示时间了

startTime = omp_get_wtime();
morImg(Rect(0, 0, 2, morImg.rows)).setTo(255);
morImg(Rect(morImg.cols-2, 0, 2, morImg.rows)).setTo(255);
morImg(Rect(0, 0, morImg.cols, 2)).setTo(255);
morImg(Rect(0, morImg.rows-2, morImg.cols, 2)).setTo(255);
spandTime = omp_get_wtime() - startTime;
cout << "消耗时间: " << spandTime << endl;

 

posted @ 2020-08-18 10:37  Wangtn  阅读(909)  评论(0编辑  收藏  举报