typedef struct CvSeq
{
CV_SEQUENCE_FIELDS()
}
CvSeq;
#define CV_CONTOUR_FIELDS() \
CV_SEQUENCE_FIELDS() \
CvRect rect; \
int color; \
int reserved[3];
typedef struct CvContour
{
CV_CONTOUR_FIELDS()
}
CvContour;
則:CvContour比CvSeq多了如下三個(gè)參數(shù)
CvRect rect; \連通區(qū)域的外接矩形
int color; \
int reserved[3];
opencv輪廓的簡(jiǎn)單應(yīng)用:
相關(guān)函數(shù)如下:
cvFindContours,,cvThreshold,cvContourArea,,cvArcLength,,cvBoundingRect,,cvMinAreaRect2,cvBoxPoints,,cvMinEnclosingCircle,,cvDrawContours。
1.查找輪廓
2.按地址依次取出輪廓
3.計(jì)算輪廓的相關(guān)參數(shù)
4,、根據(jù)實(shí)際需求做取舍,,畫出輪廓
1.cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size CV_DEFAULT(sizeof(CvContour)),
int mode CV_DEFAULT(CV_RETR_LIST),
int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));
查找輪廓,返回查找到輪廓總數(shù),使用該函數(shù)時(shí)輸入圖像會(huì)被直接涂改,,如果是還有用的圖像,,應(yīng)復(fù)制后,傳遞圖像副本,,使用該函數(shù)前應(yīng)先將圖像轉(zhuǎn)化為二值化圖像,,可使用下面的函數(shù)
cvThreshold( const CvArr* src, CvArr* dst,
double threshold, double max_value,
int threshold_type );
2.for (CvSeq *c = first_contour;c !=NULL;c = c->h_next) {}
3.double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
contour:輪廓(頂點(diǎn)的序列或數(shù)組)。
slice:感興趣區(qū)輪廓部分的起點(diǎn)和終點(diǎn),,默認(rèn)計(jì)算整個(gè)輪廓的面積,。
函數(shù)cvContourArea計(jì)算整個(gè)或部分輪廓的面積。在計(jì)算部分輪廓的情況時(shí),,由輪廓弧線和連接兩端點(diǎn)的弦
圍成的區(qū)域總面積被計(jì)算,,如下圖所示:
注意:輪廓的位置將影響區(qū)域面積的符號(hào),因此函數(shù)范圍的有可能是負(fù)值,??梢允褂肅運(yùn)行時(shí)函數(shù)fabs()來(lái)
得到面積的絕對(duì)值。
cvArcLength( const void* curve,
CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ),
int is_closed CV_DEFAULT(-1));
計(jì)算輪廓長(zhǎng)度,。
cvBoundingRect( CvArr* points, int update CV_DEFAULT(0) );
計(jì)算輪廓的最小正外接矩形,,返回 CvRect,矩形邊界與圖形邊界平行
cvMinAreaRect2( const CvArr* points,
CvMemStorage* storage CV_DEFAULT(NULL));
計(jì)算輪廓的最小外接矩形,,返回 CvBox2D,矩形邊界可能與邊界有一點(diǎn)角度,,可通過(guò)
cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );獲取矩形的4個(gè)頂點(diǎn),,再依次連接頂點(diǎn)即可。
cvMinEnclosingCircle( const CvArr* points,
CvPoint2D32f* center, float* radius );
計(jì)算輪廓的最小外接圓,。
4.cvDrawContours( CvArr *img, CvSeq* contour,
CvScalar external_color, CvScalar hole_color,
int max_level, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));
畫出輪廓,。
cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2,
CvScalar color, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8),
int shift CV_DEFAULT(0));
畫出矩形。
如:cvRectangle(contourimage,cvPoint(testrect.x,testrect.y+testrect.height),cvPoint(testrect.x+testrect.width,testrect.y),cvScalar(0,0,0),2);
cvCircle( CvArr* img, CvPoint center, int radius,
CvScalar color, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0));
畫圓,。
cvLine( CvArr* img, CvPoint pt1, CvPoint pt2,
CvScalar color, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) );
畫線,。
最后結(jié)果如下圖:
測(cè)試圖像以及完整代碼下載:http://download.csdn.net/detail/z397164725/4055802