拟合一条线--MatLab不同意O​​penCV

时间:2014-02-12 22:06:42

标签: ios matlab opencv

取样点(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
px =  10 20 20 20

>> py
py = 10 0 20 40

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

1 个答案:

答案 0 :(得分:3)

MATLAB正试图最小化y对于给定输入x的错误(即,好像x是您的独立变量和y因变量。)

在这种情况下,通过点(10,10)和(20,20)的线可能是最好的选择。如果您尝试计算x=20给定y的值,则使用x=10靠近所有三个点的近垂直线会出现非常大的错误。

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

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