OpenCV矩陣運算

2022-05-14 19:54:11 字數 4216 閱讀 2183

矩陣處理

1、矩陣的記憶體分配與釋放

(1)總體上:

opencv

使用c語言來進行矩陣操作。不過實際上有很多c++語言的替代方案可以更高效地完成。

在opencv中向量被當做是有乙個維數為1的n維矩陣.

矩陣按行-行方式儲存,每行以4位元組(32位)對齊.

(2)為新矩陣分配記憶體:

cvmat* cvcreatemat(int rows, int cols, int type);

type: 矩陣元素型別.

按cv_(s|u|f)c方式指定.

例如: cv_8uc1 、cv_32sc2.

示例:cvmat* m = cvcreatemat(4,4,cv_32fc1);

(3)釋放矩陣記憶體:

cvmat* m = cvcreatemat(4,4,cv_32fc1);

cvreleasemat(&m);

(4)複製矩陣:

cvmat* m1 = cvcreatemat(4,4,cv_32fc1);

cvmat* m2;

m2=cvclonemat(m1);

(5)初始化矩陣:

double a = ;

cvmat ma=cvmat(3, 4, cv_64fc1, a);

//等價於:

cvmat ma;

cvinitmatheader(&ma, 3, 4, cv_64fc1, a);

(6)初始化矩陣為單位矩陣:

cvmat* m = cvcreatemat(4,4,cv_32fc1);

cvsetidentity(m); // does not seem to be working properl

2、訪問矩陣元素

(1)假設需要訪問乙個2d浮點型矩陣的第(i, j)個單元.

(2)間接訪問:

cvmset(m,i,j,2.0); // set m(i,j)

t = cvmget(m,i,j); // get m(i,j)

(3)直接訪問(假設矩陣資料按4位元組行對齊):

cvmat* m

= cvcreatemat(4,4,cv_32fc1);

int n

= m->cols;

float *data = m->data.fl;

data[i*n+j] = 3.0;

(4)直接訪問(當資料的行對齊可能存在間隙時possible alignment gaps):

cvmat* m

= cvcreatemat(4,4,cv_32fc1);

intstep

= m->step/sizeof(float);

float *data = m->data.fl;

(data+i*step)[j] = 3.0;

(5)對於初始化後的矩陣進行直接訪問:

double a[16];

cvmat ma = cvmat(3, 4, cv_64fc1, a);

a[i*4+j] = 2.0; // ma(i,j)=2.0;

3、矩陣/向量運算

(1)矩陣之間的運算:

cvmat *ma, *mb, *mc;

cvadd(ma, mb, mc);

// ma+mb

-> mc

cvsub(ma, mb, mc);

// ma-mb

-> mc

cvmatmul(ma, mb, mc);

// ma*mb

->

mc(2)矩陣之間的元素級運算:

cvmat *ma, *mb, *mc;

cvmul(ma, mb, mc);

// ma.*mb

-> mc

cvdiv(ma, mb, mc);

// ma./mb

-> mc

cvadds(ma, cvscalar(-10.0), mc); // ma.-10 -> mc

(3)向量乘積:

double va = ;

double vb = ;

double vc[3];

cvmat va=cvmat(3, 1, cv_64fc1, va);

cvmat vb=cvmat(3, 1, cv_64fc1, vb);

cvmat vc=cvmat(3, 1, cv_64fc1, vc);

double res=cvdotproduct(&va,&vb); // 向量點乘:

va . vb -> res

cvcrossproduct(&va, &vb, &vc);

// 向量叉乘:

va x vb -> vc

注意在進行叉乘運算時,va, vb, vc 必須是僅有3個元素的向量.

(4)單一矩陣的運算:

cvmat *ma, *mb;

cvtranspose(ma, mb);

// 轉置:transpose(ma) -> mb (注意轉置陣不能返回給ma本身)

cvscalar t = cvtrace(ma); // 跡:trace(ma) -> t.val[0]

double d = cvdet(ma);

// 行列式:det(ma) ->

dcvinvert(ma, mb);

// 逆矩陣:inv(ma) -> mb

(5)非齊次線性方程求解:

cvmat* a

= cvcreatemat(3,3,cv_32fc1);

cvmat* x

= cvcreatemat(3,1,cv_32fc1);

cvmat* b

= cvcreatemat(3,1,cv_32fc1);

cvsolve(&a, &b, &x);

// solve (ax=b) for x

(6)特徵值與特徵向量(矩陣為方陣):

cvmat* a

= cvcreatemat(3,3,cv_32fc1);

cvmat* e

= cvcreatemat(3,3,cv_32fc1);

cvmat* l

= cvcreatemat(3,1,cv_32fc1);

cveigenvv(a, e, l);

// l = a 的特徵值(遞減順序)

// e = 對應的特徵向量 (行向量)

(7)奇異值分解(svd):====

cvmat* a

= cvcreatemat(3,3,cv_32fc1);

cvmat* u

= cvcreatemat(3,3,cv_32fc1);

cvmat* d

= cvcreatemat(3,3,cv_32fc1);

cvmat* v

= cvcreatemat(3,3,cv_32fc1);

cvsvd(a, d, u, v, cv_svd_u_t|cv_svd_v_t); // a = u d v^t

標誌位使矩陣u或v按轉置形式返回 (若不轉置可能運算出錯).

OpenCV矩陣運算

矩陣處理 1 矩陣的記憶體分配與釋放 1 總體上 opencv 使用c語言來進行矩陣操作。不過實際上有很多c 語言的替代方案可以更高效地完成。在opencv中向量被當做是有乙個維數為1的n維矩陣.矩陣按行 行方式儲存,每行以4位元組 32位 對齊.2 為新矩陣分配記憶體 cvmat cvcreate...

Opencv 矩陣運算

效果等於src1 src2 void add inputarray src1,inputarray src2,outputarray dst,inputarray mask noarray int dtype 1 void subtract inputarray src1,inputarray sr...

OpenCV中簡單矩陣運算

矩陣的點運算 add subtract multiply divide absdiff bitwise and bitwise or bitwise xor max min compare 對應 加,減,點乘,點除,點絕對差,點位運算 與,點位運算 或,點位運算 異或,點最大,點最小,點比較。2.矩...