【问题标题】:Fitting a line - MatLab disagrees with OpenCV拟合线 - MatLab 不同意 OpenCV
【发布时间】:2014-02-12 22:06:41
【问题描述】:

取样本点 (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

【问题讨论】:

  • 坡度10.76 - 偏移量是多少?
  • Matlab/polyfit - 穿过 (10,10) 的线,斜率 1.0。 --- openCV/fitline - 穿过 (17.5,17.5) 的线,坡度 10.76。

标签: ios matlab opencv


【解决方案1】:

对于给定的输入 x,MATLAB 正在尝试最小化 y 中的错误(即,好像 x 是您的自变量,y 是您的因变量)。

在这种情况下,穿过点 (10,10) 和 (20,20) 的线可能是最好的选择。如果您尝试在给定x=10 的情况下计算y 的值,那么一条接近带有x=20 的所有三个点的近乎垂直的线会产生非常大的错误。

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

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

【讨论】:

  • 好答案 - 所以 polyfit 正在最大限度地减少 Y 中的错误。不是我想要的。
猜你喜欢
  • 2016-06-11
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多