做毕业论文中我用Opencv中的void cvFitLine( const CvArr* points, int dist_type, double param,
double reps, double aeps, float* line )做直线拟合,寻找一幅图像中的直线的倾斜度(斜率)和直线与图像中心的位移偏差,始终不出结果。搜了好多网址找到了两个这个函数的使用例子,但是我发现还是不好用,编译提示points类型错误。无奈之下自己写了一个直线拟合的C++程序,这个程序只是一个雏形。坐标点序列输入还很繁琐,而且每次使用时必须输入坐标点对数。如果能做到只给出坐标数组就能输出线性函数参数(a,b)就很好了。在此我不做修改,希望你能把它升级,使它功能更强。请指教。
#include <iostream.h>
#include <math.h>
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<n;i++)
{
sum[0]+=x[i];
sum[1]+=x[i]*x[i];
sum[2]+=y[i];
sum[3]+=x[i]*y[i];
}
cout<<sum[0]<<" "<<sum[1]<<" "<<sum[2]<<" "<<sum[3]<<endl;
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<<line[0]<<" "<<line[1]<<endl;
//求偏差角和偏差量图像像素高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<<angle<<"xxx"<<E<<endl;
}
多多交流!