直线拟合

来源:互联网 发布:热门网络歌曲500首 编辑:程序博客网 时间:2024/04/30 09:02

翻译自: http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV/%E7%9B%B4%E7%B7%9A%E3%81%AE%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0.html

 

OpenCV中 CvSeq 对象由以下语句生成

 

  //创建 CvSeq的容器对象

   CvMemStorage* storage = cvCreateMemStorage(0);

  // 创建 CvSeq对象  // 第一个参数  生成后的序列的标志( 不甚解)  // 第二个参数  队列(Sequence)头的Size  // 第三个参数  节点的Size  // 第四个参数  存储CvSeq的容器对象  CvSeq* point_seq = cvCreateSeq( CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage );

 

用完后,以下列形式释放内存

  cvClearSeq(point_seq);  cvReleaseMemStorage(&storage);向CvSeq中添加数据时:cvSeqPush(point_seq, &cvPoint2D32f(x坐标,y坐标));FitLine函数的用法:// 二维空间点拟合时 是 float[4]// 三位空间点拟合时 是 float[6]  float *line = new float[4];// 第一个参数: 存储点序列// 第二个参数: 拟合算法,其中 CV_DIST_L2 就是平常的最小二乘法// 第三,第四,第五参数推荐值是 0,   0.01,  0.01,// 第六参数: line中存储返回值// 二维空间时: line[0--3] 分别为 (vx, vy, x0, y0)//      其中 vx, vy 是正规化之后的斜率向量。 x0,y0 是直线经过的点。// 三维空间时: line[0--5]  分别是 (vx, vy, vz, x0,  y0, z0) 。意义同上 cvFitLine(point_seq,CV_DIST_L2,0,0.01,0.01,line);拟合程序::  #include <cv.h>  #include <stdio.h>  #include <math.h>  float myLinearity(CvSeq *);  int main(void)  {    int i;    double fx[] = {0.0, 0.301, 0.477, 0.602, 0.699, 0.778, 0.845, 0.903, 0.954, 1.0};    double fy[] = {3.874, 3.202, 2.781, 2.49, 2.274, 2.156, 1.934, 1.74, 1.653, 1.662};    float *line = new float[4];    float linearity=0.0f;    //Sequence的容器    CvMemStorage* storage = cvCreateMemStorage(0);    //三维空间的话,把CV_32FC2改为CV_32FC3、 把CvPoint2D32f 改为 CvPoint3D32f    CvSeq* point_seq = cvCreateSeq( CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage );    for (i=0; i<10; i++){      //向Sequence中追加元素      cvSeqPush(point_seq, &cvPoint2D32f(fx[i],fy[i]));    }    linearity = myLinearity(point_seq);    cvFitLine(point_seq,CV_DIST_L2,0,0.01,0.01,line);    fprintf(stdout,"v=(%f,%f),vy/vx=%f,(x,y)=(%f,%f), Linearity=%f/n",line[0],line[1],line[1]/line[0],line[2],line[3],linearity);    cvClearSeq(point_seq);    cvReleaseMemStorage(&storage);    return 0;  }  //计算直线拟合度  float myLinearity(CvSeq *seq)  {    int i;    CvPoint2D32f *p;    float *x = new float[seq->total];    float *y = new float[seq->total];    float x_bar=0.0, y_bar=0.0;    float u11=0.0, u20=0.0, u02=0.0;    float linearity=0.0;    for (i=0; i < seq->total; i++){      p=(CvPoint2D32f*)cvGetSeqElem(seq,i);      x[i]=p->x;      y[i]=p->y;    }    //x_bar, y_bar    for (i=0; i < seq->total; i++){      x_bar+=x[i];      y_bar+=y[i];    }    x_bar/=seq->total;    y_bar/=seq->total;    for (i=0; i < seq->total; i++){      u11+=((x[i]-x_bar)*(y[i]-y_bar));      u20+=pow(x[i]-x_bar,2.0f);      u02+=pow(y[i]-y_bar,2.0f);    }    u11/=seq->total;    u20/=seq->total;    u02/=seq->total;    //计算直线度    linearity = sqrt(4*pow(u11,2.0f)+pow(u20-u02,2.0f))/(u20+u02);    return linearity;  }**运行结果  v=(0.399377,-0.916787),vy/vx=-2.295543,(x,y)=(0.655900,2.376600), Linearity=0.999105
原创粉丝点击