opencv 椭圆拟合

转载 2012年03月25日 20:56:43
#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);
}

相关文章推荐

opencv3用椭圆拟合二维点集-fitEllipse函数

#include #include #include using namespace cv; using namespace std; int main() { Mat srcImage(Siz...

opencv最小二成拟合椭圆算法

//传入样本点,返回椭圆的5个参数 vector getEllipsepar(vector vec_point) {     vector vec_result;     double  x3...

根据一组点拟合曲线(需要opencv库)

matlab中跟据点拟合方程灰常容易,直接使用polyfit函数就行了。C++貌似没有直接拟合曲线的函数,在下不才,就用C++结合opencv的库函数写了个拟合曲线的函数。 #include #...

曲线拟合的最小二乘法(基于OpenCV实现)

在科学实验数据处理中,往往要根据一组给定的实验数据,求出自变量x与因变量y的函数关系,这是为待定参数,由于观测数据总有误差,且待定参数ai的数量比给定数据点的数量少(即n<m),因此它不同于插值问题....

opencv学习心得九----椭圆拟合

首先是椭圆拟合函数 cvFitEllipse(PointArray2D32f, count, box);

详细解析-椭圆曲线拟合

效果图: 拖动滑动条,你会有惊喜发现,呵呵。。 //相关头文件包含 #include "cv.h" #include "highgui.h" //滑动条的默认值 int slide...

OpenCV画轮廓的外界圆矩形椭圆等

#include #include #include #include using namespace std; #pragma comment(lib,"cv....

Opencv的Ellipse函数

Ellipse 绘制椭圆圆弧和椭圆扇形。 void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle, ...
  • gxiaob
  • gxiaob
  • 2013-07-21 15:42
  • 15734
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)