這個是Visual Studio2019版本在OpenCV環(huán)境配置好后所顯示的6個參數(shù),也即為全部參數(shù)
但是,常用參數(shù)僅有四個(參見程序里的第二行注釋)
cv::void findContours(cv::InputOutputArray image,
cv::OutputArrayOfArray contours,
cv::OutputArray hierarchy,
int mode, int method,
cv::Point offset = cv::Point())
//完整形式findContours(image, countours,hierarchy, mode,method, offset);
//一般使用時僅輸入這四個參數(shù)即可findContours(image,countours,mode,method);
//image:單通道圖像矩陣,可以是灰度圖,建議二值圖像(最好是Canny/拉普拉斯等邊緣檢測算子處理后的)
//countours:"vector<vector<Point>>contours"一個雙重向量,向量內每個元素保存了一組由連續(xù)的point點構成的點的集合的向量,每一組point點集就是一個輪廓
//hierarchy:"vector<Vec4i>hierarchy","Vec4i"是Vec<int,4>的別名,定義了一個“向量內每一個元素包含了四個int型變量”的向量
//mode:定義輪廓的檢索模式
?參數(shù)1? ? image?:
單通道圖像矩陣。待提取輪廓的圖像,可以是灰度圖,常用的是二值圖(C++中可選擇使用Canny,拉普拉斯等邊緣檢測算法進行二值化)
?參數(shù)2? ? contours :
定義為一個雙重向量? vector<vector<Point>> contours? 每一組Point都連續(xù),構成一組向量集合,在圖像上的顯示即為一個輪廓(點集),由于一張圖像往往包含很多對象,因此一個輪廓不足以描述圖像中的所有對象,因此還需要一個容器去包含所有的輪廓,我們稱這個包含所有輪廓的容器為輪廓集。所以我們有上述的雙重向量的定義方式。? ? 輪廓數(shù)量=contours的元素個數(shù)
?
?參數(shù)3? ? hierarchy?:
定義為? vector<vector<int,4>>hierarchy? 或??vector<Vec4i>hierarchy,相當于hierarchy中的每個元素都是一個由4個int型組成的集合。直觀的表示可以參考列數(shù)為4,行數(shù)為n的二維矩陣。這四個int型數(shù)hierarchy[i][0]~hierarchy[i][3]分別表示后一個輪廓,前一個輪廓,父輪廓,內嵌輪廓的索引編號,如果當前輪廓所對應的這四個輪廓之一有缺失,比如說容器內的第一個輪廓為沒有前一個輪廓,則相應位置hierarchy[i][1]=-1。
此參數(shù)通常不需要進行傳值。
??參數(shù)4? ? ?mode?:
該參數(shù)用于定義輪廓的檢索模式,一般有4種取值(也稱為4個宏)
????????取值一:CV_RETR_EXTERNAL
????????CV_RETR_EXTERNAL只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略
????????官方解釋為:CV_RETR_EXTERNAL retrieves only the extreme outer contours. It sets ????????hierarchy[i][2]=hierarchy[i][3]=-1 for all the contours.?
????????翻譯過來就是:CV_RETR_EXTERNAL ?只檢測最外層輪廓,對所有輪廓設置hierarchy[i][2]= ????????hierarchy[i][3]=-1
????????直觀的解釋就是:圖像檢測到一個同心圓的內輪廓和外輪廓,由于外輪廓完全把內輪廓包含? ? ? ? ? ? 住了,因此只顯示外輪廓,
????????取值二:CV_RETR_LIST ??
????????CV_RETR_LIST檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不建立等級關? ? ? ? ? ? ? 系,彼此之間獨立,沒有等級關系,這就意味著這個檢索模式下不存在父輪廓或內嵌輪廓,? ? ? ? ? ? 所以hierarchy向量內所有元素的第3、第4個分量都會被置為-1(即hierarchy[i][2]=? ? ? ? ? ? ? ? ? ? ? ? ? hierarchy[i][3]=-1)
? ? ? ? 官方解釋為:CV_RETR_LIST retrieves all of the contours without establishing any? ? ? ? ? ? ? ? ? ? ? ? hierarchical relationships.?
? ? ? ? 翻譯過來就是:CV_RETR_LIST:返回所有的輪廓,但是不建立輪廓的拓撲關系,所以? ? ? ? ? ? ? ? ? hierarchical為空。
????????取值三:CV_RETR_CCOMP ?
????????檢測所有的輪廓,但所有輪廓只建立兩個等級關系,外圍為頂層,若外圍內的內圍輪廓還包? ? ? ? ? ? 含了其他的輪廓信息,則內圍內的所有輪廓均歸屬于頂層
????????官方解釋為:CV_RETR_CCOMP retrieves all of the contours and organizes them into a? ? ? ? ? ? ? two-level hierarchy. At the top level, there are external boundaries of the components. At the? ? ? ? ? second level, there are boundaries of the holes. If there is another contour inside a hole of a? ? ? ? ? connected component, it is still put at the top level.?
????????翻譯過來就是:CV_RETR_CCOMP:提取所有輪廓,并且將其組織為雙層結構。頂層(the? ? ? ? ? ? top levell)為連通域的外圍邊界,次層(the second level)為孔(hole)的內層邊界,如果孔(hole)? ? ? ? ? 中還有其它輪廓,那么這個輪廓被劃分為頂層(the top levell)。
????????取值四:CV_RETR_TREE
????????檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含內層輪廓,內層輪廓還可以繼? ? ? ? ? ? 續(xù)包含內嵌輪廓。
????????官方解釋為:CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy? ? ? ? ? of nested contours. This full hierarchy is built and shown in the OpenCV contours.c demo.?
????????翻譯過來就是:CV_RETR_TREE:返回所有的輪廓,并且建立完整的拓撲結構
參數(shù)5? ? ?method :
用于定義輪廓的近似方法
????????取值一:CV_CHAIN_APPROX_NONE?
? ? ? ? 保存物體邊界上所有連續(xù)的輪廓點一般用的比較多
????????官方解釋為:CV_CHAIN_APPROX_NONE stores absolutely all the contour points. That is,? ? ? ? ? any 2 subsequent points (x1,y1) and (x2,y2) of the contour will be either horizontal, vertical? ? ? ? ? ? or diagonal neighbors, that is, max(abs(x1-x2),abs(y2-y1))==1.?
????????翻譯過來為:存儲所有的輪廓點。這種方法下,兩個連續(xù)的輪廓點,要么是水平相鄰的,要? ? ? ? ? ? 么是垂直相鄰的, 要么是對角相鄰的,即滿足max(abs(x1-x2),abs(y2-y1))==1.?
????????取值二:CV_CHAIN_APPROX_SIMPLE?
? ? ? ? 僅保存輪廓的拐點信息,把所有輪廓拐點保存至contours向量內,拐點與拐點之間直線段上? ? ? ? ? ? 的信息點不予保留
????????官方解釋為:CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal? ? ? ? ? segments and leaves only their end points. For example, an up-right rectangular contour is? ? ? ? ? ? encoded with 4 points.?
????????翻譯過來為:壓縮水平方向、垂直方向和對角線方向的中間點,只保留某個方向的終點坐? ? ? ? ? ? ? 標,例如一個矩形輪廓只需4個點來保持輪廓信息。
????????取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS
????????使用teh-Chinl chain 近似算法
????????官方解釋為:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS applies? ? ? ? ? one of the flavors of the Teh-Chin chain approximation algorithm. See [TehChin89] for? ? ? ? ? ? ? ? ? ? details.?
????????翻譯過來為:使用The-Chinl鏈逼近算法中的一個
?參數(shù)6? ? offset :Point類型,輪廓相對于原輪廓的偏移量(? ? 通常使用默認的值 (0,0)? ? )
通常以一個坐標形式 Point 的參數(shù)(40,30)出現(xiàn)。(40,30)意思是將輪廓向右移動40個像素,再向下移動30個像素,若數(shù)值過大可能會出現(xiàn)溢出報錯。
本篇學習筆記,答謝以下兩位作者:(第一個鏈接包含官方解釋及翻譯,第二個鏈接包含部分宏名的效果圖及一些比較好理解的解釋方式。
利用OpenCV的函數(shù)findContours()和函數(shù)drawContours()進行輪廓的檢測與繪制_昊虹圖像算法的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-468726.html
findContours函數(shù)參數(shù)詳解_-牧野-的博客-CSDN博客_findcontours函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-468726.html
到了這里,關于學習筆記:C++環(huán)境下OpenCV的findContours函數(shù)的參數(shù)詳解及優(yōu)化的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!