C++版本OpenCv教程(四十三)直线拟合
前面介紹的函數都是尋找圖像或者點集中是否存在直線,而有時我們明確已知獲取到的數據在一條直線上,此時需要將所有數據擬合出一條直線,但是由于噪聲的存在,這條直線可能不會通過大多數的數據,因此需要保證所有的數據點距離直線的距離最小,如圖7-10所示。相比于直線檢測,直線擬合的最大特點是將所有數據只擬合出一條直線。
OpenCV 4中提供了利用最小二乘M-estimator方法擬合直線的**fitLine()**函數,該函數的函數原型在代碼清單7-7中給出。
void cv::fitLine(InputArray points,OutputArray line,int distType,double param,double reps,double aeps )- points:輸入待擬合直線的2D或者3D點集。
- line:輸出描述直線的參數,2D點集描述參數為Vec4f類型,3D點集描述參數為Vec6f類型。
- distType:M-estimator算法使用的距離類型標志,可以選擇的距離類型在表7-1中給出。
- param:某些類型距離的數值參數(C)。如果數值為0,則自動選擇最佳值。
- reps:坐標原點與直線之間的距離精度,數值0表示選擇自適應參數,一般常選擇0.01。
- aeps:直線角度精度,數值0表示選擇自適應參數,一般常選擇0.01。
該函數利用最小二乘法擬合出距離所有點距離最小的直線,直線的描述形式可以轉化成點斜式。函數第一個參數是待擬合直線的2D或者3D點集,可以存放在vector<>或者Mat類型的變量中賦值給參數。函數第二個參數是擬合直線的描述參數,如果是2D點集,輸出量為Vec4f類型的(vx vy x0 y0),其中**(vx vy)是與直線共線的歸一化向量**,(x0 y0)是擬合直線上的隨意一點,根據這四個量可以計算得到2維平面直線的點斜式解析式,表示形式如式(7.6)所示。
如果輸入參數是3D點集,輸出量為Vec6f類型的(vx vy vz x0 y0 z0),其中(vx vy vz)是與直線共線的歸一化向量,(x0 y0 z0)是擬合直線上的隨意一點。函數第三個參數是M-estimator算法使用的距離類型標志,可以選擇的距離類型在表7-1中給出。函數第四個參數是某些距離類型中的數值參數C,如果數值0表示選擇最佳值。函數第五個參數表示坐標原點與擬合直線之間的距離精度,數值0表示選擇自適應參數;函數第六個參數表示擬合直線的角度精度,數值0表示選擇自適應參數。第五個參數和第六個參數一般取值0.01。
為了了解該函數的使用方法,在代碼清單7-8中給出了利用fitLine()函數擬合直線的示例程序。程序中給出了 直線上的坐標點,為了模擬采集數據過程中產生的噪聲,在部分坐標中添加了噪聲。程序擬合出的直線很好的逼近了真實的直線,程序運行的結果在圖7-11給出。
運行結果:
直線斜率: 0.999955 直線上一點坐標x: 76.7907,y: 76.7907 直線解析式: y=0.999955(x-76.7907)+76.7907總結
以上是生活随笔為你收集整理的C++版本OpenCv教程(四十三)直线拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于ATSHA204a的使用流程
- 下一篇: android输入法架构解析