opencv 連通域需要的函數解析


OpenCV支持大量的輪廓、邊緣、邊界的相關函數,相應的函數有moments、HuMoments、findContours、drawContours、approxPolyDP、arcLength、boundingRect、contourArea、convexHull、fitEllipse、fitLine、isContourConvex、minAreaRect、minEnclosingCircle、mathcShapes、pointPolygonTest。還有一些c版本的針對老版本的數據結構的函數比如cvApproxChains、cvConvexityDefects。這里先介紹一些我用過的函數,以后用到再陸續補充。

OpenCV里支持很多邊緣提取的辦法,可是如何在一幅圖像里得到輪廓區域的參數呢,這就需要用到findContours函數,這個函數的原型為:

//C++: 
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
void findContours(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())

這里介紹下該函數的各個參數:

輸入圖像image必須為一個2值單通道圖像

contours參數為檢測的輪廓數組,每一個輪廓用一個point類型的vector表示

hiararchy參數和輪廓個數相同,每個輪廓contours[ i ]對應4個hierarchy元素hierarchy[ i ][ 0 ] ~hierarchy[ i ][ 3 ],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,該值設置為負數。

mode表示輪廓的檢索模式

CV_RETR_EXTERNAL表示只檢測外輪廓

CV_RETR_LIST檢測的輪廓不建立等級關系

CV_RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。

CV_RETR_TREE建立一個等級樹結構的輪廓。具體參考contours.c這個demo

method為輪廓的近似辦法

CV_CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1

CV_CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息

CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

offset表示代表輪廓點的偏移量,可以設置為任意值。對ROI圖像中找出的輪廓,並要在整個圖像中進行分析時,這個參數還是很有用的。

具體應用參考sample文件夾下面的squares.cpp這個demo

findContours后會對輸入的2值圖像改變,所以如果不想改變該2值圖像,需創建新mat來存放,findContours后的輪廓信息contours可能過於復雜不平滑,可以用approxPolyDP函數對該多邊形曲線做適當近似

contourArea函數可以得到當前輪廓包含區域的大小,方便輪廓的篩選

findContours經常與drawContours配合使用,用來將輪廓繪制出來。其中第一個參數image表示目標圖像,第二個參數contours表示輸入的輪廓組,每一組輪廓由點vector構成,第三個參數contourIdx指明畫第幾個輪廓,如果該參數為負值,則畫全部輪廓,第四個參數color為輪廓的顏色,第五個參數thickness為輪廓的線寬,如果為負值或CV_FILLED表示填充輪廓內部,第六個參數lineType為線型,第七個參數為輪廓結構信息,第八個參數為maxLevel

得到了復雜輪廓往往不適合特征的檢測,這里再介紹一個點集凸包絡的提取函數convexHull,輸入參數就可以是contours組中的一個輪廓,返回外凸包絡的點集

還可以得到輪廓的外包絡矩形,使用函數boundingRect,如果想得到旋轉的外包絡矩形,使用函數minAreaRect,返回值為RotatedRect;也可以得到輪廓的外包絡圓,對應的函數為minEnclosingCircle;想得到輪廓的外包絡橢圓,對應的函數為fitEllipse,返回值也是RotatedRect,可以用ellipse函數畫出對應的橢圓

如果想根據多邊形的輪廓信息得到多邊形的多階矩,可以使用類moments,這個類可以得到多邊形和光柵形狀的3階以內的所有矩,類內有變量m00,m10,m01,m20,m11,m02,m30,m21,m12,m03,比如多邊形的質心為 x = m10 / m00,y = m01 / m00。

如果想獲得一點與多邊形封閉輪廓的信息,可以調用pointPolygonTest函數,這個函數返回值為該點距離輪廓最近邊界的距離,為正值為在輪廓內部,負值為在輪廓外部,0表示在邊界上。



免責聲明!

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



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