出處:
opencv中 cvseq 物件由以下語句生成
//建立 cvseq的容器物件
cvmemstorage* storage = cvcreatememstorage(0);
// 建立 cvseq物件// 第乙個引數 序列的符號標誌
// 第二個引數 佇列(sequence)頭的size,必須大於等於sizeof(cvseq)// 第三個引數 節點的size,元素的大小,以位元組為單位,必須與序列型別一致
// 第四個引數 儲存cvseq的容器物件,序列的位置
cvseq* point_seq = cvcreateseq( cv_32fc2, sizeof(cvseq),
sizeof(cvpoint2d32f), storage );
用完後,以下列形式釋放記憶體
cvclearseq(point_seq);cvreleasememstorage(&storage);
向cvseq中新增資料時:
cvseqpush(point_seq, &cvpoint2d32f(x座標,y座標));
fitline函式的用法:
// 二維空間點擬合時 是 float[4]
// 三位空間點擬合時 是 float[6]
float *line = new float[4];
// 第乙個引數: 儲存點序列
// 第二個引數: 擬合演算法,其中 cv_dist_l2 就是平常的最小二乘法
// 第三,第四,第五引數推薦值是 0, 0.01, 0.01,
// 第六引數: line中儲存返回值
// 二維空間時: line[0--3] 分別為
(vx,
vy,x0,
y0)// 其中 vx, vy 是正規化之後的斜率向量。 x0,y0 是直線經過的點。
// 三維空間時: line[0--5] 分別是 (vx,
vy,vz,
x0,
y0,z0)
。意義同上
cvfitline(point_seq,cv_dist_l2,0,0.01,0.01,line);
擬合程式::#include #include #include float mylinearity(cvseq *);
int main(void)
;
double fy = ;float *line = new float[4];float linearity=0.0f;//sequence的容器
cvmemstorage* storage = cvcreatememstorage(0);
//三維空間的話,把cv_32fc2改為cv_32fc3、 把cvpoint2d32f 改為 cvpoint3d32fcvseq* point_seq = cvcreateseq( cv_32fc2, sizeof(cvseq), sizeof(cvpoint2d32f), storage );
for (i=0; i<10; i++)linearity = mylinearity(point_seq);cvfitline(point_seq,cv_dist_l2,0,0.01,0.01,line);
fprintf(stdout,"v=(%f,%f),vy/vx=%f,(x,y)=(%f,%f),
linearity=%f/n",line[0],line[1],line[1]/line[0],line[2],line[3],linearity);cvclearseq(point_seq);
cvreleasememstorage(&storage);
return 0;
}
//計算直線擬合度float mylinearity(cvseq *seq)
//x_bar, y_bar
for (i=0; i < seq->total; i++)
x_bar/=seq->total;
y_bar/=seq->total;
for (i=0; i < seq->total; i++)
u11/=seq->total;
u20/=seq->total;
u02/=seq->total;
//計算直線度
linearity = sqrt(4*pow(u11,2.0f)+pow(u20-u02,2.0f))/(u20+u02);
return linearity;}
**執行結果
v=(0.399377,-0.916787),vy/vx=-2.295543,(x,y)=(0.655900,2.376600), linearity=0.999105
OpenCV直線擬合
摘抄自 opencv 提供的直線擬合函式。函式原型如下 void fitline inputarray points,outputarray line,int disttype,double param,double reps,double aeps disttype 指定擬合函式的型別,可以取 c...
Opencv 擬合直線
最小二乘法是勒讓德 a.m.legendre 於1805年在其著作 計算慧星軌道的新方法 中提出的。最小二乘法就是通過最小化誤差的平方和,使得擬合物件無限接近目標物件。在影象處理中主要用於擬合線,通過求取樣點距離誤差最小的線,可以是直線,曲線,橢圓,圓等。求解方法目前分為多項式和概率 最大似然 估計...
OpenCV 學習(直線擬合
hough 變換可以提取影象中的直線。但是提取的直線的精度不高。而很多場合下,我們需要精確的估計直線的引數,這時就需要進行直線擬合。直線擬合的方法很多,比如一元線性回歸就是一種最簡單的直線擬合方法。但是這種方法不適合用於提取影象中的直線。因為這種演算法假設每個資料點的x 座標是準確的,y 座標是帶有...