代码:
#include <cv.h> #include <cxcore.h> #include <highgui.h> #include <cvaux.h> #include <iostream> using namespace std; int main() { IplImage *src = cvLoadImage("f:\\images\\test2.bmp",CV_LOAD_IMAGE_GRAYSCALE); IplImage *dst = cvCreateImage(cvGetSize(src),8,3);cvZero(dst); CvMemStorage *storage = cvCreateMemStorage(); CvSeq *contour = NULL , *hull = NULL; CvContourScanner scanner = cvStartFindContours(src,storage); while((contour = cvFindNextContour(scanner)) != NULL){ cvDrawContours(dst,contour,CV_RGB(255,0,0),CV_RGB(0,255,0),0); cout<<cvCheckContourConvexity(contour)<<endl; hull = cvConvexHull2(contour,0,CV_CLOCKWISE,0); CvPoint pt0 = **(CvPoint**)cvGetSeqElem(hull,hull->total - 1); for(int i = 0;i<hull->total;++i){ CvPoint pt1 = **(CvPoint**)cvGetSeqElem(hull,i); cvLine(dst,pt0,pt1,CV_RGB(0,0,255)); pt0 = pt1; } CvSeq *defect = cvConvexityDefects(contour,hull); for(int i = 0;i<defect->total;++i){ CvConvexityDefect df = *(CvConvexityDefect*)cvGetSeqElem(defect,i); cvCircle(dst,*df.start,2,CV_RGB(255,255,0),-1); cvCircle(dst,*df.end,2,CV_RGB(255,255,0),-1); cvCircle(dst,*df.depth_point,2,CV_RGB(0,255,255),-1); } cvShowImage("dst",dst); cvWaitKey(); } cvEndFindContours(&scanner); }