01. CvSeq* contour = NULL;
02. double minarea = 100.0;
03. double tmparea = 0.0;
04.CFileDialog dlg(true);
05.if (dlg.DoModal()==IDOK)
06.{
07. CvMemStorage* storage = cvCreateMemStorage(0);
08.
09. IplImage* img_src= cvLoadImage(dlg.GetPathName(),CV_LOAD_IMAGE_ANYCOLOR);
10. IplImage* img_Clone=cvCloneImage(img_src);
11. //访问二值图像每个点的值
12. uchar *pp;
13. //显示原始图像
14. cvNamedWindow("img_src",CV_WINDOW_AUTOSIZE);
15. cvShowImage("img_src", img_src);
16.
17. IplImage* img_dst = cvCreateImage(cvGetSize(img_src),IPL_DEPTH_8U,1);
18.
19. //------------搜索二值图中的轮廓,并从轮廓树中删除面积小于某个阈值minarea的轮廓-------------//
20. CvScalar color = cvScalar(255,0,0);//CV_RGB(128,0,0);
21. CvContourScanner scanner = NULL;
22.scanner = cvStartFindContours(img_src,storage,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
23. //开始遍历轮廓树
24. CvRect rect;
25. while (contour=cvFindNextContour(scanner))
26. {
27. tmparea = fabs(cvContourArea(contour));
28. rect = cvBoundingRect(contour,0);
29. if (tmparea < minarea/*||tmparea>4900*/)
30. {
31.
32. //当连通域的中心点为黑色时,而且面积较小则用白色进行填充
33. pp=(uchar*)(img_Clone->imageData + img_Clone->widthStep*(rect.y+rect.height/2)+rect.x+rect.width/2);
34. if (pp[0]==0)
35. {
36. for(int y = rect.y;y<rect.y+rect.height;y++)
37. {
38. for(int x =rect.x;x<rect.x+rect.width;x++)
39. {
40. pp=(uchar*)(img_Clone->imageData + img_Clone->widthStep*y+x);
41.
42. if (pp[0]==0)
43. {
44. pp[0]=255;
45. }
46. }
47. }
48. }
49.
50. }
51. }
52.cvSaveImage("c:\\temp\\aav.bmp",img_Clone);