// 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 查找所有邊緣(包含內部空洞),按照如下方式組織
藍色表示v_next,綠色表示h_next