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;
无情的摸鱼机器