在二值圖像中尋找輪廓
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) );
函數 cvFindContours 從二值圖像中提取輪廓,並且返回提取輪廓的數目。指針 first_contour 的內容由函數填寫。它包含第一個最外層輪廓的指針,如果指針為 NULL,則沒有檢測到輪廓(比如圖像是全黑的)。其它輪廓可以從 first_contour 利用 h_next 和 v_next 鏈接訪問到。 在 cvDrawContours 的樣例顯示如何使用輪廓來進行連通域的檢測。輪廓也可以用來做形狀分析和對象識別 - 見CVPR2001 教程中的 squares 樣例。該教程可以在 SourceForge 網站上找到。
在圖像中繪制外部和內部的輪廓。 voidcvDrawContours( CvArr *img, CvSeq* contour, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int line_type=8, CvPoint offset=cvPoint(0,0) );
當thickness>=0,函數cvDrawContours在圖像中繪制輪廓,或者當thickness<0時,填充輪廓所限制的區域。
#include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* src; // 第一條命令行參數確定了圖像的文件名。 if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0) { IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contour = 0; cvThreshold( src, src, 1, 255, CV_THRESH_BINARY ); cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); cvZero( dst ); for( ; contour != 0; contour = contour->h_next ) { CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 ); /* 用1替代 CV_FILLED 所指示的輪廓外形 */ cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 ); } cvNamedWindow( "Components", 1 ); cvShowImage( "Components", dst ); cvWaitKey(0); } }
在樣本中用1替代 CV_FILLED 以指示的得到外形。
double cvContourArea( const CvArr* contour, CvSliceslice=CV_WHOLE_SEQ );
函數cvContourArea計算整個或部分輪廓的面積。在計算部分輪廓的情況時,由輪廓弧線和連接兩端點的弦
圍成的區域總面積被計算,如下圖所示:
NOTE:
輪廓的位置將影響區域面積的符號,因此函數范圍的有可能是負值。可以使用C運行時函數fabs()來
得到面積的絕對值。
e.g. double area = fabs(cvContourArea(contour));
計算點集的最外面(up-right)矩形邊界
CvRect cvBoundingRect( CvArr* points, int update=0 );
函數 cvBoundingRect 返回二維點集的最外面 (up-right)矩形邊界。