背景:煤矸石識別項目,需要先檢測再識別,檢測采用基於輪廓的定位方法,先找出輪廓,再求出輪廓的質心作為檢測目標的中心點。但是遇到問題:圖像邊緣的煤矸石輪廓無法閉合,找到的中心店不准確,有時會出現一塊石頭兩個中心點的情況
對預處理圖像進行像素操作,圖像二值化后將邊界全部賦值為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;