FitLine+直线拟合+C++

做毕业论文中我用Opencv中的void cvFitLine( const CvArr* points, int dist_type, double param,
double reps, double aeps, float* line )做直线拟合,寻找一幅图像中的直线的倾斜度(斜率)和直线与图像中心的位移偏差,始终不出结果。搜了好多网址找到了两个这个函数的使用例子,但是我发现还是不好用,编译提示points类型错误。无奈之下自己写了一个直线拟合的C++程序,这个程序只是一个雏形。坐标点序列输入还很繁琐,而且每次使用时必须输入坐标点对数。如果能做到只给出坐标数组就能输出线性函数参数(a,b)就很好了。在此我不做修改,希望你能把它升级,使它功能更强。请指教。

#include

#include

double* FitLine(double* x,double* y,int n)

{

   double K[2]={0.,0.};

   double sum[4]={0.,0.,0.,0.};

   for(int i=0;i

   {

             sum[0]+=x[i];

             sum[1]+=x[i]*x[i];

             sum[2]+=y[i];

             sum[3]+=x[i]*y[i];

   }

   cout<  "<  "<  "<

   K[0]=((n+1)*sum[3]-sum[0]*sum[2])/((n+1)*sum[1]-sum[0]*sum[0]);

   K[1]=(sum[0]*sum[3]-sum[1]*sum[2])/(sum[0]*sum[0]-(n+1)*sum[1]);

   return K;

}

 

 

void main()

{

   double a[9]={0.,1.,2.,3.,4.,5.,6.,7.,8.};

   double b[9]={5.,6.,7.,8.,9.,10.,11.,12.,13.};

   double* line;

   double angle=0.;

   double E=0.;

   int height=10;                    //图像像素高度

   int width=10;                     //图像像素宽度

 

   line=FitLine(a,b,9);

   cout<  "<

//求偏差角和偏差量图像像素高height  width

   if(line[0]<0)

   {

             angle=-atan(line[0]);

             E=-((line[0]*10-10)/2+line[1]);    //将坐标原点移到图像中心

   }

   if(line[0]>0)

   {

             angle=atan(line[0]);

             E=((line[0]*10-10)/2+line[1]);

   }

   else

             angle=0;

             E=line[1];

   cout<

}

多多交流!

你可能感兴趣的:(FitLine+直线拟合+C++)