OpenCV矩陣運算

2021-06-27 15:44:16 字數 4133 閱讀 2877

矩陣處理

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);

int 

step = 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) -> d

cvinvert(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 矩陣運算

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

OpenCV矩陣運算

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

OpenCV中簡單矩陣運算

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