zoukankan      html  css  js  c++  java
  • 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 << " m1.*2 =  " << m1*2 << endl;  
    7. // matrix per element multiplication  
    8. cout << " (m1+2).*(m1+3) =  " << (m1+1).mul(m1+3) << endl;  
    9. // Matrix multiplication  
    10. cout << " m1*m2 =  " << 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



  • 相关阅读:
    回调函数的理解[转]
    Android开发的小技巧总结
    获取Android源码
    PopupWindow的dismiss
    Linux下Android ADB驱动安装详解
    ubuntu下svn使用指南
    透明的Dialog
    ubuntu下SVN服务器安装配置
    JAVA签名
    android Intent API8
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000789.html
Copyright © 2011-2022 走看看