博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv矩阵运算(2)
阅读量:6970 次
发布时间:2019-06-27

本文共 5748 字,大约阅读时间需要 19 分钟。

简单介绍

  本篇承接上一篇。继续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

结果显示

 

矩阵元素自然对数

详细代码

/*****************矩阵元素自然对数**********************/    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);
马氏距离的定义。參考例如以下:

结果显示

 

获得矩阵元素间最大值

详细代码

/*****************计算矩阵參数间最大值**********************/    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。

结果显示

 

两个矩阵傅里叶频谱相乘

详细代码

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则:    否则:         或者

结果显示

 

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

详细代码

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-输出是矩阵的全部行/列的最小值.

结果显示

 

转载地址:http://vjasl.baihongyu.com/

你可能感兴趣的文章
Tomcat7基于Redis的Session共享实战一
查看>>
Linux下使用ps命令来查看Oracle相关的进程
查看>>
使用两个路由器扩展家庭无线网络
查看>>
Spark metrics on wordcount example
查看>>
【SQL Sever】SQL Sever数据库重命名
查看>>
Javascript数组中shift()和push(),unshift()和pop()操作方法使用
查看>>
Linux搭建一个FTP服务器
查看>>
Quick Touch – 在 iOS 设备运行的 “Touch Bar”
查看>>
Post with HttpClient
查看>>
仰视源代码,实现strcpy
查看>>
【Bootstrap Method】Evaluating The Accuracy of a Classifier
查看>>
让 Python 带你进入开源的世界——Git 从入门到与他人协作开发
查看>>
解决Flask局域网内访问不了的问题
查看>>
PHP获取今天、昨天、明天的日期
查看>>
[转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
查看>>
在eclipse上Checkstyle的安装和使用
查看>>
控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术
查看>>
vertica系列:数据的导入导出
查看>>
centos7如何添加开机启动服务/脚本
查看>>
Android OpenSL ES 开发:OpenSL ES利用SoundTouch实现PCM音频的变速和变调
查看>>