opencv计算两数组的乘积_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

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;

}

结果显示

0637c102073b011a48449a8beef89214.png

矩阵元素自然对数

详细代码

/*****************矩阵元素自然对数**********************/

mat3 = Mat(3, 3, CV_64FC1);

src3 = mat3;

cvLog(&src1, &src3);

showMatdate(mat3);

结果显示

0d6d209d1465a918a9af0c8bfe4bea36.png

矩阵查找表转换

详细代码

/*****************矩阵查找表转换**×******************/

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)

结果显示

785e2786a9661af658cb1b5075fe0fa1.png

计算向量间马氏距离

详细代码

/*************显示矩阵数据***************************/

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);

结果显示

Center

获得矩阵元素间最大值

详细代码

/*****************计算矩阵參数间最大值**********************/

mat3 = Mat(3, 3, CV_64FC1);

src3 = mat3;

cvMax(&src1, &src2, &src3);

printf("cvMax(mat1, mat2):\n");

showMatdate(mat3);

类似的还有cvMaxS:计算矩阵元素和參数的最大值。

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

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

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

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

结果显示

a9ffe1531480f844502cb408ddfc01b2.png

单通道合成多通道矩阵

详细代码

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。

结果显示

Center

两个矩阵傅里叶频谱相乘

详细代码

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);

结果显示

367d34d07e9edca011fa6acb650a56b1.png

矩阵乘法

详细代码

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);

结果显示

e6c592e287b862189c5270d18e9a4de2.png

矩阵和转置的乘积

详细代码

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)

结果显示

ab48b5d54094759e1d46e566856bdaf9.png

矩阵绝对差等

详细代码

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

则:

56f8ab54b74748da9f36a94e9490403c.png

否则:

Center

或者

Center

结果显示

58d7afec8ccc3ba7bb1c83bab798d371.png

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

详细代码

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,表示输入的是角度,否则表示输入的是弧度。

结果显示

5cb423e2dca5e748ac45d9670db33497.png

矩阵元素求幂

详细代码

printf("mat1:\n");

showMatdate(mat1);

mat3 = Mat(3, 1, CV_64FC1);

src3 = mat3;

cvPow(&src1, &src3, 2);

printf("cvPow(mat1, 2):\n");

showMatdate(mat3);

结果显示

e08de8eecef7c928a580d6f43f8ebe88.png

矩阵简化为向量

详细代

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

结果显示

Center


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部