OpenCV:直線擬合——cv::fitLine()詳解


實現目的:有一系列的點,需要擬合出一條直線。

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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM