opencv使用cvFindContours提取联通域
轉自:http://hi.baidu.com/irmosgarden/blog/item/8ce0174c54b307fad72afcbc.html
?
// m_imgFeature為黑白目標圖像,白色為前景,黑色為背景
// 注意此函數會修改m_imgFeature內容。若其不可更改,應另建立副本
// 1. count contour
CvMemStorage* storage = 0;
storage = cvCreateMemStorage(0);???????? //開辟默認大小的空間
CvSeq* contour = 0;
cvFindContours( m_imgFeature, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );?????? // 查找外邊緣
int num = 0;
for( ; contour != 0; contour = contour->h_next )
{
?? CvRect rect;
?? rect = cvBoundingRect(contour,0);?????? // 轉化為點列
?? m_arrLine.SetSize(num+1);
?? m_arrLine.GetAt(num).SetLine(rect.x,rect.x+rect.width ,rect.y,rect.y+rect.height);
?? num = num+1;??
???? for( i = 0; i < contour->total; i++ )
???? {
??????? CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i);
??????? cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
??? }
}
// .release
cvReleaseMemStorage(&storage);
//end of code
cvFindContours的第5個參數
CV_RETR_EXTERNAL??? 查找外邊緣,各邊緣以指針h_next相連
CV_RETR_LIST?????????????? 查找所有邊緣(包含內部空洞),各邊緣以指針h_next相連
CV_RETR_CCOMP???????? 查找所有邊緣(包含內部空洞)
轉自:http://blog.sina.com.cn/s/blog_4bc179a80100hs50.html
?
cvFindContours函數使用說明
函數cvFindContours從二值圖像中檢索輪廓,并返回檢測到的輪廓的個數。first_contour的值由函數填充返回,它的值將為第一個外輪廓的指針,當沒有輪廓被檢測到時為NULL。其它輪廓可以使用h_next和v_next連接,從first_contour到達。
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
? ?? ?? ?? ?? ?? ???int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
? ?? ?? ?? ?? ?? ???int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
image
8比特單通道的源二值圖像。非零像素作為1處理,0像素保存不變。從一個灰度圖像得到二值圖像的函數有:cvThreshold,cvAdaptiveThreshold和cvCanny。
storage
返回輪廓的容器。
first_contour
輸出參數,用于存儲指向第一個外接輪廓。
header_size
header序列的尺寸.如果選擇method = CV_CHAIN_CODE, 則header_size >= sizeof(CvChain);其他,則
header_size >= sizeof(CvContour)。
mode
檢索模式,可取值如下:
CV_RETR_EXTERNAL:只檢索最外面的輪廓;
CV_RETR_LIST:檢索所有的輪廓,并將其放入list中;
CV_RETR_CCOMP:檢索所有的輪廓,并將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;
CV_RETR_TREE:檢索所有的輪廓,并重構嵌套輪廓的整個層次。
method
邊緣近似方法(除了CV_RETR_RUNS使用內置的近似,其他模式均使用此設定的近似算法)。可取值如下:
CV_CHAIN_CODE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。
CV_CHAIN_APPROX_NONE:將所有的連碼點,轉換成點。
CV_CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函數只保留他們的終點部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法
的一種。
CV_LINK_RUNS:通過連接水平段的1,使用完全不同的邊緣提取算法。使用CV_RETR_LIST檢索模式能使用此方法。
offset
偏移量,用于移動所有輪廓點。當輪廓是從圖像的ROI提取的,并且需要在整個圖像中分析時,這個參數將很有用。
討論部分cvDrawContours中的案例顯示了任何使用輪廓檢測連通區域。輪廓可以用于形狀分析和目標識別——可以參考文件夾OpenCV sample中的squares.c。
總結
以上是生活随笔為你收集整理的opencv使用cvFindContours提取联通域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV编程案例:使用轮廓函数检测连
- 下一篇: C++中MessageBox的常见用法