根據一組點擬合曲線(需要opencv庫)

2021-06-20 20:22:09 字數 1468 閱讀 7246

matlab中跟據點擬合方程灰常容易,直接使用polyfit函式就行了。c++貌似沒有直接擬合曲線的函式,在下不才,就用c++結合opencv的庫函式寫了個擬合曲線的函式。

#include

#include

#include

using namespace std;

//函式功能:根據vec中儲存的點的座標擬合曲線;

//vec為為儲存點座標的容器,index為儲存擬合好曲線的陣列,len既為擬合曲線的次數,也為陣列index的長度;

void fittingcurve(vectorvec,double *index,int len)

i++;

}cvmat xmat=cvmat(vec.size(),1,cv_64fc1,px);

cvmat ymat=cvmat(vec.size(),len,cv_64fc1,py);

cvmat *ytransposedmat=cvcreatemat(ymat.cols,ymat.rows,cv_64fc1);

cvtranspose(&ymat,ytransposedmat);//求ymat的轉置

double *a=new double [len*len];

for(int i=0;i

cvmat invmat1=cvmat(len,len,cv_64fc1,a);

cvgemm(ytransposedmat,&ymat,1,null,0,&invmat1,0);//ymat的轉置與ymat矩陣相乘

cvinvert(&invmat1,&invmat1,0);//求invmat的逆矩陣

double *b=new double [len];

for(int i=0;i

cvmat invmat2=cvmat(len,1,cv_64fc1,b);

cvgemm(ytransposedmat,&xmat,1,null,0,&invmat2,0);//求ymat的轉置矩陣與xmat矩陣相乘

cvgemm(ytransposedmat,&xmat,1,null,0,&invmat2,0);//求ytransposedmat矩陣與xmat 矩陣的乘積

cvmat indexmat=cvmat(len,1,cv_64fc1,index);

cvgemm(&invmat1,&invmat2,1,null,0,&indexmat,0);

cvreleasemat(&ytransposedmat);

delete a;

delete b;

delete px;

delete py;

}int main()

;int y=;

for (int i=0;i<16;i++)

double index[3];

fittingcurve(vec,index,3);

for (int i=0;i<3;++i)

return 0;

}

使用一組點畫出平滑的曲線

今天在專案中需要人臉上的點來勾勒出人臉的輪廓,我的想法是將要畫的點存入乙個陣列,使用了uibezierpath來連線每乙個點。但是這樣畫出來的圖是折線,顯得過於生硬。查了若干資料,後來終於在stackoverflow上找到了乙個很好的解決辦法。這個做法的原理其實是在每兩個點之間加入一些點,來使得兩個...

M Sort it 一組簡單一點的題目 三

大意 就是將輸入的數列進行公升序排列的過程中,相鄰的兩個兩兩交換的次數最少為多少 思路 這個題不能單純的用什麼冒泡啥的,顯然不行,而是求出其對應的逆序數的對數,求出之後,有多少對就是進行移動的最少的次數。這是因為對於逆序數的時候你可以先交換相鄰的逆序數,最後一定能讓不相鄰的逆序數變成相鄰,然後交換,...

通過程式設計的方式根據一組封閉的線繪製相同形狀的箍筋

很多的時候我們希望給revit的構件配筋,通過程式設計的方式可以將你用手工繪製的模型線轉化成箍筋。非常方便直觀。我們呼叫rebar.createfromcurves 函式來建立箍筋。函式定義如下 public static rebar createfromcurves document doc,re...