【OpenCV3】直线拟合——cv::fitLine()详解
生活随笔
收集整理的這篇文章主要介紹了
【OpenCV3】直线拟合——cv::fitLine()详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在圖像處理中,通常會遇到根據給定的點集(比如輪廓)擬合出一條直線的情形。opencv2和opencv3中提供了一個專門用于直線擬合的函數——cv::fitLine()。
下面對該函數作一詳細的介紹。
cv::fitLine()的具體調用形式如下:
void cv::fitLine(cv::InputArray points, // 二維點的數組或vectorcv::OutputArray line, // 輸出直線,Vec4f (2d)或Vec6f (3d)的vectorint distType, // 距離類型double param, // 距離參數double reps, // 徑向的精度參數double aeps // 角度精度參數);
第一個參數是用于擬合直線的輸入點集,可以是二維點的cv::Mat數組,也可以是二維點的STL vector。
第二個參數是輸出的直線,對于二維直線而言類型為cv::Vec4f,對于三維直線類型則是cv::Vec6f,輸出參數的前半部分給出的是直線的方向,而后半部分給出的是直線上的一點(即通常所說的點斜式直線)。
第三個參數是距離類型,擬合直線時,要使輸入點到擬合直線的距離和最小化(即下面公式中的cost最小化),可供選的距離類型如下表所示,ri表示的是輸入的點到直線的距離。
第四個參數是距離參數,跟所選的距離類型有關,值可以設置為0,cv::fitLine()函數本身會自動選擇最優化的值
第五、六兩個參數用于表示擬合直線所需要的徑向和角度精度,通常情況下兩個值均被設定為1e-2。
下面,從一個具體的例子來看cv::Line()實際擬合的效果。
示例代碼如下:
//創建一個用于繪制圖像的空白圖cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3);//輸入擬合點std::vector<cv::Point> points;points.push_back(cv::Point(48, 58));points.push_back(cv::Point(105, 98));points.push_back(cv::Point(155, 160));points.push_back(cv::Point(212, 220));points.push_back(cv::Point(248, 260));points.push_back(cv::Point(320, 300));points.push_back(cv::Point(350, 360));points.push_back(cv::Point(412, 400));//將擬合點繪制到空白圖上for (int i = 0; i < points.size(); i++){cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);}cv::Vec4f line_para; cv::fitLine(points, line_para, cv::DIST_L2, 0, 1e-2, 1e-2);std::cout << "line_para = " << line_para << std::endl;//獲取點斜式的點和斜率cv::Point point0;point0.x = line_para[2];point0.y = line_para[3];double k = line_para[1] / line_para[0];//計算直線的端點(y = k(x - x0) + y0)cv::Point point1, point2;point1.x = 0;point1.y = k * (0 - point0.x) + point0.y;point2.x = 640;point2.y = k * (640 - point0.x) + point0.y;cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0);cv::imshow("image", image);cv::waitKey(0);return;
擬合結果如下:
2017.04.07
總結
以上是生活随笔為你收集整理的【OpenCV3】直线拟合——cv::fitLine()详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】模板匹配——cv::m
- 下一篇: 【OpenCV3】角点检测——cv::g