opencv矩阵运算(3)

简介

  本篇承接上一篇,继续opencv下矩阵计算的函数使用。

矩阵复制

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvRepeat(&src1, &src3);
    printf("cvRepeat(mat1):\n");
    showMatdate(mat3);

结果显示

    

矩阵比例相加

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    tmp.val[0] = 1.5;
    cvScaleAdd(&src1, tmp, &src2, &src3);
    printf("cvScaleAdd(mat1, tmp, mat2):\n");
    showMatdate(mat3);
   注意:mat3 = mat1 * tmp + mat2;

结果显示

    

初始化矩阵对角线元素

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    tmp.val[0] = 1.5;
    cvSetIdentity(&src1, tmp);
    printf("cvSetIdentity(mat1, tmp):\n");
    showMatdate(mat1);
   注意:对角线元素初始化为tmp,其他元素为0。

结果显示

    

三次曲线方程实根

具体代码

    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(1, 3, CV_64FC1);
    src3 = mat3;
 
    CvMat tmp1 = mat2;
    CvMat tmp2 = mat3;
 
    cvSolveCubic(&tmp1, &tmp2);
    printf("cvSolveCubic(mat2):\n");
    showMatdate(mat3);
   注意:实根可以有一个或者三个。

结果显示

    

矩阵减法

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvSub(&src1, &src2, &src3);
    printf("cvSub(mat1, mat2):\n");
    showMatdate(mat3);
    注意:1、void cvSub(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL)
               最后可以选择掩码控制。
          2、void cvSubRS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL )
               dst = value - src。
          3、cvSubS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL)
               dst = src - val。

结果显示

    

矩阵元素之和

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    tmp = cvSum(&src1);
    printf("cvSum(mat1);%lf\n", tmp.val[0]);

结果显示

    

对角线元素之和

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    tmp = cvTrace(&src1);
    printf("cvTrace(mat1);%lf\n", tmp.val[0]);

结果显示

    

计算矩阵转置

具体代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    cvTranspose(&src1, &src3);
    printf("cvTranspose(mat1);\n");
    showMatdate(mat3);

结果显示

    

其他相关矩阵操作

1、计算向量的协方差:calcCovarMatrix 2、计算二维向量大小和角度:cartToPolar 3、检查输入矩阵中的无效值:checkRange 4、将其他矩阵格式转换为Mat: C++: Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode=0 ) 5、执行一维或二维数组的正反余弦变换: C++: void dct(InputArray src, OutputArray dst, int flags=0) 6、执行一维或二维数组的正逆傅里叶变换: C++: void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0) 7、计算对称矩阵的特征值和特征向量: void cvEigenVV(CvArr* mat, CvArr* evects, CvArr* evals, double eps=0, int lowindex=-1, int highindex=-1 ) 8、提取所选的图像通道: void extractImageCOI(const CvArr* arr, OutputArray coiimg, int coi=-1 ) 9、将一个图像通道数据复制到旧的对应通道中: void insertImageCOI(InputArray coiimg, CvArr* arr, int coi=-1 ) 10、执行广义矩阵乘法: void cvGEMM(const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0) 11、返回给定矢量的最优DFT大小: C++: int getOptimalDFTSize(int vecsize) 12、返回一个单一像素的转换函数: C++: ConvertData getConvertElem(int fromType, int toType) 13、计算一维或者二维的逆离散余弦变换: C++: void idct(InputArray src, OutputArray dst, int flags=0) 14、计算一维或者而且的逆离散傅里叶变换: C++: void idft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0) 15、检查数组元素是否位于其他数组元素之间: C++: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst) 16、向量的透视矩阵变换 void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat) 17、解决一个或多个线性系统最小二乘法。 int cvSolve(const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU) 18、执行每个数组元素矩阵变换(可以用在图像旋转)。 void cvTransform(const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL )

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 00:33:34

opencv矩阵运算(3)的相关文章

opencv矩阵运算(2)

简单介绍 本篇承接上一篇.继续opencv下矩阵计算的函数使用. 计算矩阵的逆 注意:矩阵A是可逆矩阵的充分必要条件是行列式detA不等于0. 详细代码 double x[3][3] = {{1, 2, 3}, {2, 2, 1}, {3, 4, 3}}; double y[3][3] = {{1, 0, 0}, {0, 2, 0}, {0, 0, 3}};   void showMatdate(Mat tmpMat){ int i, j; CvScalar s1; Width = tmpMat

opencv矩阵运算(1)

简介 在机器学习中,经常需要用到矩阵计算.因此从本篇开始整理下opencv实现的矩阵计算相关函数使用. 矩阵初始化 具体代码 这里初始化了两个3X3矩阵,并将它的数据显示出来: double x[3][3] = {{1, 50, -100}, {1, -110, 220}, {-1, 150, 150}}; double y[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};   void showMatdate(Mat tmpMat){ int i, j; C

OpenCV矩阵运算

矩阵处理 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_chann

opencv中相关的矩阵运算

一.矩阵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);

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组

[转] Matlab与C++混合编程,添加OpenCV库

原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法 调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考

opencv

OpenCV是Intel公司开发的图像处理和计算机视觉函数库,它有以下特点: 1) 开放C源码 2) 基于Intel处理器指令集开发的优化代码 3) 统一的结构和功能定义 4) 强大的图像和矩阵运算能力 5) 方便灵活的用户接口 6)同时支持MS-WINDOWS.LINUX平台 作为一个基本的计算机视觉.图像处理和模式识别的开源项目,OPENCV可以直接应用于很多领域,作为第二次开发的理想工具.不过在利用OPENCV做商业开发应用前,请仔细阅读OPENCV包所附带的 PUBLIC LICENSE

OpenCV 3 最新模块一次看个够

OpenCV 3 的改动在哪? C 风格的API很快将会消失,完全被C++的API替代,代码更加简洁.不易出错.读者如果想借助opencv最新的功能,记得清理代码中的C风格API. C++ API 将更加简洁. 所有的算法都将继承自 cv::Algorithm 接口. 大型的模块将拆分为小模块,模块将在后面继续讲解. OpenCV 3 有这么多文件夹,从何入手? 3rdparty/,包含第三方的库,比如视频解码用的 ffmpeg,jpg.png.tiff等图片的开源解码库. apps/,包含进行

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效