多邊形擬合曲線approxPolyDP()函數算法原理

approxPolyDP()函數是opencv中對指定的點集進行多邊形逼近的函數,其逼近的精度可通過參數設置。

對應的函數爲:
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);

例如:approxPolyDP(contourMat, approxCurve, 10, true);//找出輪廓的多邊形擬合曲線

第一個參數 InputArray curve:輸入的點集
第二個參數OutputArray approxCurve:輸出的點集,當前點集是能最小包容指定點集的。畫出來即是一個多邊形。
第三個參數double epsilon:指定的精度,也即是原始曲線與近似曲線之間的最大距離。
第四個參數bool closed:若爲true,則說明近似曲線是閉合的;反之,若爲false,則斷開。


該函數採用是道格拉斯-普克算法(Douglas-Peucker)來實現。該算法也以Douglas-Peucker算法和迭代終點擬合算法爲名。是將曲線近似表示爲一系列點,並減少點的數量的一種算法。該算法的原始類型分別由烏爾斯·拉默(Urs Ramer)於1972年以及大衛·道格拉斯(David Douglas)和托馬斯·普克(Thomas Peucker)於1973年提出,並在之後的數十年中由其他學者予以完善。

經典的Douglas-Peucker算法描述如下:

(1)在曲線首尾兩點A,B之間連接一條直線AB,該直線爲曲線的弦;

(2)得到曲線上離該直線段距離最大的點C,計算其與AB的距離d;

(3)比較該距離與預先給定的閾值threshold的大小,如果小於threshold,則該直線段作爲曲線的近似,該段曲線處理完畢。

(4)如果距離大於閾值,則用C將曲線分爲兩段AC和BC,並分別對兩段取信進行1~3的處理。

(5)當所有曲線都處理完畢時,依次連接各個分割點形成的折線,即可以作爲曲線的近似。

 

示意圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章