三次Beizer曲線擬合演算法

2021-07-26 05:23:40 字數 1595 閱讀 6540

beizer曲線的一些特性這裡不再贅述,大家可以去網上檢視一些資料,很詳細。最近用到輪廓擬合,所以用三次beizer曲線效果還可以,有插值和近似擬合(插值就是曲線過點,近似擬合則不過點),就學習了一下。我是做的beizer曲線插值,插值和近視擬合無非就是控制點選取不一樣。

beizer總方程為∑p

ikni

(t) (1),

三次beizer曲線方程:bn

(t)=

p0(1

−t)3

+3p1

t(1−

t)2+

3p2t

2(1−

t)+p

3t3,

tϵ[0

,1] (2),

這裡的p

1 和p2

。文章寫的很詳細,對於閉合輪廓的話就想象成乙個迴圈,第0個點的前兩個點為n-1和n-2,第n-1個點的後兩個點為0和1,文章很好理解。對於引數a和b,通常都是0.25,但我看別人**中有a=0.125,b=0.05,擬合出來的效果很接近真實曲線,所以我也是採用這個引數。

上述講了三次beizer曲線方程,用在輪廓擬合中怎麼實現呢。當然,你先得找到輪廓中的特徵點,然後根據兩個相鄰的特徵點擬合成一段三次beizer曲線,控制點ab是借助周圍幾個點得到的。思路大概就是這樣的。下面講一下具體步驟。

###2.1 得到控制點ab

//求得控制點ab

void controlab(double *xi,double *yi, double *ai_x,double *ai_y, double *bi_x,double *bi_y,int n, double a, double b,int boundtype)

for(int i=1;i1;i++)

for(int i=0;i2;i++)

}

**注意:**不要瞎貼,這裡有些自定義陣列,xi、yi是點的x、y。

###2.2 擬合曲線生成與繪製

求得ab控制點,可以將p1

、p2 、a和b代入方程(2)中,得到p1

和p2 中間的一段三次beizer曲線方程,就擬合出來了。這時需要看到效果。我用的是c++的mfc畫出來的曲線,當然也可以python,python一搜有很多例子,網上可以盪到的。我畫二維曲線用的是mfc,大家可以參考我的部落格「mfc繪製二維曲線」

,給個我實驗擬合出來的閉合輪廓,其中引數a=0.125,b=0.05。

可以看到,擬合效果還是不錯的。圖中的小黑點是我給的特徵點,mfc畫出來就是這個樣子。

三次beizer曲線擬合演算法還是很簡單的,主要是控制點的選取,還有最關鍵的特徵點選取。特徵點是最基本的。當然beizer也有一些不足之處,對於非閉合輪廓的情況擬合情況不是很理想,這就需要其他的曲線擬合,我會再發一篇b樣條曲線擬合演算法的。

電量曲線的擬合演算法

實際應用中會遇到電池電量顯示的問題,可以用微控制器的adc模組取樣電池的電壓,然後輸出,普通的做法是將取樣的電壓如下計算得到電量百分比輸出 static uint8 t cal percentage void 將得到的數值加上百分號顯示出來,就可以了。但是在實際應用過程中,有些微控制器的供電電壓,不...

三次 Hermite曲線演算法

首先,這個網上有很多相關的文章,比如 下面說,整個演算法需要注意的地方。1 切線的概念 切線不是斜率,可以理解為向量吧。比如p0到p1的切線就是 p1 p0 可以標準化為單位向量。2 簡單的切線 假如四個控制點p0,p1,p2,p3,那麼最簡單的計算p1點的切線是 p1 p0,p2的切線是p3 p2...

二次擬合r方 技巧篇 ELISA曲線擬合

很多使用者諮詢elisa實驗後如何進行曲線製作?那麼對於那麼多的曲線計算公式,該如何選擇最佳的擬合方程呢?那麼今天我們就來簡要聊一聊elisa標曲擬合的那些事兒吧!產品說明書都會推薦使用者擬合標曲方法,可以用軟體繪製也可以通過excel進行製作。按照科學分析方法,如果存在奇異點或者汙點,直接採用線性...