www.diy567.com累了,去上面休息一下下,QQ空间,美文,非主流,网络日记,搞笑短信,祝福短信,热门短信,有意思啊
#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 ="rice.png";
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椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比opencv椭圆拟合长短轴比...
基于OpenCV的椭圆检测算法,通过边界处理、轮廓识别、椭圆拟合来检测椭圆,支持椭圆参数的自定义筛选
根据提供的文件信息,本文将详细解释“opencv椭圆拟合”的相关知识点,包括椭圆拟合的基本概念、在OpenCV中的实现方式以及代码的具体解析。 ### 椭圆拟合基本概念 椭圆拟合是一种从图像中提取轮廓并用椭圆形状来...
椭圆拟合是指通过一系列点来估计最佳拟合椭圆的过程。这个过程通常用于图像分析中,如目标检测、形状分析等领域。在OpenCV中,椭圆拟合可以通过`cvFitEllipse`函数实现。 ### 代码解读与实现细节 #### 基础概念...
OpenCV教程——基础篇,于仕琪著,这两天正在学习
OpenCV 提供了 `cv::fitEllipse()` 和 `cv::minEnclosingCircle()` 函数来拟合椭圆和最小外接圆,但它们并不直接适用于最小二乘法拟合圆。因此,我们需要自己编写算法或找到现有的实现,如提供的压缩包中的代码。 ...
OpenCV教程——基础篇.part1 作 者:于仕琪 刘瑞祯 编著
OpenCV教程——基础篇(刘瑞祯 于仕琪)---源代码
刘瑞祯的《OpenCV教程——基础篇》是一本面向初学者的优秀教材,旨在帮助读者快速掌握OpenCV的基础知识和实践技巧。这本书的实例源代码提供了丰富的实践案例,有助于读者深入理解理论概念。 本教程覆盖了OpenCV的...
通过阅读和理解这段代码,你可以深入理解最小二乘法直线拟合的概念,并学习如何在实际项目中应用。同时,比较自定义实现和OpenCV函数的结果,有助于进一步掌握这两种方法的异同。 总结来说,OpenCV3.3的最小二乘法...
标题“OpenCV教程——基础篇3”表明本文内容是关于计算机视觉库OpenCV(Open Source Computer Vision Library)的入门级教程的第三部分。OpenCV是一个开源的计算机视觉和机器学习软件库,由超过47,000个优化的算法...
3. 椭圆拟合算法:在MATLAB中,通常使用最小二乘法来拟合椭圆。在C++中,我们同样可以采用最小二乘法,但需要手动编写优化算法,如高斯-牛顿法或者Levenberg-Marquardt法。这些算法需要求解线性系统,可以使用Eigen...
OpenCV中的椭圆检测是通过一系列步骤来实现的,这些步骤涉及到图像预处理、轮廓提取以及椭圆拟合。以下是详细的知识点解释: 1. **图像预处理**:在检测椭圆之前,通常需要对原始图像进行预处理,包括灰度化、二值...
在visual studio上新建项目,将本程序添加到源文件目录下,直接运行即可,你可以用鼠标在改变控制点的位置观察探究bezier拟合出曲线的变化过程,还可以自行设置四个控制点,程序会自动拟合新的bezier曲线,你可以稍...
由于文件内容中存在大量OCR扫描图片,无法直接提供文字内容,但我可以根据标题、描述和标签提供一些关于“OpenCV教程——基础篇1”的知识点。 OpenCV是一个开源的计算机视觉和机器学习软件库,由英特尔公司发起并...
标题:“OpenCV教程——基础篇(第一版)”的知识点 描述:本书是于老师所著,主要针对初学者,对OpenCV进行了细致的讲解,是一本值得学习的教材。 标签:OpenCV OpenCV是一个开源的计算机视觉和机器学习软件库,...
计算机视觉课程作业(含图片、可执行文件以及OpenCV源代码) ... 拟合相应的圆以及椭圆 2. 每个拟合圆或椭圆的中心坐标,半径或长短轴长度; 3. 将主要的中间结果及最终拟合结果用OpenCV的cvShowImage显示出来
目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。