矩陣處理
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.矩...