OpenCV矩陣運算總結

篇一:OpenCV矩陣運算總結

原文地址:http://www.cvvision.cn/273.html

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者:cvvision
鏈接:http://www.cvvision.cn/273.html
來源:CV視覺網

一、矩陣
Mat I,img,I1,I2,dst,A,B;
double k,alpha;
Scalar s;
1.加法
I=I1+I2;//等同add(I1,I2,I);
add(I1,I2,dst,mask,dtype);
scaleAdd(I1,scale,I2,dst);//dst=scale*I1+I2;
2.減法
absdiff(I1,I2,I);//I=|I1-I2|;
A-B;A-s;s-A;-A;
subtract(I1,I2,dst);
3.乘法
I=I.mul(I);//點乘,I.mul(I,3);–>I=3*I.^2
Mat C=A.mul(5/B);//==divide(A,B,C,5);
A*B;矩陣相乘
I=alpha*I;
Mat::cross(Mat);//三維向量(或矩陣)的叉乘,A.cross(B)
double Mat::dot(Mat);//2個向量(或矩陣)的點乘的結果,A.dot(B)
mul——-multiply
pow(src,double p,dst);//如果p是整數dst(I)=src(I)^p;其他|src(I)|^p
4.除法
divide(I1,I2,dst,scale,int dtype=-1);//dst=saturate_cast(I1*scale/I2);
A/B;alpha/A;都是點除
5.轉換
I.convertTo(I1,CV_32F);//類型轉換
A.t();//轉置
flip(I,dst,int flipCode);//flipCode=0是上下翻轉,>0時左右翻轉,<0時一起來
sqrt(I,dst);
cvtColor(I,dst,int code,int dstCn=0);
resize:對圖像進行形變
————————————————————————–
6.其他
Scalar s=sum(I);各通道求和
norm,countNonZero,trace,determinant,repeat都是返回Mat或者Scalar
countNonZero:用來統計非零的向量個數.(rows*cols個)
Scalar m=mean(I);//各通道求平均
Mat RowClone=C.row(1).clone();//複製第2行
addWeight(I1,alpha,I2,beta,gamma,dst,int dtype=-1);//dst=saturate(alpha*I1+beta*I2+gamma);dtype是dst的深度
—————————————————————————-
7.運算符
log10()
exp(I,dst);//dst=exp(I);計算每個數組元素的指數
log(I,dst);//如果Iij!=0;則dstij=log(|Iij|)
randu(I,Scalar::all(0),Scalar::all(255));
Mat::t()轉置
Mat::inv(int method=DECOMP_LU)求逆。method=DECOMP_CHOLESKY(專門用於對稱,速度是LU的2倍),DECOMP_SVD//A.inv();A.inv()*B;
invert(I1,dst,int method=DECOMP_LU);//用法同上
MatExpr abs(Mat)//求絕對值
A cmpop B;A compop alpha;alpha cmpop A;這裏cmpop表示>,>=,==,!=,<=,<等,結果是CV_8UC1的mask的0或255
按位運算:A logicop B;A logicop s;s logicop A;~A;這裏logicop代表&,|,^
bitwise_not(I,dst,mask);//inverts所有的隊列
還有bitwise_and,bitwise_or,bitwise_xor,
min(A,B);min(A,alpha);max(A,B);max(A,alpha);都返回MatExpr,返回的dst和A的類型一樣
double determinant(Mat);//行列式
bool eigen(I1,dst,int lowindex=-1,int highindex=-1);//
bool eigen(I1,dst,I,int…);//得到特徵值向量dst和對應特徵值的特徵向量
minMaxLoc(I1,&minVal,&maxVal,Point *minLoc=0,Point* MaxLoc=0,mask);
//minLoc是2D時距原點最小的點(未考證)
——————————————————————————
8.初始化
Mat I(img,Rect(10,10,100,100));//用一塊地方初始化。
Mat I=img(Range:all(),Range(1,3));//所有行,1~3列
Mat I=img.clone();//完全複製
img.copyTo(I);//傳遞矩陣頭
Mat I(2,2,CV_8UC3,Scalar(0,0,255));//I=[0,0,255,0,0,255;0,0,255,0,0,255];
Mat E=Mat::eye(4,4,CV_64F);//對角矩陣
Mat O=Mat::ones(2,2,CV_32F);//全一矩陣
Mat Z=Mat::zeros(3,3,CV_8UC1);//全零矩陣
Mat C=(Mat_<double>(2,2)<<0,-1,2,3);//如果是簡單矩陣的初始化
Mat::row(i);Mat::row(j);Mat::rowRange(start,end);Mat::colRange(start,end);都只是創建個頭
Mat::diag(int d);d=0是是主對角線,d=1是比主低的對角線,d=-1….
static Mat Mat::diag(const Mat& matD)
Mat::setTo(Scalar &s);以s初始化矩陣
Mat::push_back(Mat);在原來的Mat的最後一行後再加幾行
Mat::pop_back(size_t nelems=1);//移出最下面幾行
——————————————————————————-
9.矩陣讀取和修改
(1)1個通道:
for(int i=0;i<I.rows;++i)
for(int j=0;j<I.cols;++j)
I.at<uchar>(i,j)=k;
(2)3個通道:
Mat_<Vec3b> _I=I;//他沒有4個通道寸,只有3個通道!
for(int i=0;i<I.rows;++i)
for(int j=0;j<I.cols;++j)
{
_I(i,j)[0]=b;
_I(i,j)[1]=g;
_I(i,j)[2]=r;
}
I=_I;
————————————————————
或者直接用I.at<Vec3b>(i,j)[0]….
————————————————-
float *s;
for(i=0;i<dealImg.rows;i++)
{s=proImg.ptr<float>(i);
for(j=0;j<dealImg.cols;j++)
{a1=s[3*j+1]-m1;
a2=s[3*j+2]-m2;}}
————————————————————————-
(3)其他機制
I.rows(0).setTo(Scalar(0));//把第一行清零
saturate_cast<uchar>(…);//可以確保內容爲0~255的整數
Mat::total();返回一共的元素數量
size_t Mat::elemSize();返回元素的大小:CV_16SC3–>3*sizeof(short)–>6
size_t Mat::elemSize1();返回元素一個通道的大小CV_16SC3–>sizeof(short)–>2
int Mat::type()返回他的類型CV_16SC3之類
int Mat::depth()返回深度:CV_16SC3–>CV_16S
int Mat::channels()返回通道數
size_t Mat:step1()返回一個被elemSize1()除以過的step
Size Mat::size()返回Size(cols,rows);如果大於2維,則返回(-1,-1),都是先寬再高的
bool Mat::empty()如果沒有元素返回1,即Mat::total()==0或者Mat::data==NULL
uchar *Mat::ptr(int i=0)指向第i行
Mat::at(int i)(int i,int j)(Point pt)(int i,int j,int k)
RNG隨機類:next,float RNG::uniform(float a,float b);..
double RNG::gaussian(double sigma);
RNG::fill(I,int distType,Mat low,Mat up);//用隨機數填充
randu(I,low,high);
randn(I,Mat mean,Mat stddev);
reduce(I,dst,int dim,int reduceOp,int dtype=-1);//可以統計每行或每列的最大、最小、平均值、和
setIdentity(dst,Scalar &value=Scalar(1));//把對角線替換爲value
//效果等同:Mat A=Mat::eye(4,3,CV_32F)*5;
————————————————————–
10.較複雜運算
gemm(I1,I2,alpha,I3,beta,dst,int flags=0);//I1至少是浮點型,I2同I1,flags用來轉置
//gemm(I1,I2,alpha,I3,beta,dst,GEMM_1_T,GEMM_3_T);–>dst=alpha*I1.t()*I2+beta*I3.t();可用此完全代替此函數
mulTransposed(I,dst,bool aTa,Mat delta=noArray(),double scale=1,int rtype=-1);
//I是1通道的,和gemm不同,他可用於任何類型。
//如果aTa=flase時,dst=scale*(I-delta).t()*(I-delta);
//如果是true,dst=scale*(I-delta)(I-delta).t();
calcCovarMatrix(Mat,int,Mat,Mat,int,int=);calcCovarMatrix(Mat I,Mat covar,Mat mean,int flags,int=);
cartToPolar//轉到極座標
compare(I1,I2,dst,cmpop);cmpop=CMP_EQ,CMP_GT,CMP_GE,CMP_LT,CMP_LE,COM_NE
completeSymm(M,bool lowerToUpper=false);當lowerToUpper=true時Mij=Mji(i<j);當爲flase時,Mij=Mji(i>j)
變成可顯示圖像:convertScaleAbs(I,dst,alpha,beta);dst=saturate_cast<uchar>(|alpha*I+beta|);
dct(I,dst,int flags=0);//DCT變換,1維、2維的矩陣;flags=DCT_INVERSE,DCT_ROWS
idct,dft,idft
inRange(I1,I_low,I_up,dst);//dst是CV_8UC1,在2者之間就是255
Mahalanobis(vec1,vec2,covar);
merge(vector<Mat>,Mat);//把多個Mat組合成一個和split相反
double norm(…):當src2木有時,norm可以計算出最長向量、向量距離和、向量距離和的算術平方根
solveCubic解3次方程,solvePoly解n次方程
排列:sort,sortIdx
mixChannels();對某個通道進行各種傳遞
—————————————————————–
11.未懂的函數
getConvertElem,extractImageCOI,LUT
magnitude(x,y,dst);//I1,I2都是1維向量,dst=sqrt(x(I)^2+y(I)^2);
meanStdDev,
MulSpectrums(I1,I2,dst,flags);傅里葉
normalize(I,dst,alpha,beta,int normType=NORM_L2,int rtype=-1,mask);//歸一化
PCA,SVD,solve,transform,transpose
二、其他數據結構
Point2f P(5,1);
Point3f P3f(2,6,7);
vector<float> v;v.push_back((float)CV_PI);v.push_back(2);v.push_back(3.01f);//不斷入
vector<Point2f> vPoints(20);//一次定義20個
三、常用方法
Mat mask=src<0;這樣很快建立一個mask了
四、以後可能用到的函數
randShuffle,repeat
五、矩陣處理
1、矩陣的內存分配與釋放
(1) 總體上:
Opencv 使用C語言來進行矩陣操作。不過實際上有很多C++語言的替代方案可以更高效地完成。
在OpenCV中向量被當做是有一個維數爲1的N維矩陣.
矩陣按行-行方式存儲,每行以4字節(32位)對齊.
(2) 爲新矩陣分配內存:
CvMat* cvCreateMat(int rows, int cols, int type);
type: 矩陣元素類型.
按CV_<bit_depth>(S|U|F)C<number_of_channels> 方式指定. 例如: 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[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
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[] = {1, 2, 3};
double vb[] = {0, 0, 1};
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的基本矩陣操作與示例


OpenCV中的矩陣操作非常重要,本文總結了矩陣的創建、初始化以及基本矩陣操作,給出了示例代碼,主要內容包括:

  • 創建與初始化
  • 矩陣加減法
  • 矩陣乘法
  • 矩陣轉置
  • 矩陣求逆
  • 矩陣非零元素個數
  • 矩陣均值與標準差
  • 矩陣全局極值及位置
  • 其他矩陣運算函數列表


1. 創建與初始化矩陣


1.1 數據類型

建立矩陣必須要指定矩陣存儲的數據類型,圖像處理中常用的幾種數據類型如下:

[cpp] view plain copy
  1. CV_8UC1// 8位無符號單通道  
  2. CV_8UC3// 8位無符號3通道  
  3. CV_8UC4  
  4. CV_32FC1// 32位浮點型單通道  
  5. CV_32FC3// 32位浮點型3通道  
  6. CV_32FC4  

包括數據位深度8位、32位,數據類型U:uchar、F:float型以及通道數C1:單通道、C3:三通道、C4:四通道。


1.2 基本方法

我們可以通過載入圖像來創建Mat類型矩陣,當然也可以直接手動創建矩陣,基本方法是指定矩陣尺寸和數據類型:

[cpp] view plain copy
  1. // 基本方法  
  2.     cv::Mat a(cv::Size(5,5),CV_8UC1); // 單通道  
  3.     cv::Mat b = cv::Mat(cv::Size(5,5),CV_8UC3); //3通道每個矩陣元素包含3個uchar值  
  4.     cout<<"a  = "<<endl<<a<<endl<<endl;  
  5.     cout<<"b  = "<<endl<<b<<endl<<endl;  
  6.     system("pause");  

運行結果:

3通道矩陣中,一個矩陣元素包含3個變量。


1.3 初始化方法

上述方法不初始化矩陣數據,因此將出現隨機值。如果想避免這種情況,可使用Mat類的幾種初始化創建矩陣的方法:

[cpp] view plain copy
  1. // 初始化方法  
  2.     cv::Mat mz = cv::Mat::zeros(cv::Size(5,5),CV_8UC1); // 全零矩陣  
  3.     cv::Mat mo = cv::Mat::ones(cv::Size(5,5),CV_8UC1);  // 全1矩陣  
  4.     cv::Mat me = cv::Mat::eye(cv::Size(5,5),CV_32FC1);  // 對角線爲1的對角矩陣  
  5.     cout<<"mz = "<<endl<<mz<<endl<<endl;  
  6.     cout<<"mo = "<<endl<<mo<<endl<<endl;  
  7.     cout<<"me = "<<endl<<me<<endl<<endl;  
運行結果:


2. 矩陣運算


2.1 基本概念

 OpenCV的Mat類允許所有的矩陣運算。


2.2 矩陣加減法

我們可以使用"+"和"-"符號進行矩陣加減運算。
[cpp] view plain copy
  1. cv::Mat a= Mat::eye(Size(3,2), CV_32F);  
  2. cv::Mat b= Mat::ones(Size(3,2), CV_32F);  
  3. cv::Mat c= a+b;  
  4. cv::Mat d= a-b;  


2.3 矩陣乘法

使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數對應規則)

[cpp] view plain copy
  1. Mat m1= Mat::eye(2,3, CV_32F); //使用cv命名空間可省略cv::前綴,下同  
  2. Mat m2= Mat::ones(3,2, CV_32F);  
  3. cout<<"m1  = "<<endl<<m1<<endl<<endl;  
  4. cout<<"m2  = "<<endl<<m2<<endl<<endl;  
  5. // Scalar by matrix  
  6. cout << "\nm1.*2 = \n" << m1*2 << endl;  
  7. // matrix per element multiplication  
  8. cout << "\n(m1+2).*(m1+3) = \n" << (m1+1).mul(m1+3) << endl;  
  9. // Matrix multiplication  
  10. cout << "\nm1*m2 = \n" << m1*m2 << endl;  


2.4 矩陣轉置

矩陣轉置是將矩陣的行與列順序對調(第i行轉變爲第i列)形成一個新的矩陣。OpenCV通過Mat類的t()函數實現。
[cpp] view plain copy
  1. // 轉置  
  2.     Mat m1= Mat::eye(2,3, CV_32F);    
  3.     Mat m1t = m1.t();  
  4.     cout<<"m1  = "<<endl<<m1<<endl<<endl;  
  5.     cout<<"m1t  = "<<endl<<m1t<<endl<<endl;  
  6.     system("pause");  
運行結果:


2.5 求逆矩陣

逆矩陣在某些算法中經常出現,在OpenCV中通過Mat類的inv()方法實現
[cpp] view plain copy
  1. // 求逆  
  2.     Mat meinv = me.inv();  
  3.     cout<<"me  = "<<endl<<me<<endl<<endl;  
  4.     cout<<"meinv = "<<endl<<meinv<<endl<<endl;  
  5.     system("pause");  
運行結果:

單位矩陣的逆就是其本身。

2.6 計算矩陣非零元素個數

計算物體的像素或面積常需要用到計算矩陣中的非零元素個數,OpenCV中使用countNonZero()函數實現。

[cpp] view plain copy
  1. // 非零元素個數  
  2.     int nonZerosNum = countNonZero(me); // me爲輸入矩陣或圖像  
  3.     cout<<"me  = "<<endl<<me<<endl;  
  4.     cout<<"me中非零元素個數 = "<<nonZerosNum<<endl<<endl;  
  5.     system("pause");  
運行結果:


2.7 均值和標準差

OpenCV提供了矩陣均值和標準差計算功能,可以使用meanStdDev(src,mean,stddev)函數實現。

參數

  • src – 輸入矩陣或圖像
  • mean – 均值,OutputArray
  • stddev – 標準差,OutputArray

[cpp] view plain copy
  1. // 均值方差  
  2.     Mat mean;  
  3.     Mat stddev;  
  4.     meanStdDev(me, mean, stddev); //me爲前文定義的5×5對角陣  
  5.     cout<<"mean = "<<mean<<endl;  
  6.     cout<<"stddev = "<<stddev<<endl;  
  7.     system("pause");  

運行結果:

需要說明的是,如果src是多通道圖像或多維矩陣,則函數分別計算不同通道的均值與標準差,因此返回值mean和stddev爲對應維度的向量。

[cpp] view plain copy
  1. Mat mean3;  
  2. Mat stddev3;  
  3. Mat m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100));  
  4. cout<<"m3  = "<<endl<<m3<<endl<<endl;  
  5. meanStdDev(m3, mean3, stddev3);  
  6. cout<<"mean3 = "<<mean3<<endl;  
  7. cout<<"stddev3 = "<<stddev3<<endl;  
  8. system("pause");  

多通道矩陣運算結果:



2.8 求最大最小值

求輸入矩陣的全局最大最小值及其位置,可使用函數:

[cpp] view plain copy
  1. void minMaxLoc(InputArray src, CV_OUT double* minVal,  
  2.                            CV_OUT double* maxVal=0, CV_OUT Point* minLoc=0,  
  3.                            CV_OUT Point* maxLoc=0, InputArray mask=noArray());  

參數:

  • src – 輸入單通道矩陣(圖像).
  • minVal – 指向最小值的指針, 如果未指定則使用NULL
  • maxVal – 指向最大值的指針, 如果未指定則使用NULL
  • minLoc – 指向最小值位置(2維情況)的指針, 如果未指定則使用NULL
  • maxLoc – 指向最大值位置(2維情況)的指針, 如果未指定則使用NULL
  • mask – 可選的蒙版,用於選擇待處理子區域

[cpp] view plain copy
  1. // 求極值 最大、最小值及其位置  
  2.     Mat img = imread("Lena.jpg",0);  
  3.     imshow("original image",img);  
  4.   
  5.     double minVal=0,maxVal=0;  
  6.     cv::Point minPt, maxPt;  
  7.     minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);  
  8.     cout<<"min value  = "<<minVal<<endl;  
  9.     cout<<"max value  = "<<maxVal<<endl;  
  10.     cout<<"minPt = ("<<minPt.x<<","<<minPt.y<<")"<<endl;  
  11.     cout<<"maxPt = ("<<maxPt.x<<","<<maxPt.y<<")"<<endl;  
  12.     cout<<endl;  
  13.   
  14.     cv::Rect rectMin(minPt.x-10,minPt.y-10,20,20);  
  15.     cv::Rect rectMax(maxPt.x-10,maxPt.y-10,20,20);  
  16.   
  17.     cv::rectangle(img,rectMin,cv::Scalar(200),2);  
  18.     cv::rectangle(img,rectMax,cv::Scalar(255),2);  
  19.   
  20.     imshow("image with min max location",img);  
  21.     cv::waitKey();  
運行結果:


輸入圖像及其最大最小值位置


3. 其他矩陣運算

其他矩陣運算函數見下表:

Function (函數名)

Use (函數用處)

add

矩陣加法,A+B的更高級形式,支持mask

scaleAdd

矩陣加法,一個帶有縮放因子dst(I) = scale * src1(I) + src2(I)

addWeighted

矩陣加法,兩個帶有縮放因子dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)

subtract

矩陣減法,A-B的更高級形式,支持mask

multiply

矩陣逐元素乘法,同Mat::mul()函數,與A*B區別,支持mask

gemm

一個廣義的矩陣乘法操作

divide

矩陣逐元素除法,與A/B區別,支持mask

abs

對每個元素求絕對值

absdiff

兩個矩陣的差的絕對值

exp

求每個矩陣元素 src(I) 的自然數 e 的 src(I) 次冪 dst[I] = esrc(I)

pow

求每個矩陣元素 src(I) 的 p 次冪 dst[I] = src(I)p

log

求每個矩陣元素的自然數底 dst[I] = log|src(I)| (if src != 0)

sqrt

求每個矩陣元素的平方根

min, max

求每個元素的最小值或最大值返回這個矩陣 dst(I) = min(src1(I), src2(I)), max同

minMaxLoc

定位矩陣中最小值、最大值的位置

compare

返回逐個元素比較結果的矩陣

bitwise_and, bitwise_not, bitwise_or, bitwise_xor

每個元素進行位運算,分別是和、非、或、異或

cvarrToMat

舊版數據CvMat,IplImage,CvMatND轉換到新版數據Mat

extractImageCOI

從舊版數據中提取指定的通道矩陣給新版數據Mat

randu

以Uniform分佈產生隨機數填充矩陣,同 RNG::fill(mat, RNG::UNIFORM)

randn

以Normal分佈產生隨機數填充矩陣,同 RNG::fill(mat, RNG::NORMAL)

randShuffle

隨機打亂一個一維向量的元素順序

theRNG()

返回一個默認構造的RNG類的對象

 theRNG()::fill(...)

reduce

矩陣縮成向量

repeat

矩陣拷貝的時候指定按x/y方向重複

split

多通道矩陣分解成多個單通道矩陣

merge

多個單通道矩陣合成一個多通道矩陣

mixChannels

矩陣間通道拷貝,如Rgba[]到Rgb[]和Alpha[]

sort, sortIdx

爲矩陣的每行或每列元素排序

setIdentity

設置單元矩陣

completeSymm

矩陣上下三角拷貝

inRange

檢查元素的取值範圍是否在另兩個矩陣的元素取值之間,返回驗證矩陣

checkRange

檢查矩陣的每個元素的取值是否在最小值與最大值之間,返回驗證結果bool

sum

求矩陣的元素和

mean

求均值

meanStdDev

均值和標準差

countNonZero

統計非零值個數

cartToPolar, polarToCart

笛卡爾座標與極座標之間的轉換

flip

矩陣翻轉

transpose

矩陣轉置,比較 Mat::t() AT

trace

矩陣的跡

determinant

行列式 |A|, det(A)

eigen

矩陣的特徵值和特徵向量

invert

矩陣的逆或者僞逆,比較 Mat::inv()

magnitude

向量長度計算 dst(I) = sqrt(x(I)2 + y(I)2)

Mahalanobis

Mahalanobis距離計算

phase

相位計算,即兩個向量之間的夾角

norm

求範數,1-範數、2-範數、無窮範數

normalize

標準化

mulTransposed

矩陣和它自己的轉置相乘 AT * A, dst = scale(src - delta)T(src - delta)

convertScaleAbs

先縮放元素再取絕對值,最後轉換格式爲8bit型

calcCovarMatrix

計算協方差陣

solve

求解1個或多個線性系統或者求解最小平方問題(least-squares problem)

solveCubic

求解三次方程的根

solvePoly

求解多項式的實根和重根

dct, idct

正、逆離散餘弦變換,idct同dct(src, dst, flags | DCT_INVERSE)

dft, idft

正、逆離散傅立葉變換, idft同dft(src, dst, flags | DTF_INVERSE)

LUT

查表變換

getOptimalDFTSize

返回一個優化過的DFT大小

mulSpecturms

兩個傅立葉頻譜間逐元素的乘法


上表引自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html


轉載請註明出處(本文更新鏈接)http://blog.csdn.net/iracer/article/details/51296631



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章