OpenCV计算连通区域数目与最大连通区域并标示出

来源:互联网 发布:amaze ui 知乎 编辑:程序博客网 时间:2024/06/06 06:46
  1. #include <stdio.h>
  2. #include <cv.h>
  3. #include <highgui.h>
  4. #pragma comment(lib, "cv.lib")
  5. #pragma comment(lib, "cxcore.lib")
  6. #pragma comment(lib, "highgui.lib")
  7. int main( int argc, char** argv )
  8. {
  9. IplImage* src = cvLoadImage(".\\wind.png", CV_LOAD_IMAGE_GRAYSCALE);
  10. IplImage* dst = cvCreateImage(cvGetSize(src), 8, 3);
  11. CvMemStorage* storage = cvCreateMemStorage(0);
  12. CvSeq* contour = 0;
  13. cvThreshold(src, src,120, 255, CV_THRESH_BINARY); // 二值化
  14. cvNamedWindow("Source", 1);
  15. cvShowImage("Source", src);
  16. // 提取轮廓
  17. int contour_num = cvFindContours(src, storage, &contour,sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
  18. cvZero(dst); // 清空数组
  19. CvSeq *_contour = contour;
  20. double maxarea = 0;
  21. double minarea = 100;
  22. int m = 0;
  23. for( ; contour != 0; contour = contour->h_next )
  24. {
  25. double tmparea = fabs(cvContourArea(contour));
  26. if(tmparea < minarea)
  27. {
  28. cvSeqRemove(contour, 0); // 删除面积小于设定值的轮廓
  29. continue;
  30. }
  31. CvRect aRect = cvBoundingRect( contour, 0 );
  32. if ((aRect.width/aRect.height)<1)
  33. {
  34. cvSeqRemove(contour, 0); //删除宽高比例小于设定值的轮廓
  35. continue;
  36. }
  37. if(tmparea > maxarea)
  38. {
  39. maxarea = tmparea;
  40. }
  41. m++;
  42. // 创建一个色彩值
  43. CvScalar color = CV_RGB( 0, 255, 255 );
  44. //max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓
  45. //如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种
  46. //如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓
  47. cvDrawContours(dst, contour, color, color, -1, 1, 8); //绘制外部和内部的轮廓
  48. }
  49. contour = _contour;
  50. int count = 0;
  51. for(; contour != 0; contour = contour->h_next)
  52. {
  53. count++;
  54. double tmparea = fabs(cvContourArea(contour));
  55. if (tmparea == maxarea)
  56. {
  57. CvScalar color = CV_RGB( 255, 0, 0);
  58. cvDrawContours(dst, contour, color, color, -1, 1, 8);
  59. }
  60. }
  61. printf("The total number of contours is:%d", count);
  62. cvNamedWindow("Components", 1);
  63. cvShowImage("Components", dst);
  64. cvWaitKey(0);
  65. cvDestroyWindow("Source");
  66. cvReleaseImage(&src);
  67. cvDestroyWindow("Components");
  68. cvReleaseImage(&dst);
  69. return 0;
  70. }

0 0
原创粉丝点击