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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM