opencv使用cvFindContours提取联通域
轉(zhuǎn)自:http://hi.baidu.com/irmosgarden/blog/item/8ce0174c54b307fad72afcbc.html
?
// m_imgFeature為黑白目標(biāo)圖像,白色為前景,黑色為背景
// 注意此函數(shù)會修改m_imgFeature內(nèi)容。若其不可更改,應(yīng)另建立副本
// 1. count contour
CvMemStorage* storage = 0;
storage = cvCreateMemStorage(0);???????? //開辟默認(rèn)大小的空間
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);?????? // 轉(zhuǎn)化為點(diǎn)列
?? 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個(gè)參數(shù)
CV_RETR_EXTERNAL??? 查找外邊緣,各邊緣以指針h_next相連
CV_RETR_LIST?????????????? 查找所有邊緣(包含內(nèi)部空洞),各邊緣以指針h_next相連
CV_RETR_CCOMP???????? 查找所有邊緣(包含內(nèi)部空洞)
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_4bc179a80100hs50.html
?
cvFindContours函數(shù)使用說明
函數(shù)cvFindContours從二值圖像中檢索輪廓,并返回檢測到的輪廓的個(gè)數(shù)。first_contour的值由函數(shù)填充返回,它的值將為第一個(gè)外輪廓的指針,當(dāng)沒有輪廓被檢測到時(shí)為NULL。其它輪廓可以使用h_next和v_next連接,從first_contour到達(dá)。
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像素保存不變。從一個(gè)灰度圖像得到二值圖像的函數(shù)有:cvThreshold,cvAdaptiveThreshold和cvCanny。
storage
返回輪廓的容器。
first_contour
輸出參數(shù),用于存儲指向第一個(gè)外接輪廓。
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:檢索所有的輪廓,并重構(gòu)嵌套輪廓的整個(gè)層次。
method
邊緣近似方法(除了CV_RETR_RUNS使用內(nèi)置的近似,其他模式均使用此設(shè)定的近似算法)。可取值如下:
CV_CHAIN_CODE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點(diǎn)的序列)。
CV_CHAIN_APPROX_NONE:將所有的連碼點(diǎn),轉(zhuǎn)換成點(diǎn)。
CV_CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函數(shù)只保留他們的終點(diǎn)部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法
的一種。
CV_LINK_RUNS:通過連接水平段的1,使用完全不同的邊緣提取算法。使用CV_RETR_LIST檢索模式能使用此方法。
offset
偏移量,用于移動所有輪廓點(diǎn)。當(dāng)輪廓是從圖像的ROI提取的,并且需要在整個(gè)圖像中分析時(shí),這個(gè)參數(shù)將很有用。
討論部分cvDrawContours中的案例顯示了任何使用輪廓檢測連通區(qū)域。輪廓可以用于形狀分析和目標(biāo)識別——可以參考文件夾OpenCV sample中的squares.c。
總結(jié)
以上是默认站点為你收集整理的opencv使用cvFindContours提取联通域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV编程案例:使用轮廓函数检测连
- 下一篇: C++中MessageBox的常见用法