OpenCV里支持很多邊緣提取的辦法,可是如何在一幅圖像里得到輪廓區域的參數呢,這就需要用到findContours函數,這個函數在OpenCV4Android的原型為:
void org.opencv.imgproc.Imgproc.findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method)
image參數為已經二值化的原圖
contours參數為檢測的輪廓數組,每一個輪廓用一個MatOfPoint類型的List表示
hiararchy參數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,該值設置為負數。
mode表示輪廓的檢索模式例如:
CV_RETR_EXTERNAL表示只檢測外輪廓
CV_RETR_LIST檢測的輪廓不建立等級關系
CV_RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
CV_RETR_TREE建立一個等級樹結構的輪廓。
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 近似算法
findContours經常與drawContours配合使用,用來將輪廓繪制出來。還可以得到輪廓的外包絡矩形,使用函數boundingRect,如果想得到旋轉的外包絡矩形,使用函數minAreaRect,返回值為RotatedRect;
也可以得到輪廓的外包絡圓,對應的函數為minEnclosingCircle;想得到輪廓的外包絡橢圓,對應的函數為fitEllipse,返回值也是RotatedRect;可以用ellipse函數畫出對應的橢圓。