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

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

 

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

标签: OpenCVfindCoutours
 分类:
 

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

 

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

 

 

posted @ 2016-03-01 10:23  donaldlee  阅读(7299)  评论(0编辑  收藏  举报