OpenCV下的直線擬合

2021-05-28 09:59:12 字數 2559 閱讀 6888

出處:

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 改為 cvpoint3d32f

cvseq* 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 座標是帶有...