2014-02-12 24 views
4

取樣點(10,10),(20,0),(20,40),(20,20)。擬合線 - MatLab不同意O​​penCV

在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 
+0

斜坡'10.76' - 偏移量是多少? – nkjt

+0

Matlab/polyfit - 穿過(10,10)的斜線,斜率1.0。 --- openCV/fitline - 貫穿線(17.5,17.5),斜率10.76。 –

回答

2

MATLAB試圖最小化誤差在y對於給定的輸入x(即好像x是你的獨立和y你的因變量)。

在這種情況下,通過點(10,10)和(20,20)的線可能是最好的選擇。如果您嘗試計算y的給定值x=10,則與x=20接近所有三個點的近垂直線會有非常大的誤差。

雖然我不認識OpenCV語法,但我猜CV_DIST_L2是一個距離度量,這意味着您試圖最小化線和x-y平面中每個點之間的總距離。在這種情況下,通過點集中間的更多垂直線將是最接近的。

哪個「正確」取決於您的要點代表什麼。

+0

好的答案 - 所以polyfit正在最小化Y中的錯誤。不是我想要的。 –