作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
/**************提取模式. CV_RETR_EXTERNAL - 只提取最外層的輪廓 CV_RETR_LIST - 提取所有輪廓,並且放置在 list 中 CV_RETR_CCOMP - 提取所有輪廓,並且將其組織為兩層的 hierarchy: 頂層為連通域的外圍邊界,次層為洞的內層邊界。 CV_RETR_TREE - 提取所有輪廓,並且重構嵌套輪廓的全部 hierarchy method *********************************/ #include "highgui.h" #include "cv.h" #include <iostream> #include <iomanip> using namespace std; int main() { int i=0; int mode=CV_RETR_EXTERNAL;//提取輪廓的模式 int contours_num=0;//圖像中提取輪廓的數目 CvMemStorage *storage=cvCreateMemStorage(0);//設置輪廓時需要的存儲容器 CvSeq *contour =0;//設置存儲提取的序列指針 IplImage *img=cvLoadImage("lena.jpg",0); cvThreshold(img,img,128,255,CV_THRESH_BINARY);//二值化 IplImage *pContourImg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U,3); cvNamedWindow("windows",1); cvShowImage("windows",img);//顯示二值圖 /*cvFindContours查找物體輪廓*/ mode=CV_RETR_EXTERNAL;//提取物體最外層輪廓 contours_num=cvFindContours(img,storage,&contour, sizeof(CvContour),mode,CV_CHAIN_APPROX_NONE); cout<<"檢測出的輪廓數目為:"<<contours_num<<" "<<endl; /*逐點將輪廓畫出*/ CvSeqReader reader;//讀序列 int count=0; if (contour!=0) { count=contour->total; cout<<count<<endl; } cvStartReadSeq(contour,&reader,0); CvPoint pt1; CvScalar color=CV_RGB(255,255,255); cvNamedWindow("contour",1); cvShowImage("contour",pContourImg); for (i=0;i<count;i++)//逐點繪圖法 { CV_READ_SEQ_ELEM(pt1,reader);//讀出一個點 cvCircle(pContourImg,pt1,1,color);//畫出一個點(就是一個以一個像素大小為半徑的圓) cvShowImage("contour",pContourImg); cvWaitKey(5); } cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&pContourImg); cvReleaseMemStorage(&storage); return 0; }