【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学习】椭圆拟合

时间: 2024-09-15 13:09:37

【OpenCV】椭圆拟合的相关文章

OPENCV为什么提示cvFitEllipse未定义标识符

问题描述 OPENCV为什么提示cvFitEllipse未定义标识符 cvFitEllipse(PointArray2D32f,count,box); 为什么老是提示cvFitEllipse为未定义标识符 解决方案 是不是环境没有配置好?里面有include 的头文件,另外,代码中是不是声明了using namespace cv? 解决方案二: ,这个就是你头文件没有引用,或者对应模块的lib没有包含在工程编译 解决方案三: 动态链接库没导入,请查证你的动态库 解决方案四: #include "

【持续更新】opencv sample分类

1.视频处理例程 颜色跟踪: camshiftdemo 点跟踪: lkdemo 动作分割: motempl 边缘检测: laplace 2.图像处理例程 边缘检测: edge 图像分割: pyramid_segmentation 形态学: morphology 直方图: demhist 距离变换: distrans 椭圆拟合: fitellipse

苹果获得三项重要多点触控相关专利技术

苹果获得多点触控感应设备和手段的专利 北京时间10月14日上午消息,据国外媒体报道,美国专利和商标局周三正式公布了苹果新近获得的18项专利技术.当中最为重要的则是苹果智能设备配备的多点触控技术专利.苹果此次获得了三项重量级的多点触控相关专利. 这些技术涉及的多点触控显示屏可以探测到超过两个手指的动作,追踪多个手指和手掌的触碰,其使用的 传感器可以史无前例地整合打字.点击.滑动以及三维操作.其中一项专利将使得多点触控技术应用范围从当前的iPod.iPhone和iPad产品最终扩大至MacBook和

苹果起诉摩托罗拉侵犯六项iPhone专利

本报讯 据国外媒体报道,正如预料的那样,苹果提出自己的法律诉讼对摩托罗拉的法律诉讼做出回应,指控摩托罗拉侵犯了iPhone中的6项与多点触控有功能有关的专利. 苹果星期五在威斯康星州西部地区的法院提出了两个诉讼,试图向法院证明摩托罗拉侵犯了iPhone最先使用的与多点触控功能有关的6项专利. 苹果在诉状中指出许多摩托罗拉流行的手机侵犯了专利.这些手机型号包括摩托罗拉的Droid.Droid 2.Droid X.Cliq.Cliq XT.BackFlip.Devour A555.Devour i1

【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

1.1.4-学习Opencv与MFC混合编程之---画图工具 画椭圆

源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961690 1.    增加'椭圆'菜单项,设置属性,添加类向导: 2.    编辑消息处理函数,设置画图变量标识my_draw_flag为5,并读取对话框里的数据. 3.    修改OnMouseMove消息处理函数. 3.1增加变量CvSize  CvSize EllipseSize; 3.2           case 5的编程:          case 5:            

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改.      Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria).      其中probImage为输入图像直方图的反向投影

python opencv 绘制简单图形

09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结果 参考 概述 本节实现的是使用OpenCV里自带的函数,绘制直线.长方形.圆形和椭圆. 绘制直线 绘制长方形 绘制圆形 绘制椭圆 添加文字 实现过程 引用与创建空图 不再赘述,代码如下. import cv2 import numpy # empty image img = np.zeros((5

OpenCV实时美颜摄像并生成H264视频流

        为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者ffmpeg才能使用. 最近有个小需求,要推送直播视频流,我在网上查了一下有live555或者用librtmp来推送,但是前者还需要修改源代码,也挺麻烦的,现在先做到了下面几个步骤: 1.OpenCV捕捉摄像头的图像 2.进行识别需要美颜的部分(人脸识别,肤色识别) 3.进行美颜(提升