`
king_c
  • 浏览: 225499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

opencv轮廓提取与轮廓拟合

 
阅读更多
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
	// Read input binary image
	Mat image= imread("./binaryGroup.bmp",0);
	if (!image.data)
		return 0; 

	namedWindow("Binary Image");
	imshow("Binary Image",image);

	// Get the contours of the connected components
	vector<vector<Point>> contours;
	//findContours的输入是二值图像
	findContours(image, 
		contours, // a vector of contours 
		CV_RETR_EXTERNAL, // retrieve the external contours
		CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours

	// Print contours' length轮廓的个数
	cout << "Contours: " << contours.size() << endl;
	vector<vector<Point>>::const_iterator itContours= contours.begin();
	for ( ; itContours!=contours.end(); ++itContours) {

		cout << "Size: " << itContours->size() << endl;//每个轮廓包含的点数
	}

	// draw black contours on white image
	Mat result(image.size(),CV_8U,Scalar(0));
	drawContours(result,contours,      //画出轮廓
		-1, // draw all contours
		Scalar(255), // in black
		2); // with a thickness of 2

	namedWindow("Contours");
	imshow("Contours",result);

	// Eliminate too short or too long contours
	int cmin= 100;  // minimum contour length
	int cmax= 1000; // maximum contour length
	vector<vector<Point>>::const_iterator itc= contours.begin();
	while (itc!=contours.end()) {

		if (itc->size() < cmin || itc->size() > cmax)
			itc= contours.erase(itc);
		else 
			++itc;
	}

	// draw contours on the original image
	Mat original= imread("./group.bmp");
	drawContours(original,contours,
		-1, // draw all contours
		Scalar(255,255,255), // in white
		2); // with a thickness of 2

	namedWindow("Contours on Animals");
	imshow("Contours on Animals",original);

	// Let's now draw black contours on white image
	//result.setTo(Scalar(0));
	//If the third parameter of this function is a negative value, then all contours are drawn.
	//Otherwise, it is possible to specify the index of the contour to be drawn
	drawContours(result,contours,
		-1, // draw all contours
		Scalar(255), // in black
		1); // with a thickness of 1
	image= imread("./binaryGroup.bmp",1);

	// testing the bounding box 
	Rect r0= boundingRect(Mat(contours[0]));//boundingRect获取这个外接矩形
	rectangle(result,r0,Scalar(255,255,255),2);

	// testing the enclosing circle 
	float radius;
	Point2f center;
	minEnclosingCircle(Mat(contours[1]),center,radius);//对轮廓进行多变形逼近
	circle(result,Point(center),static_cast<int>(radius),Scalar(255),2);

	RotatedRect rrect= fitEllipse(Mat(contours[2]));
	ellipse(result,rrect,Scalar(255),2);

	//testing the approximate polygon
	vector<Point> poly;
	approxPolyDP(Mat(contours[2]),poly,5,true);

	cout << "Polygon size: " << poly.size() << endl;

	//// Iterate over each segment and draw it
	vector<Point>::const_iterator itp= poly.begin();
	while (itp!=(poly.end()-1)) {
		line(result,*itp,*(itp+1),Scalar(255),2);
		++itp;
	}
	// last point linked to first point
	line(result,*(poly.begin()),*(poly.end()-1),Scalar(20),2);

	// testing the convex hull
	vector<Point> hull;
	convexHull(Mat(contours[3]),hull);

	// Iterate over each segment and draw it
	vector<Point>::const_iterator it= hull.begin();
	while (it!=(hull.end()-1)) {
		line(result,*it,*(it+1),Scalar(255),2);
		++it;
	}
	// last point linked to first point
	line(result,*(hull.begin()),*(hull.end()-1),Scalar(255),2);

	// testing the moments

	//iterate over all contours
	itc= contours.begin();
	while (itc!=contours.end()) {

		// compute all moments
		Moments mom= moments(Mat(*itc++));

		// draw mass center
		circle(result,
			// position of mass center converted to integer
			Point(mom.m10/mom.m00,mom.m01/mom.m00),
			2,Scalar(255),2); // draw black dot
	}

	namedWindow("Some Shape descriptors");
	imshow("Some Shape descriptors",result);

	// New call to findContours but with CV_RETR_LIST flag
	image= imread("./binaryGroup.bmp",0);

	// Get the contours of the connected components
	findContours(image, 
		contours, // a vector of contours 
		CV_RETR_LIST, // retrieve the external and internal contours
		CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours

	// draw black contours on white image
	result.setTo(Scalar(0));
	drawContours(result,contours,
		-1, // draw all contours
		Scalar(255), // in black
		2); // with a thickness of 2
	namedWindow("All Contours");
	imshow("All Contours",result);

	waitKey();
	return 0;
}

 一、对于相对路径的读取

./ 表示当前目录下,即cpp所在目录下。

../表示上一目录

二、  group.bmp                  binaryGroup.bmp

 groupbinaryGroup

分享到:
评论

相关推荐

    fitContours_opencv_图像轮廓提取_图像轮廓拟合_

    "fitContours"是OpenCV中一个关键的函数,它涉及到图像轮廓提取和拟合,这对于理解和分析图像中的形状至关重要。本篇文章将深入探讨这两个概念及其在实际应用中的作用。 首先,我们来看“图像轮廓提取”。在处理二...

    OpenCV笔记: 查找轮廓

    综上所述,“OpenCV笔记:查找轮廓”涵盖了从图像预处理到轮廓提取、分析的一系列技术,这些技术在实际项目中有着广泛的应用,如机器人导航、智能交通系统、医学图像分析等。通过学习和实践这些方法,开发者可以增强...

    基于opencv 的四边形轮廓跟踪

    本项目聚焦于“基于OpenCV的四边形轮廓跟踪”,这是一个关键的技术,广泛应用于对象检测、图像分割、视频分析等多种场景。我们将深入探讨如何在OpenCV中实现四边形轮廓的识别和追踪。 首先,我们需要理解轮廓的概念...

    opencv提取光斑质心

    总结来说,"opencv提取光斑质心"是一项涉及图像预处理、二值化、轮廓检测、形状特征计算以及亚像素定位的综合技术。通过熟练运用OpenCV,我们可以准确地找到图像中的亮点,并且在亚像素级别上定位它们,这对于需要高...

    C#结合Halcon,对图像(也可以拍照)进行轮廓提取并将其拟合矢量化

    在本文中,我们将深入探讨如何使用C#编程语言与HALCON机器视觉库相结合,实现图像的轮廓提取和矢量化操作。HALCON是一款强大的图像处理软件,广泛应用于工业自动化、质量检测等领域,而C#作为微软的.NET框架的一部分...

    opencv椭圆拟合

    椭圆拟合是一种从图像中提取轮廓并用椭圆形状来逼近这些轮廓的技术。这种技术广泛应用于计算机视觉领域,比如物体识别、目标跟踪等场景。通过椭圆拟合,可以有效地减少噪声的影响,同时简化物体边缘的信息,从而提高...

    opencv 椭圆拟合

    椭圆拟合是OpenCV中的一个重要功能,尤其在轮廓分析和目标识别中有广泛的应用。 ### 椭圆拟合简介 椭圆拟合是指通过一系列点来估计最佳拟合椭圆的过程。这个过程通常用于图像分析中,如目标检测、形状分析等领域。...

    opencv拟合指定大小的椭圆及测试

    用opencv231+vs2008编写的一个拟合椭圆的程序,输入 是二值图,背景是黑色的,还有一个输入是轮廓的面积,能够剔除不需要要轮廓。代码中能测试选定的待拟合的轮廓(已注释),并把轮廓参数输出并测试。

    轮廓提取图像处理

    在VC++中,我们可以利用OpenCV库来实现轮廓提取。OpenCV是一个强大的开源计算机视觉库,它包含了丰富的图像处理和计算机视觉函数,包括各种边缘检测和轮廓提取算法。 4. **使用OpenCV进行轮廓提取** - 首先,我们...

    基于OpenCV的圆形标记点的提取

    【椭圆拟合】是将轮廓数据拟合成一个最佳椭圆模型的过程,OpenCV 提供的椭圆拟合算法可以根据边缘像素点的信息计算出最接近的椭圆参数,从而确定圆心坐标。 【中心坐标计算】是提取圆形标记点的关键,一旦椭圆拟合...

    aaa.zip_椭圆拟合_轮廓拟合

    在完成轮廓提取后,可以进一步应用椭圆拟合来分析这些轮廓,特别是当轮廓近似于椭圆形时,这种方法特别有效。 `aaa.zip`中的`aaa.txt`源代码很可能是用Python或其他编程语言实现的椭圆和轮廓拟合算法。代码可能包含...

    test9.zip_opencv 寻找mark_opencv 椭圆检测_opencv圆形 拟合_site:www.pudn.co

    在“test9.zip”压缩包中,可能包含了实现这一系列操作的代码示例,包括预处理图像、边缘检测、轮廓提取、几何约束和椭圆拟合等各个阶段的代码片段。通过学习和理解这些代码,开发者可以掌握如何在自己的项目中实现...

    基于opencv的激光线中心提取源码

    源码中可能会用到OpenCV的`cv::imread`读取图像,`cv::cvtColor`进行颜色空间转换,`cv::threshold`进行二值化,`cv::findContours`提取轮廓,以及`cv::fitLine`或`cv::HoughLines`进行线拟合等函数。通过阅读和理解...

    opencv椭圆拟合长短轴比

    用椭圆拟合轮廓,并求长短轴比,主要应用于模式识别中的特征提取

    longquan.rar_opencv 中心_opencv 坐标_图像椭圆拟合_椭圆中心检测_椭圆轮廓检测

    本示例着重讨论了如何使用OpenCV C++库进行二值化、形态学操作(如腐蚀)、轮廓检测、椭圆拟合以及椭圆的中心和轮廓检测。下面我们将深入探讨这些关键知识点。 1. **二值化**: 二值化是将图像转化为黑白两色的...

    opencv 编写程序-寻找轮廓

    标签“opencv 寻找轮廓”表明这是一个专注于OpenCV库和轮廓提取的主题。压缩包内的“第4章-寻找轮廓”可能包含该主题的详细教程、代码示例或练习,帮助学习者理解和实践轮廓检测技术。 总的来说,掌握OpenCV中的...

    基于opencv3.2+VS 提取目标光斑质量心

    本教程主要基于OpenCV 3.2版本与Visual Studio环境,详细阐述如何实现多形态目标的亚像素级别的质心提取,这对于精确的目标定位和分析在工业应用中具有广泛价值。 首先,了解质心的基本概念。质心是物体所有像素...

    Find.rar_Opencv 椭圆_opencv 椭圆检测_opencv椭圆识别_椭圆_椭圆检测

    OpenCV中的椭圆检测是通过一系列步骤来实现的,这些步骤涉及到图像预处理、轮廓提取以及椭圆拟合。以下是详细的知识点解释: 1. **图像预处理**:在检测椭圆之前,通常需要对原始图像进行预处理,包括灰度化、二值...

    基于Java OpenCV技术对几何图像颜色与形状识别.pdf

    7. 轮廓提取和形状拟合:文章使用了OpenCV中的算法对图像进行轮廓提取和形状拟合,以判别几何图像的形状。 8. 凸点距离判断:文章使用了凸点距离判断来判别几何图像的形状。 9. HSV颜色空间的优点:文章指出了HSV...

Global site tag (gtag.js) - Google Analytics