简单介绍

  本篇承接上一篇。继续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. tp框架报错 Namespace declaration statement has to be the very first statement in the script

    Namespace declaration statement has to be the very first statement in the script tp框架报这个错误,错误行数就是nam ...

  2. visual studio 2015将已有项目添加到码云(gitee)

    visual studio 2015将已有项目添加到码云的步骤包括:gitee新建项目.清空项目及VS发布项目 1.gitee新建项目 2.清空项目 清空项目则会将vs项目的master分支发布到gi ...

  3. WinServer-IIS-压缩及缓存

    静态内容压缩: 默认10s内有2个客户端一起请求服务器的话,服务器就会把相关的静态内容压缩返回 动态内容压缩: 默认IIS的程序域最高可以占用CPU90%的资源,这个可以通过命令行修改 缓存和内核缓存 ...

  4. CF 567C(Geometric Progression-map)

    C. Geometric Progression time limit per test 1 second memory limit per test 256 megabytes input stan ...

  5. (转)<![CDATA[]]>和转义字符

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”. 此标记用于xml文档中,我们先来看看使用转义符的情 ...

  6. hdu2546 饭卡 01-背包问题

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem ...

  7. bzoj1022: [SHOI2008]小约翰的游戏John(博弈SG-nim游戏)

    1022: [SHOI2008]小约翰的游戏John 题目:传送门 题目大意: 一道反nim游戏,即给出n堆石子,每次可以取完任意一堆或一堆中的若干个(至少取1),最后一个取的LOSE  题解: 一道 ...

  8. pjlib深入剖析和使用详解

    1. PJSIP简介 PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括:    1).极具移植性.(Extremely portable)                 ...

  9. javascript系列-class7.Date对象

    1.对象   什么是对象?       对象的类型是Object.   JavaScript 中的所有事物都是对象:字符串.数值.数组.函数...   javaScript中万事万物皆对象   用官方 ...

  10. MYSQL5.6/5.7 数据库密码丢失问题处理(需重启)

    文章结构图: 一.MYSQL5.6密码丢失 1.  强行停止MYSQL 丢失超级管理用户ROOT的密码是致命的,可以通过--skip-grant-tables参数来跳过权限表. 停止MYSQL,强行杀 ...