【OpenCV】椭圆拟合

简介:

直接上代码吧:

#include "cv.h"
#include "highgui.h"

int slider_pos=70;//阈值

IplImage *image02 =0,*image03 = 0,*image04 = 0;
void process_image(int h);

int main(int argc ,char **argv)
{
	//const char *filename ="binaryGroup.bmp";
	const char *filename ="003.jpg";
	if ((image03 = cvLoadImage(filename,0))==0)//读入图像为灰度图像
	{
		return -1;
	}
	image02 = cvCloneImage(image03);
	image04 = cvCloneImage(image03);

	cvNamedWindow("Source",1);
	cvNamedWindow("Result",1);

	cvShowImage("Source",image03);

	cvCreateTrackbar("Threshold","Result",&slider_pos,255,process_image);

	process_image(0);

	cvWaitKey(0);
	cvSaveImage("1.jpg",image04);

	cvReleaseImage(&image02);
	cvReleaseImage(&image03);

	cvDestroyWindow("Source");
	cvDestroyWindow("Result");
	return 0;

}

//这个函数寻找出轮廓、用椭圆拟合画出
void process_image(int h)
{
	CvMemStorage *stor;
	CvSeq *cont;
	CvBox2D32f *box;
	CvPoint *PointArray;
	CvPoint2D32f *PointArray2D32f;

	stor = cvCreateMemStorage(0);
	cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);

	cvThreshold(image03,image02,slider_pos,255,CV_THRESH_BINARY);

	cvFindContours(image02,stor,&cont,sizeof(CvContour),
		CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

	cvZero(image02);
	cvZero(image04);

	//绘制所有轮廓并用椭圆拟合
	for (;cont;cont = cont ->h_next)
	{
		int i;
		int count= cont->total;//轮廓个数
		CvPoint center;
		CvSize size;

		/*个数必须大于6,这是cvFitEllipse_32f的要求*/
		if (count<6)
		{
			continue;
		}

		//分配内存给点集
		PointArray = (CvPoint *)malloc(count*sizeof(CvPoint));
		PointArray2D32f = (CvPoint2D32f*)malloc(count*sizeof(CvPoint2D32f));

		//分配内存给椭圆数据
		box = (CvBox2D32f *)malloc(sizeof(CvBox2D32f));

		//得到点集(这个方法值得借鉴)
		cvCvtSeqToArray(cont,PointArray,CV_WHOLE_SEQ);

		//将CvPoint点集转化为CvBox2D32f集合
		for (i=0;i<count;i++)
		{
			PointArray2D32f[i].x=(float)PointArray[i].x;
			PointArray2D32f[i].y=(float)PointArray[i].y;
		}

		//拟合当前轮廓
		cvFitEllipse(PointArray2D32f,count,box);

		//绘制当前轮廓
		cvDrawContours(image04,cont,CV_RGB(255,255,255),CV_RGB(255,255,255),
			0,1,8,cvPoint(0,0));

		//将椭圆数据从浮点转化为整数表示
		center.x = cvRound(box->center.x);
		center.y = cvRound(box->center.y);
		size.width = cvRound(box->size.width*0.5);
		size.height = cvRound(box->size.height*0.5);
		box->angle = -box->angle;

		//画椭圆
		cvEllipse(image04,center,size,box->angle,0,360,CV_RGB(0,0,255),1,CV_AA,0);

		free(PointArray);
		free(PointArray2D32f);
		free(box);
	}
	cvShowImage("Result",image04);
}





【OpenCV学习】椭圆拟合


相关文章
|
6月前
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
280 0
|
6月前
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
166 0
|
18天前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
38 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
6月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
439 0
|
计算机视觉
OpenCV-基本图形绘制(圆、矩形、椭圆)
OpenCV-基本图形绘制(圆、矩形、椭圆)
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1589 0
|
算法 API 图形学
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
1881 0
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
|
算法 机器人 定位技术
利用Robocon2018 比赛地图 + OpenCv + matplotlib拟合贝塞尔曲线,并且生成路径坐标点
原文链接 本文内容: 贝塞尔曲线简介 代码算法讲解 总结 贝塞尔曲线简介: 原理: Github上一位大佬已经总结得很详细了, 还有动态图的哦,,我这里就直接引用啦Github 计算公式: 此处引用简书一位大佬的总结:@L_Xian; 该大佬不仅解释了贝塞尔曲线的原理,还详细的推导了贝塞尔曲线各阶公式之间的联系。
1930 0
|
计算机视觉
1.1.4-学习Opencv与MFC混合编程之---画图工具 画椭圆
源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961690 1.    增加‘椭圆’菜单项,设置属性,添加类向导; 2.    编辑消息处理函数,设置画图变量标识my_draw_flag为5,并读取对话框里的数据。
780 0
|
计算机视觉
【OpenCV学习】椭圆拟合
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/   #include "cv.h" #include "highgui.h" int slider_pos=70;//阈值 IplImage *image02 =0,*image03 =...
866 0