實現目的:有一系列的點,需要擬合出一條直線。
cv::fitLine()的具體調用形式如下:
void cv::fitLine( cv::InputArray points, // 二維點的數組或vector cv::OutputArray line, // 輸出直線,Vec4f (2d)或Vec6f (3d)的vector int distType, // 距離類型 double param, // 距離參數 double reps, // 徑向的精度參數 表示直線到原點距離的精度,建議取 0.01。設為0,則自動選用最優值 double aeps // 角度精度參數 表示直線角度的精度,建議取 0.01 );
計算出的直線信息存放在 line 中,為 cv::Vec4f 類型。line[0]、line[1] 存放的是直線的方向向量,double cos_theta = line[0]; double sin_theta = line[1];。line[2]、line[3] 存放的是直線上一個點的坐標。
還不太理解輸出的直線,為什么要用這種類型。可以避免得到豎直直線,斜率無法顯示么?
如果在圖中畫出直線,會用到cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0);因此,需要輸入直線上的兩個點,才能畫出直線。
double cos_theta = line[0]; double sin_theta = line[1]; double x0 = line[2], y0 = line[3]; double k = sin_theta / cos_theta; double b = y0 - k * x0; double x = 0; double y = k * x + b; cv::line(image, Point(x0,y0), Point(x,y), cv::Scalar(255), 1);
