一、矩陣
Mat I,img,I1,I2,dst,A,B;
double k,alpha;
Scalar s;
1.加法
1 2 3 |
I=I1+I2;//等同add(I1,I2,I); add(I1,I2,dst,mask,dtype); scaleAdd(I1,scale,I2,dst);//dst=scale*I1+I2; |
2.減法
1 2 3 |
absdiff(I1,I2,I);//I=|I1-I2|; A-B;A-s;s-A;-A; subtract(I1,I2,dst); |
3.乘法
1 2 3 4 5 6 7 8 |
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.除法
1 2 |
divide(I1,I2,dst,scale,int dtype=-1);//dst=saturate_cast(I1*scale/I2); A/B;alpha/A;都是點除 |
5.轉換
1 2 3 4 5 6 |
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.其他
1 2 3 4 5 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.運算子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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.初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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_(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個通道:
1 2 3 |
for(int i=0;i for(int j=0;j I.at(i,j)=k; |
(2)3個通道:
1 2 3 4 5 6 7 8 9 |
Mat_ _I=I;//他沒有4個通道寸,只有3個通道! for(int i=0;i for(int j=0;j { _I(i,j)[0]=b; _I(i,j)[1]=g; _I(i,j)[2]=r; } I=_I; |
或者直接用I.at(i,j)[0]….
1 2 3 4 5 6 |
float *s; for(i=0;i {s=proImg.ptr(i); for(j=0;j {a1=s[3*j+1]-m1; a2=s[3*j+2]-m2;}} |
(3)其他機制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
I.rows(0).setTo(Scalar(0));//把第一行清零 saturate_cast(...);//可以確保內容為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) next,float RNG::uniform(float a,float b);//RNG隨機類 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.較複雜運算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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(ij) convertScaleAbs(I,dst,alpha,beta);dst=saturate_cast(|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組合成一個和split相反 double norm(...)//當src2木有時,norm可以計算出最長向量、向量距離和、向量距離和的算術平方根 //solveCubic解3次方程,solvePoly解n次方程 sort,sortIdx//排列 mixChannels();//對某個通道進行各種傳遞 |
11.未懂的函式
1 2 3 4 5 6 |
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 |
二、其他資料結構
1 2 3 4 |
Point2f P(5,1); Point3f P3f(2,6,7); vector v;v.push_back((float)CV_PI);v.push_back(2);v.push_back(3.01f);//不斷入 vector vPoints(20);//一次定義20個 |
三、常用方法
1 |
Mat mask=src<0;//這樣很快建立一個mask了 |
四、以後可能用到的函式
randShuffle,repeat