OpenCV實(shí)現(xiàn)直線擬合
相比于直線檢測,直線擬合的最大特點(diǎn)是將所有數(shù)據(jù)只擬合出一條直線
void fitLine( InputArray points, OutputArray line, int distType, double param, double reps, double aeps );
- points:輸入待擬合直線的2D或者3D點(diǎn)集。
- line:輸出描述直線的參數(shù),2D點(diǎn)集描述參數(shù)為Vec4f類型,3D點(diǎn)集描述參數(shù)為Vec6f類型。
- distType:M-estimator算法使用的距離類型標(biāo)志,可以選擇的距離類型在表7-1中給出。
- param:某些類型距離的數(shù)值參數(shù)(C)。如果數(shù)值為0,則自動(dòng)選擇最佳值。
- reps:坐標(biāo)原點(diǎn)與直線之間的距離精度,數(shù)值0表示選擇自適應(yīng)參數(shù),一般常選擇0.01。
- aeps:直線角度精度,數(shù)值0表示選擇自適應(yīng)參數(shù),一般常選擇0.01。
該函數(shù)利用最小二乘法擬合出距離所有點(diǎn)距離最小的直線,直線的描述形式可以轉(zhuǎn)化成點(diǎn)斜式。函數(shù)第一個(gè)參數(shù)是待擬合直線的2D或者3D點(diǎn)集,可以存放在vector<>或者M(jìn)at類型的變量中賦值給參數(shù)。函數(shù)第二個(gè)參數(shù)是擬合直線的描述參數(shù),如果是2D點(diǎn)集,輸出量為Vec4f類型的(vx vy x0 y0),其中(vx vy)是與直線共線的歸一化向量,(x0 y0)是擬合直線上的隨意一點(diǎn),根據(jù)這四個(gè)量可以計(jì)算得到2維平面直線的點(diǎn)斜式解析式,表示形式如式所示。
如果輸入?yún)?shù)是3D點(diǎn)集,輸出量為Vec6f類型的(vx vy vz x0 y0 z0),其中(vx vy vz)是與直線共線的歸一化向量,(x0 y0 z0)是擬合直線上的隨意一點(diǎn)。函數(shù)第三個(gè)參數(shù)是M-estimator算法使用的距離類型標(biāo)志,可以選擇的距離類型在表中給出。函數(shù)第四個(gè)參數(shù)是某些距離類型中的數(shù)值參數(shù)C,如果數(shù)值0表示選擇最佳值。函數(shù)第五個(gè)參數(shù)表示坐標(biāo)原點(diǎn)與擬合直線之間的距離精度,數(shù)值0表示選擇自適應(yīng)參數(shù);函數(shù)第六個(gè)參數(shù)表示擬合直線的角度精度,數(shù)值0表示選擇自適應(yīng)參數(shù)。第五個(gè)參數(shù)和第六個(gè)參數(shù)一般取值0.01。
簡單示例
// // Created by smallflyfly on 2021/6/22. // #include "opencv2/opencv.hpp" #include <iostream> using namespace std; using namespace cv; int main() { Vec4f lines; vector<Point2f> points; const static float pts[20][2] = { {0.0f,0.0f},{10.0f,11.0f},{21.0f,20.0f},{30.0f,30.0f}, {40.0f,42.0f},{50.0f,50.0f},{60.0f,60.0f},{70.0f,70.0f}, {80.0f,80.0f},{90.0f,92.0f},{100.0f,100.0f},{110.0f,110.0f}, {120.f,120.0f},{136.0f,130.0f},{138.0f,140.0f},{150.0f,150.0f}, {160.0f,163.0f},{175.0f,170.0f},{181.0f,180.0f},{200.0f,190.0f} }; for (int i = 0; i < 20; ++i) { points.emplace_back(pts[i][0], pts[i][1]); } double param = 0.0; double reps = 0.01; double aeps = 0.01; fitLine(points, lines, DIST_L1, param, reps, aeps); cout << lines << endl; return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++利用stringstream進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換實(shí)例
這篇文章主要介紹了C++利用stringstream進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換的方法,實(shí)例分析了使用stringstream進(jìn)行string轉(zhuǎn)int的操作技巧,需要的朋友可以參考下2015-01-01C語言 structural body結(jié)構(gòu)體詳解用法
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動(dòng)態(tài),您可能需要跟蹤每本書的下列屬性2021-10-10C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10C++標(biāo)準(zhǔn)庫bitset類型的簡單使用方法介紹
這篇文章主要介紹了C++標(biāo)準(zhǔn)庫bitset類型的簡單使用方法,需要的朋友可以參考下2017-07-07C語言中的強(qiáng)符號(hào)和弱符號(hào)介紹
這篇文章主要介紹了C語言中的強(qiáng)符號(hào)和弱符號(hào)介紹,本文用多個(gè)實(shí)例來講解強(qiáng)符號(hào)和弱符號(hào),需要的朋友可以參考下2015-03-03c++語言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理詳解
這篇文章主要給大家介紹了關(guān)于c++語言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)分組導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)分組導(dǎo)出,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以了解一下2022-06-06C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法
這篇文章主要介紹了C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下2021-01-01