简单介绍

  本篇承接上一篇。继续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.rows;
Height = tmpMat.cols;
IplImage tmp;
 
tmp = tmpMat;
 
for(i=0; i< Width; i++){
for(j=0; j<Height; j++){
s1 = cvGet2D(&tmp, i, j);
printf("%0.1lf ", s1.val[0]);
}
printf("\n");
}
printf("\n");
}
 
int main(int argc, char *argv[]){
 
/*************初始化矩阵*****************************/
mat1 = Mat(3, 3, CV_64FC1, x);
src1 = mat1;
mat2 = Mat(3, 3, CV_64FC1, y);
src2 = mat2;
/*************显示矩阵数据***************************/
printf("mat1:\n");
showMatdate(mat1);
 
/*****************矩阵的逆**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvInvert(&src1, &src3);
showMatdate(mat3);
return 0;
}

结果显示

      

矩阵元素自然对数

详细代码

/*****************矩阵元素自然对数**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvLog(&src1, &src3);
showMatdate(mat3);

结果显示

      

矩阵查找表转换

详细代码

/*****************矩阵查找表转换**×******************/
uchar lut[256];
 
mat3 = Mat(3, 3, CV_8UC1);
src3 = mat3;
mat1.convertTo(mat1, CV_8UC1);
src1 = mat1;
mat2 = cvCreateMatHeader(1, 256, CV_8UC1);
src2 = mat2;
for (int i = 0; i < 256; i++) {
lut[i] = 255 - i;
}
cvSetData(&src2, lut, 0);
cvLUT(&src1, &src3, &src2);
printf("cvLUT(mat1):\n");
showMatdate(mat3);
    注意:mat3 = src2[mat1].(假设mat1格式为CV_8U)
mat3 = src2[mat1 + 128].(假设mat1格式为CV_8S)

结果显示

      

计算向量间马氏距离

详细代码

/*************显示矩阵数据***************************/
printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
/*****************计算向量间马氏距离**********************/
mat3 = Mat(3, 3, CV_64FC1, z);
src3 = mat3;
printf("mat3:\n");
showMatdate(mat3);
 
tmp = cvMahalanobis(&src1, &src2, &src3);
printf("cvMahalanobis(mat1, mat2, mat3): %.1lf\n", tmp);
    马氏距离的定义。參考例如以下:http://blog.csdn.net/jmy5945hh/article/details/20536929

结果显示

      

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

获得矩阵元素间最大值

详细代码

/*****************计算矩阵參数间最大值**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvMax(&src1, &src2, &src3);
printf("cvMax(mat1, mat2):\n");
showMatdate(mat3);
   类似的还有cvMaxS:计算矩阵元素和參数的最大值。

cvAvg:计算矩阵元素的平均值。

cvAvgSdv:计算矩阵元素的平均值和标准差。

cvMin:计算矩阵參数间最小值。

cvMinS:计算矩阵元素和參数的最小值。

结果显示

      

单通道合成多通道矩阵

详细代码

    mat3 = Mat(1, 3, CV_8UC3);
src3 = mat3;
cvMerge(&src1, &src2, 0, 0, &src3);
printf("cvMax(mat1, mat2):\n");
showMatdate(mat3);
  相应的函数为:split()(将多通道分离为单通道矩阵)。

获取矩阵最大最小元素

详细代码

    printf("mat1:\n");
showMatdate(mat1);
cvMinMaxLoc(&src1, &min, &max, &min_p1, &max_p2);
printf("min:%lf, min_p1.x:%d, min_p1.y:%d\n", min, min_p1.x, min_p1.y);
printf("max:%lf, max_p2.x:%d, max_p2.y:%d\n", max, max_p2.x, max_p2.y);
     获取到最大最小值:max,min。以及它们的相应位置坐标:min_p1, max_p2。

结果显示

         

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

两个矩阵傅里叶频谱相乘

详细代码

    printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
 
cvMulSpectrums(&src1, &src2, &src3, DFT_ROWS);
printf("mat3:\n");
showMatdate(mat3);

结果显示

         

矩阵乘法

详细代码

    printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
 
cvMul(&src1, &src2, &src3, 3);
printf("cvMul(mat1 * mat2 * 3):\n");
showMatdate(mat3);

结果显示

         

矩阵和转置的乘积

详细代码

    printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
 
cvMulTransposed(&src1, &src3, 0, &src2);
printf("cvMulTransposed(mat1):\n");
showMatdate(mat3);
    void cvMulTransposed( const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL );
src:输入矩阵
dst:目标矩阵
order:乘法顺序
delta:一个可选数组, 在乘法之前从 src 中减去该数组。 函数 cvMulTransposed 计算 src 和它的转置的乘积。
函数求值公式:
假设 order=0
dst=(src-delta)*(src-delta)T
否则
dst=(src-delta)T*(src-delta)

结果显示

        

矩阵绝对差等

详细代码

    printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
 
tmp = cvNorm(&src1, &src2, NORM_L1);
printf("cvNorm(mat1, mat2, NORM_INF):%lf\n", tmp);
  double cvNorm(const CvArr* arr1, const CvArr* arr2=NULL, int norm_type=CV_L2, const CvArr* mask=NULL )
假设arr2 == NULL
则:

否则:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
或者
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

结果显示

     

极性坐标转换到笛卡尔坐标

详细代码

    printf("mat1:\n");
showMatdate(mat1);
printf("mat2:\n");
showMatdate(mat2);
 
mat3 = Mat(3, 1, CV_64FC1);
src3 = mat3;
mat4 = Mat(3, 1, CV_64FC1);
src4 = mat4;
 
cvPolarToCart(&src1, &src2, &src3, &src4, true);
printf("cvPolarToCart(mat1, mat2)--x:\n");
showMatdate(mat3);
printf("cvPolarToCart(mat1, mat2)--y:\n");
showMatdate(mat4);
  void cvPolarToCart(const CvArr* magnitude, const CvArr* angle, CvArr* x, CvArr* y, int angle_in_degrees=0)
  magnitude:极坐标的长度。

angle:极坐标的角度。
x:笛卡尔X坐标。 y:笛卡尔Y坐标。
angle_in_degrees:若为true,表示输入的是角度,否则表示输入的是弧度。

结果显示

   

矩阵元素求幂

详细代码

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

结果显示

   

矩阵简化为向量

详细代

    printf("mat1:\n");
showMatdate(mat1);
 
mat3 = Mat(3, 1, CV_64FC1);
src3 = mat3;
 
cvReduce(&src1, &src3, 1, CV_REDUCE_MAX);
printf("cvReduce(mat1, 1 , CV_REDUCE_MAX):\n");
showMatdate(mat3);
  void cvReduce(const CvArr* src, CvArr* dst, int dim=-1, int op=CV_REDUCE_SUM)
src:待简化的矩阵。
dst:生成的向量。
dim:0意味着矩阵被处理成一行,1意味着矩阵被处理成为一列,-1时维数将依据输出向量的大小自己主动选择.
op:
CV_REDUCE_SUM-输出是矩阵的全部行/列的和.
CV_REDUCE_AVG-输出是矩阵的全部行/列的平均向量.
CV_REDUCE_MAX-输出是矩阵的全部行/列的最大值.
CV_REDUCE_MIN-输出是矩阵的全部行/列的最小值.

结果显示

   

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

opencv矩阵运算(2)的更多相关文章

  1. OpenCV矩阵运算

    矩阵处理 1.矩阵的内存分配与释放 (1) 总体上: OpenCV 使用C语言来进行矩阵操作.不过实际上有很多C++语言的替代方案可以更高效地完成. 在OpenCV中向量被当做是有一个维数为1的N维矩 ...

  2. 第一周:读取XML深度数据并将其重建为三维点云

    本周主要任务:学习PCL点云库,掌握利用PCL对点云处理的方法 任务时间:2014年9月1日-2014年9月7日 任务完成情况:完成了读取单幅xml深度数据,并重建三维点云并显示 任务涉及基本方法: ...

  3. 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, ...

  4. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  5. OpenCV MAT基本图像容器

    参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...

  6. C++矩阵运算库推荐

    最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...

  7. 图像储存容器Mat[OpenCV 笔记11]

    IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...

  8. OpenCV(2)-Mat数据结构及访问Mat中像素

    Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...

  9. OpenCV 2 Computer Vision Application Programming Cookbook读书笔记

    ### `highgui`的常用函数: `cv::namedWindow`:一个命名窗口 `cv::imshow`:在指定窗口显示图像 `cv::waitKey`:等待按键 ### 像素级 * 在灰度 ...

随机推荐

  1. How-to-quick-getting-started-for-Frontend

    一转眼已一年多不专注前端方面的开发工作,这一年前端方面的技术又是新天地,偶然接到内部团队邀请我给他们做一个前端的讲座,希望能帮助他们快速.且深刻了解前端这个行业以及行业内的知识,这可真有点让我为难,由 ...

  2. apche本地测试,无法访问此网站

  3. DDL表结构修改

      *1)创建表    create table 表名(     字段名 类型,     ....    );     //以现有表复制一个新表   create table j012 as   se ...

  4. servlet调用的几种方式

    參见 文库/java/javaEE全新学习教程2.2节 1.通过URL调用 2通过提交表单 3超链接 4 javascript写一个函数,调用这个函数 1,首先在project的WebRoot目录下建 ...

  5. [Angular] Read Custom HTTP Headers Sent by the Server in Angular

    By default the response body doesn’t contain all the data that might be needed in your app. Your ser ...

  6. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  7. Hadoop 2.2.0和HBase-0.98 安装snappy

    1.安装须要的依赖包及软件 须要安装的依赖包有: gcc.c++. autoconf.automake.libtool 须要安装的配套软件有: Java6.Maven 关于上面的依赖包,假设在ubun ...

  8. 文件类似性推断 -- SimHash

    近期调研了一下simhash算法,它主要用在谷歌网页去重中.网上有非常多原理性的介绍. 既然能够用来推断文件的相似性,就想知道效果怎么样.simhash的准确度是否依赖于分词算法?是否和simhash ...

  9. bzoj3444: 最后的晚餐(并查集+组合数学)

    3444: 最后的晚餐 题目:传送门 题解: 考虑有解的情况: 直接上并查集,同一个联通块里的人一定要坐在一起的.不难发现其实对于每个联通块最多就只有两种排列方式,那就直接把大于等于两个人的联通块先去 ...

  10. 山东理工oj--1912--IP地址(水题)

     IP地址 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 2011年2月3日,国际互联网名称与数字地址分配机构(ICANN) ...