拟合直线 - MatLab与OpenCV不符

4

取样点为(10,10), (20,0), (20,40), (20,20)。

在Matlab中,polyfit返回斜率为1,但对于相同的数据,openCV的fitline返回斜率为10.7。手动计算表明,近乎垂直的线(斜率为10.7)是更好的最小二乘拟合。

为什么两个库会返回不同的结果呢?

OpenCV代码 - (在iOS上)

vector<cv::Point> vTestPoints;
vTestPoints.push_back(cv::Point( 10, 10 ));
vTestPoints.push_back(cv::Point( 20, 0 ));
vTestPoints.push_back(cv::Point( 20, 40 ));
vTestPoints.push_back(cv::Point( 20, 20 ));
Mat cvTest = Mat(vTestPoints);
cv::Vec4f testWeight;
fitLine( cvTest, testWeight, CV_DIST_L2, 0, 0.01, 0.01);
NSLog(@"Slope: %.2f",testWeight[1]/testWeight[0]);

xcode日志显示

2014-02-12 16:14:28.109 Application[3801:70b] Slope: 10.76

Matlab 代码

>> px
px10 20 20 20

>> py
py = 10 0 20 40

>> polyfit(px,py,1)
ans = 1.0000e+000 -2.7733e-014

斜率为 10.76 - 偏移量是多少? - nkjt
Matlab/polyfit - 通过点(10,10),斜率为1.0的直线。--- openCV/fitline - 通过点(17.5,17.5),斜率为10.76的直线。 - Peter Gaston
1个回答

3

MATLAB试图在给定的输入x情况下最小化y的误差(即,如果x是独立变量,y是因变量)。

在这种情况下,穿过点 (10,10) 和 (20,20) 的直线可能是最好的选择。如果你尝试计算给定x=10时的y值,则接近所有三个点且x=20的近乎垂直的直线将会有很大的误差。

虽然我不认识OpenCV语法,但我猜CV_DIST_L2是一种距离度量标准,意味着你正在尝试最小化x-y平面中每个点与直线之间的总距离。在这种情况下,通过点集中心的更竖直的直线将是最接近的。

哪一个是“正确的”取决于你的点代表什么。


好的答案 - 因此,polyfit正在最小化Y中的误差。这不是我想要的。 - Peter Gaston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接