1.輪廓提取 FindContours算法
在二值圖像中尋找輪廓 int cvFindContours( CvArr* image, 數組
CvMemStorage* storage, 函數
CvSeq** first_contour, 網站
int header_size=sizeof(CvContour), ui
int mode=CV_RETR_LIST, spa
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 網站上找到。 翻譯
2.輪廓繪製 DrawContours指針
在圖像中繪製外部和內部的輪廓。
void cvDrawContours ( 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時,填充輪廓所限制的區域。對象
3. 輪廓面積 ContourArea
double cvContourArea( const CvArr* contour, CvSliceslice=CV_WHOLE_SEQ );
函數cvContourArea計算整個或部分輪廓的面積。在計算部分輪廓的狀況時,由輪廓弧線和鏈接兩端點的弦 圍成的區域總面積被計算,以下圖所示:
NOTE:
輪廓的位置將影響區域面積的符號,所以函數範圍的有多是負值。可使用C運行時函數fabs()來 獲得面積的絕對值。
e.g. double area = fabs(cvContourArea(contour));
4. 外接矩形 BoundingRect
計算點集的最外面(up-right)矩形邊界 CvRect cvBoundingRect( CvArr* points, int update=0 );
函數 cvBoundingRect 返回二維點集的最外面 (up-right)矩形邊界。
/**********************************************************************************/
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* src;
// 第一條命令行參數肯定了圖像的文件名。
if( (src = cvLoadImage("D:\\OpenCV_Test\\res\\women.jpg", 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);
}
}
/**********************************************************************************/