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`:等待按键 ### 像素级 * 在灰度 ...
随机推荐
- 06001_NoSQL概述
1.什么是NoSQL? NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库. 2.关于关系型数据库和nosql数据库 (1)关系型 ...
- UVALive 2664 One-way traffic
One-way traffic Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Or ...
- POJ——T 3159 Candies
http://poj.org/problem?id=3159 Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 33328 ...
- 洛谷 P1617 爱与愁的一千个伤心的理由
P1617 爱与愁的一千个伤心的理由 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. 题目描述 ...
- Android开发之视图动画基础
Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转 ...
- hdu 4966 最小树形图
将每门课等级拆成0,1,2,3...a[i]个点,对每一个等级大于0的点向它低一级连边,权值为0[意思是,若修了level k.则level(0~k)都当做修了] 将输入的边建边,权值为money[i ...
- iOS开发—在@interface,@implementation和@property中变量的定义
一直搞不懂在OC中变量在@interface和@implementation中有什么区别,定义@property又有什么不同,查了很多资料,总结如下: //ViewController.h @inte ...
- hpuoj--1287--HH实习(斐波那契数巧用)
问题 D: HH实习 时间限制: 1 Sec 内存限制: 128 MB 提交: 53 解决: 37 [提交][状态][讨论版] 题目描述 这学期到了十五周了,HH突然要去实训中心实习了,想到要拿着 ...
- caffe中lenet_solver.prototxt配置文件注解
caffe框架自带的例子mnist里有一个lenet_solver.prototxt文件,这个文件是具体的训练网络的引入文件,定义了CNN网络架构之外的一些基础参数,如总的迭代次数.测试间隔.基础学习 ...
- Java TreeMap 介绍和使用
转自:https://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习. 我们先对TreeMap有个整体认识,然后再学 ...