opencv求矩阵的逆_OpenCV矩阵运算

人总是有种惰性,就是用惯了方便简单的东西之后就不愿意再去尝试复杂的东西了。对于图像处理来说,大多数国内外院校教学是用matlab作为基础编程软件,很少有在学习阶段就用C++、Java之类编程的。matlab的确在对于矩阵处理、数学计算方面有着前所未有的便利,然而这种便利只能限于学习阶段或者算法研究阶段,当进入工程或者项目中,我们不得不面临将短短几行的matlab代码转化成成百上千行的C++代码。这种转化着实痛苦,然而为了集成和封装,我们又不得不去做。这时候就要感谢前人开发出了各种open source的库,其中对于图像处理和矩阵运算来讲帮助最大的,就是OpenCV了。

杂话说了一大堆,是因为最近做项目发现了OpenCV确实给图像处理和矩阵运算提供了好大的便利。可能大多数开发人员用OpenCV只关注那些图像函数,而没有意识到其数学计算的强大,所以我想简单谈谈OpenCV是如何利用已经封装好的函数进行一些矩阵运算的。

首先用matlab计算3*3矩阵

clear all; close all; clc;

A = [10 5 3

6 4 7

1 0 9];

B = [1 3 8

7 5 4

10 6 0];

%矩阵乘法

A*B

%矩阵除法

A/B

A*inv(B)

%矩阵按位除法

A./B

再用OpenCV计算相同的矩阵

#include #include using namespace std;

using namespace cv;

void main()

{

//构造矩阵double A_num[3][3] = { { 10, 5, 3 }, { 6, 4, 7 }, { 1, 0, 9 } };

double B_num[3][3] = { { 1, 3, 8 }, { 7, 5, 4 }, { 10, 6, 0 } };

Mat A(3, 3, CV_64F, A_num);

Mat B(3, 3, CV_64F, B_num);

//打印矩阵cout << A << endl;

cout << B << endl;

cout << "以上为原始矩阵 以下为运算结果" << endl;

//矩阵运算cout << "乘法结果" << endl;

cout << A * B << endl;//乘法cout << "除法结果" << endl;

cout << A * B.inv() << endl;//除法cout << "按位除结果" << endl;

cout << A / B << endl;//按位除法waitKey();

system("pause");

}

对比运行结果

可以看出,OpenCV对矩阵的处理与matlab大同小异,在上述例子中只列出了矩阵初始化、乘法、按位除法、求逆这几种简单运算,其处理结果与matlab的结果相同。当然OpenCV矩阵功能不止如此。具体的运算可以查询OpenCV说明文档。如果以后发现一些更强大更有意义的功能,会另行介绍

OpenCV Mat类型说明文档

OpenCV Mat类型运算说明文档

你可能感兴趣的:(opencv求矩阵的逆)