OPENCV CvMat的使用

前端之家收集整理的这篇文章主要介绍了OPENCV CvMat的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
      • 综述:
        • OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.
        • OpenCV将向量作为1维矩阵处理.
        • 矩阵按行存储,每行有4字节的校整.
      • 分配矩阵空间:
        CvMat* cvCreateMat(int rows,int cols,int type); type: 矩阵元素类型. 格式为CV_<bit_depth>(S|U|F)C<number_of_channels>. 例如: CV_8UC1 表示8位无符号单通道矩阵,CV_32SC2表示32位有符号双通道矩阵. 例程: CvMat* M = cvCreateMat(4,4,CV_32FC1); 
      • 释放矩阵空间:
        1. CvMat* M = cvCreateMat(4,CV_32FC1);
        1. cvReleaseMat(&M);
      • 复制矩阵:
        1. CvMat* M1 = cvCreateMat(4,CV_32FC1);
        1. CvMat* M2;
        1. M2=cvCloneMat(M1);
      • 初始化矩阵:
        1. double a[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
        1. CvMat Ma=cvMat(3,4,CV_64FC1,a);
        1. CvMat Ma;
        1. cvInitMatHeader(&Ma,3,a);
      •    
      • 初始化矩阵为单位阵:
        1. CvMat* M = cvCreateMat(4,CV_32FC1);
        1. cvSetIdentity(M); // 这里似乎有问题,不成功

      存取矩阵元素

        • 假设需要存取一个2维浮点矩阵的第(i,j)个元素.
        • 间接存取矩阵元素:
          1. cvmSet(M,i,j,2.0); // Set M(i,j)
          1. t = cvmGet(M,j); // Get M(i,j)
        • 直接存取,假设使用4-字节校正:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          1. int n = M->cols;
          1. float *data = M->data.fl;
          1. data[i*n+j] = 3.0;
        • 直接存取,校正字节任意:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          1. int step = M->step/sizeof (float );
          1. float *data = M->data.fl;
          1. (data+i*step)[j] = 3.0;
        • 直接存取一个初始化的矩阵元素:
          1. double a[16];
          1. CvMat Ma = cvMat(3,a);
          1. a[i*4+j] = 2.0; // Ma(i,j)=2.0;

        矩阵/向量操作

          • 矩阵-矩阵操作:
            1. CvMat *Ma,*Mb,*Mc;
            1. cvAdd(Ma,Mb,Mc); // Ma+Mb -> Mc
            1. cvSub(Ma,Mc); // Ma-Mb -> Mc
            1. cvMatMul(Ma,Mc); // Ma*Mb -> Mc
          • 按元素的矩阵操作:
            1. CvMat *Ma,*Mc;
            1. cvMul(Ma,Mc); // Ma.*Mb -> Mc
            1. cvDiv(Ma,Mc); // Ma./Mb -> Mc
            1. cvAddS(Ma,cvScalar(-10.0),Mc); // Ma.-10 -> Mc
          • 向量乘积:
            1. double va[] = {1,2,3};
            1. double vb[] = {0,0,1};
            1. double vc[3];
            1. CvMat Va=cvMat(3,1,va);
            1. CvMat Vb=cvMat(3,vb);
            1. CvMat Vc=cvMat(3,vc);
            1. double res=cvDotProduct(&Va,&Vb); // 点乘: Va . Vb -> res
            1. cvCrossProduct(&Va,&Vb,&Vc); // 向量积: Va x Vb -> Vc
            1. end{verbatim}
          • 注意 Va,Vb,Vc 在向量积中向量元素个数须相同.

          • 单矩阵操作:
            1. CvMat *Ma,*Mb;
            1. cvTranspose(Ma,Mb); // transpose(Ma) -> Mb (不能对自身进行转置)
            1. CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]
            1. double d = cvDet(Ma); // det(Ma) -> d
            1. cvInvert(Ma,Mb); // inv(Ma) -> Mb
          • 非齐次线性系统求解:
            1. CvMat* A = cvCreateMat(3,3,CV_32FC1);
            1. CvMat* x = cvCreateMat(3,1,CV_32FC1);
            1. CvMat* b = cvCreateMat(3,CV_32FC1);
            1. cvSolve(&A,&b,&x); // solve (Ax=b) for x
          • 特征值分析(针对对称矩阵):
            1. CvMat* A = cvCreateMat(3,CV_32FC1);
            1. CvMat* E = cvCreateMat(3,CV_32FC1);
            1. CvMat* l = cvCreateMat(3,CV_32FC1);
            1. cvEigenVV(&A,&E,&l); // l = A的特征值 (降序排列) E = 对应的特征向量 (每行)
          • 奇异值分解SVD:
            1. CvMat* A = cvCreateMat(3,CV_32FC1);
            1. CvMat* U = cvCreateMat(3,CV_32FC1);
            1. CvMat* D = cvCreateMat(3,CV_32FC1);
            1. CvMat* V = cvCreateMat(3,CV_32FC1);
            1. cvSVD(A,D,U,V,CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T
        • 综述:
          • OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.
          • OpenCV将向量作为1维矩阵处理.
          • 矩阵按行存储,每行有4字节的校整.
        • 分配矩阵空间:
          1. CvMat* cvCreateMat(int rows,CV_32FC1);
        • 释放矩阵空间:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          2. cvReleaseMat(&M);
        • 复制矩阵:
          1. CvMat* M1 = cvCreateMat(4,CV_32FC1);
          2. CvMat* M2;
          3. M2=cvCloneMat(M1);
        • 初始化矩阵:
          1. double a[] = { 1, 10,12 };
          2. CvMat Ma=cvMat(3,a);
          1. 另一种方法:
          1. CvMat Ma;
          2. cvInitMatHeader(&Ma,a);
        • 初始化矩阵为单位阵:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          2. cvSetIdentity(M); // 这里似乎有问题,不成功

        存取矩阵元素

        • 假设需要存取一个2维浮点矩阵的第(i,j)个元素.
        • 间接存取矩阵元素:
          1. cvmSet(M,2.0); // Set M(i,j)
          2. t = cvmGet(M,j)
        • 直接存取,假设使用4-字节校正:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          2. int n = M->cols;
          3. float *data = M->data.fl;
          4. data[i*n+j] = 3.0;
        • 直接存取,校正字节任意:
          1. CvMat* M = cvCreateMat(4,CV_32FC1);
          2. int step = M->step/sizeof (float );
          3. float *data = M->data.fl;
          4. (data+i*step)[j] = 3.0;
        • 直接存取一个初始化的矩阵元素:
          1. double a[16];
          2. CvMat Ma = cvMat(3,a);
          3. a[i*4+j] = 2.0; // Ma(i,j)=2.0;

        矩阵/向量操作

        • 矩阵-矩阵操作:
          1. CvMat *Ma, *Mb,*Mc;
          2. cvAdd(Ma, Mc); // Ma+Mb -> Mc
          3. cvSub(Ma, Mc); // Ma-Mb -> Mc
          4. cvMatMul(Ma,Mc); // Ma*Mb -> Mc
        • 按元素的矩阵操作:
          1. CvMat *Ma,*Mc;
          2. cvMul(Ma, Mc); // Ma.*Mb -> Mc
          3. cvDiv(Ma, Mc); // Ma./Mb -> Mc
          4. cvAddS(Ma,Mc); // Ma.-10 -> Mc
        • 向量乘积:
          1. double va[] = {1,3};
          2. double vb[] = {0,1};
          3. double vc[3];
          4. CvMat Va=cvMat(3,va);
          5. CvMat Vb=cvMat(3,vb);
          6. CvMat Vc=cvMat(3,vc);
          7. double res=cvDotProduct(&Va,&Vb); // 点乘: Va . Vb -> res
          8. cvCrossProduct(&Va,&Vc); // 向量积: Va x Vb -> Vc
          9. end{verbatim}

          注意 Va,Vc 在向量积中向量元素个数须相同.

        • 单矩阵操作:
          1. CvMat *Ma, *Mb;
          2. cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (不能对自身进行转置)
          3. CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]
          4. double d = cvDet(Ma); // det(Ma) -> d
          5. cvInvert(Ma,Mb); // inv(Ma) -> Mb
        • 非齐次线性系统求解:
          1. CvMat* A = cvCreateMat(3,CV_32FC1);
          2. CvMat* x = cvCreateMat(3,CV_32FC1);
          3. CvMat* b = cvCreateMat(3,CV_32FC1);
          4. cvSolve(&A,&x); // solve (Ax=b) for x
        • 特征值分析(针对对称矩阵):
          1. CvMat* A = cvCreateMat(3,CV_32FC1);
          2. CvMat* E = cvCreateMat(3,CV_32FC1);
          3. CvMat* l = cvCreateMat(3,CV_32FC1);
          4. cvEigenVV(&A, &E,&l); // l = A的特征值 (降序排列) E = 对应的特征向量 (每行)
        • 奇异值分解SVD:
          1. CvMat* A = cvCreateMat(3,CV_32FC1);
          2. CvMat* U = cvCreateMat(3,CV_32FC1);
          3. CvMat* D = cvCreateMat(3,CV_32FC1);
          4. CvMat* V = cvCreateMat(3,CV_32FC1);
          5. cvSVD(A, CV_SVD_U_T|CV_SVD_V_T); @H_27_2502@// A = U D V^T

        猜你在找的VB相关文章