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.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)的更多相关文章
- OpenCV矩阵运算
矩阵处理 1.矩阵的内存分配与释放 (1) 总体上: OpenCV 使用C语言来进行矩阵操作.不过实际上有很多C++语言的替代方案可以更高效地完成. 在OpenCV中向量被当做是有一个维数为1的N维矩 ...
- 第一周:读取XML深度数据并将其重建为三维点云
本周主要任务:学习PCL点云库,掌握利用PCL对点云处理的方法 任务时间:2014年9月1日-2014年9月7日 任务完成情况:完成了读取单幅xml深度数据,并重建三维点云并显示 任务涉及基本方法: ...
- 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, ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- OpenCV MAT基本图像容器
参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...
- C++矩阵运算库推荐
最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...
- 图像储存容器Mat[OpenCV 笔记11]
IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
- OpenCV 2 Computer Vision Application Programming Cookbook读书笔记
### `highgui`的常用函数: `cv::namedWindow`:一个命名窗口 `cv::imshow`:在指定窗口显示图像 `cv::waitKey`:等待按键 ### 像素级 * 在灰度 ...
随机推荐
- Java7的那些新特性
本文介绍的java 7新特性很多其它的感觉像是语法糖.毕竟java本身已经比較完好了.不完好的非常多比較难实现或者是依赖于某些底层(比如操作系统)的功能. 不过java7也实现了类似aio的强大功能. ...
- ORACLE-014:oracle中查看DBLinkpassword
dblink在数据库中使用是比較多的,简单方便.只是随着oracle安全机制的加强.普通用户登录仅仅能看到,username以及连接字符串.那么dblinkpassword怎样查看呢? 非常easy. ...
- HDU 4305 Contest 1
感觉是有很多细节要处理的.尤其是求逆元后的运算,应该是存在超范围的情况的. #include <iostream> #include <cstdio> #include < ...
- Detours改动段属性漏洞
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- USACO runaround
/* ID:kevin_s1 PROG:runround LANG:C++ */ #include <iostream> #include <cstdio> #include ...
- Mysql 数据迁移后 启动出错
今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...
- MongoDB基本概念和安装配置
基本概念 MongoDB直接存储JSON. 有了NoSQL数据库之后,可以直接在业务层将数据按照指定的结构进行存储. NO SQL NoSQL 1 数据库 数据库 2 表 集合 3 行 文档 4 列 ...
- JAVA设计模式之【迭代器模式】
迭代器模式 聚合类,聚合对象 电视机遥控器,迭代器,遍历局和对象中的成员 灵活新增遍历方法 将负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离.这就是迭代器模式. 灵活性,可扩 ...
- hdoj--3592--World Exhibition(差分约束)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- MYSQL 5.7 MHA(GTID+ROW)部署及failover,online_change实战演练
文章结构如下: 1.MHA简介 Masterhigh availability manager and toolsfor mysql,是日本的一位mysql专家采用perl语言编写的一个脚本管理工具, ...