1. 程式人生 > 實用技巧 >opencv畫素操作的加速

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;