使用OpenCV查找二值图中最大连通区域

时间:2022-11-09 07:23:58

http://blog.csdn.net/shaoxiaohu1/article/details/40272875

标签: OpenCVfindCoutours
2014-10-19 22:31 2802人阅读 评论(0) 收藏 举报
使用OpenCV查找二值图中最大连通区域 分类:
图像与OpenCV(15) 使用OpenCV查找二值图中最大连通区域

版权声明:本文为shaoxiaohu原创文章,欢迎转载,请注明出处,谢谢。

上一篇博文中介绍了matlab查找最大连通区域的方法,OpenCV函数中也有类似的函数与之对应,findCoutours。下面代码为使用示例:

  1. cv::Mat bwImg;
  2. vector<vector<cv::Point>> contours ;
  3. // 二值化图像
  4. cv::threshold(srcImg, bwImg, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);
  5. cv::imshow("binary image", bwImg);
  6. cv::waitKey();
  7. // 查找轮廓,对应连通域
  8. cv::findContours(bwImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
  9. // 寻找最大连通域
  10. double maxArea = 0;
  11. vector<cv::Point> maxContour;
  12. for(size_t i = 0; i < contours.size(); i++)
  13. {
  14. double area = cv::contourArea(contours[i]);
  15. if (area > maxArea)
  16. {
  17. maxArea = area;
  18. maxContour = contours[i];
  19. }
  20. }
  21. // 将轮廓转为矩形框
  22. cv::Rect maxRect = cv::boundingRect(maxContour);
  23. // 显示连通域
  24. cv::Mat result1, result2;
  25. bwImg.copyTo(result1);
  26. bwImg.copyTo(result2);
  27. for (size_t i = 0; i < contours.size(); i++)
  28. {
  29. cv::Rect r = cv::boundingRect(contours[i]);
  30. cv::rectangle(result1, r, cv::Scalar(255));
  31. }
  32. cv::imshow("all regions", result1) ;
  33. cv::waitKey();
  34. cv::rectangle(result2, maxRect, cv::Scalar(255));
  35. cv::imshow("largest region", result2) ;
  36. cv::waitKey();