Opencv提取连通区域轮廓的方法分享!

本文实例为大家分享了Opencv提取连通区域轮廓的具体代码,供大家参考,具体内容如下

在进行图像分割后,可能需要对感兴趣的目标区域进行提取,比较常用的方法是计算轮廓。

通过轮廓可以获得目标的一些信息:

(1)目标位置

(2)目标大小(即面积)

(3)目标形状(轮廓矩)

当然,轮廓不一定代表希望目标区域,阈值分割时可能造成一部分信息丢失,因此可以计算轮廓的质心坐标,再进行漫水填充。

程序中有寻找质心+填充,但效果不好,因此就不放填充后的图了。

Opencv提取连通区域轮廓的方法

实验结果:

  #include "opencv2/imgproc/imgproc.hpp"  #include "opencv2/highgui/highgui.hpp"  #include <stdio.h>     using namespace cv;  using namespace std;     vector<vector<Point> > contours; //轮廓数组  vector<Point2d> centers; //轮廓质心坐标   vector<vector<Point> >::iterator itr; //轮廓迭代器  vector<Point2d>::iterator itrc; //质心坐标迭代器  vector<vector<Point> > con; //当前轮廓        int main()  {   double area;   double minarea = 100;   double maxarea = 0;   Moments mom; // 轮廓矩   Mat image,gray,edge,dst;   namedWindow("origin");   namedWindow("connected_region");      image = imread("view.jpg");   cvtColor(image, gray, COLOR_BGR2GRAY);   blur(gray, edge, Size(3,3)); //模糊去噪   threshold(edge,edge,200,255,THRESH_BINARY); //二值化处理      /*寻找轮廓*/   findContours( edge, contours,   CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );   itr = contours.begin(); //使用迭代器去除噪声轮廓   while(itr!=contours.end())   {   area = contourArea(*itr);   if(area<minarea)   {   itr = contours.erase(itr); //itr一旦erase,需要重新赋值   }   else   {   itr++;   }   if (area>maxarea)   {   maxarea = area;   }   }   dst = Mat::zeros(image.rows,image.cols,CV_8UC3);      /*绘制连通区域轮廓,计算质心坐标*/   Point2d center;   itr = contours.begin();   while(itr!=contours.end())   {   area = contourArea(*itr);   con.push_back(*itr);   if(area==maxarea)   drawContours(dst,con,-1,Scalar(0,0,255),2); //最大面积红色绘制   else   drawContours(dst,con,-1,Scalar(255,0,0),2); //其它面积蓝色绘制   con.pop_back();      //计算质心   mom = moments(*itr);   center.x = (int)(mom.m10/mom.m00);   center.y = (int)(mom.m01/mom.m00);   centers.push_back(center);      itr++;   }   imshow("origin",image);   imshow("connected_region",dst);   waitKey(0);      /*漫水填充连通区域*/   Point2d seed;   int new_scalar = 0;   int loDiff = 8, upDiff = 8;   int connectivity = 4;       itrc = centers.begin();   while(itrc!=centers.end())   {    seed = *itrc;   floodFill(image,seed,Scalar::all(new_scalar),NULL,   Scalar::all(loDiff),Scalar::all(upDiff),connectivity);   itrc++;   }      waitKey(0);   return 0 ;  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解Opencv提取连通区域轮廓的方法分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482707.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐