时间:2021-05-20
本文实例为大家分享了Opencv提取连通区域轮廓的具体代码,供大家参考,具体内容如下
在进行图像分割后,可能需要对感兴趣的目标区域进行提取,比较常用的方法是计算轮廓。
通过轮廓可以获得目标的一些信息:
(1)目标位置
(2)目标大小(即面积)
(3)目标形状(轮廓矩)
当然,轮廓不一定代表希望目标区域,阈值分割时可能造成一部分信息丢失,因此可以计算轮廓的质心坐标,再进行漫水填充。
程序中有寻找质心+填充,但效果不好,因此就不放填充后的图了。
实验结果:
#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 ;}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了Opencv处理图像之轮廓提取,使用cvfindContours对图像进行轮廓检测,供大家参考,具体内容如下#include#include
最近在OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。根据网上的教程,PythonOpenCV的轮廓提取函数会
今天在弄一个查找连通的最大面积的问题。要把图像弄成黑底,白字,这样才可以正确找到。然后调用下边的方法:RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构
本文实例为大家分享了Opencv轮廓外背景颜色改变的具体代码,供大家参考,具体内容如下自行学习弄得简单代码,使用了图像中的轮廓发现以及提取,再绘制出来,改变轮廓
利用opencv来识别图片中的矩形。其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合。1.对输入灰度图片进行高斯滤波2.做灰度直方图,提取阈值,做二值