淺談OpenCV中的新函數(shù)connectedComponentsWithStats用法
主要內(nèi)容:對比新舊函數(shù),用于過濾原始圖像中輪廓分析后較小的區(qū)域,留下較大區(qū)域。
關(guān)鍵字:connectedComponentsWithStats
在以前,常用的方法是”是先調(diào)用 cv::findContours() 函數(shù)(傳入cv::RETR_CCOMP 標(biāo)志),隨后在得到的連通區(qū)域上循環(huán)調(diào)用 cv::drawContours() “
比如,我在GOCVHelper中這樣進行了實現(xiàn)
//尋找最大的輪廓 VP FindBigestContour(Mat src){ int imax = 0; //代表最大輪廓的序號 int imaxcontour = -1; //代表最大輪廓的大小 std::vector<std::vector<Point>>contours; findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); for (int i=0;i<contours.size();i++){ int itmp = contourArea(contours[i]);//這里采用的是輪廓大小 if (imaxcontour < itmp ){ imax = i; imaxcontour = itmp; } } return contours[imax]; } //尋找并繪制出彩色聯(lián)通區(qū)域 vector<VP> connection2(Mat src,Mat& draw){ draw = Mat::zeros(src.rows,src.cols,CV_8UC3); vector<VP>contours; findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); //由于給大的區(qū)域著色會覆蓋小的區(qū)域,所以首先進行排序操作 //冒泡排序,由小到大排序 VP vptmp; for(int i=1;i<contours.size();i++){ for(int j=contours.size()-1;j>=i;j--){ if (contourArea(contours[j]) < contourArea(contours[j-1])) { vptmp = contours[j-1]; contours[j-1] = contours[j]; contours[j] = vptmp; } } }
在OpenCV3中有了新的專門的函數(shù) cv::connectedComponents() 和函數(shù) cv::connectedComponentsWithStats()
定義:
int cv::connectedComponents ( cv::InputArrayn image, // input 8-bit single-channel (binary) cv::OutputArray labels, // output label map int connectivity = 8, // 4- or 8-connected components int ltype = CV_32S // Output label type (CV_32S or CV_16U) ); int cv::connectedComponentsWithStats ( cv::InputArrayn image, // input 8-bit single-channel (binary) cv::OutputArray labels, // output label map cv::OutputArray stats, // Nx5 matrix (CV_32S) of statistics: // [x0, y0, width0, height0, area0; // ... ; x(N-1), y(N-1), width(N-1), // height(N-1), area(N-1)] cv::OutputArray centroids, // Nx2 CV_64F matrix of centroids: // [ cx0, cy0; ... ; cx(N-1), cy(N-1)] int connectivity = 8, // 4- or 8-connected components int ltype = CV_32S // Output label type (CV_32S or CV_16U) );
其中,新出現(xiàn)的參數(shù)
stats:長這樣
分別對應(yīng)各個輪廓的x,y,width,height和面積。注意0的區(qū)域標(biāo)識的是background
而centroids則對應(yīng)的是中心點
而label則對應(yīng)于表示是當(dāng)前像素是第幾個輪廓
例子:
對于圖像
Mat img = cv::imread( "e:/sandbox/rect.png",0); cv::Mat img_edge, labels, img_color, stats,centroids; cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY); bitwise_not(img_edge,img_edge); cv::imshow("Image after threshold", img_edge); int i, nccomps = cv::connectedComponentsWithStats ( img_edge, labels, stats, centroids ); cout << "Total Connected Components Detected: " << nccomps << endl; vector<cv::Vec3b> colors(nccomps+1); colors[0] = Vec3b(0,0,0); // background pixels remain black. for( i = 1; i < nccomps; i++ ) { colors[i] = Vec3b(rand()%256, rand()%256, rand()%256); if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 ) colors[i] = Vec3b(0,0,0); // small regions are painted with black too. } img_color = Mat::zeros(img.size(), CV_8UC3); for( int y = 0; y < img_color.rows; y++ ) for( int x = 0; x < img_color.cols; x++ ) { int label = labels.at<int>(y, x); CV_Assert(0 <= label && label <= nccomps); img_color.at<cv::Vec3b>(y, x) = colors[label]; } cv::imshow("Labeled map", img_color); cv::waitKey();
注意:
1、對于OpenCV來說,白色代表有數(shù)據(jù),黑色代表沒有數(shù)據(jù),所以圖像輸入之前要轉(zhuǎn)換成”黑底白圖“
2、看labels 和 stats,其中第1 2 6 個的面積小于200
而labels中
完全對的上號,結(jié)果為
以上這篇淺談OpenCV中的新函數(shù)connectedComponentsWithStats用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何計算 tensorflow 和 pytorch 模型的浮點運算數(shù)
FLOPs 是 floating point operations 的縮寫,指浮點運算數(shù),可以用來衡量模型/算法的計算復(fù)雜度。本文主要討論如何在 tensorflow 1.x, tensorflow 2.x 以及 pytorch 中利用相關(guān)工具計算對應(yīng)模型的 FLOPs,需要的朋友可以參考下2022-11-11一小時學(xué)會TensorFlow2之基本操作2實例代碼
這篇文章主要介紹了TensorFlow2的基本操作和實例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Python3 venv搭建輕量級虛擬環(huán)境的步驟(圖文)
這篇文章主要介紹了Python3 venv搭建輕量級虛擬環(huán)境的步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python paramiko連接ssh實現(xiàn)命令
這篇文章主要為大家介紹了python paramiko連接ssh實現(xiàn)的命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07python使用tkinter調(diào)整label背景顏色的測試
這篇文章主要介紹了python使用tkinter調(diào)整label背景顏色的測試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09python使用pandas自動化合并Excel文件的實現(xiàn)方法
在數(shù)據(jù)分析和處理工作中,經(jīng)常會遇到需要合并多個Excel文件的情況,本文介紹了一種使用Python編程語言中的Pandas庫和Glob模塊來自動化合并Excel文件的方法,需要的朋友可以參考下2024-06-06python實現(xiàn)在遍歷列表時,直接對dict元素增加字段的方法
今天小編就為大家分享一篇python實現(xiàn)在遍歷列表時,直接對dict元素增加字段的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01matlab輸出數(shù)據(jù)為excel文件的問題
這篇文章主要介紹了matlab輸出數(shù)據(jù)為excel文件的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08