人总是有种惰性,就是用惯了方便简单的东西之后就不愿意再去尝试复杂的东西了。对于图像处理来说,大多数国内外院校教学是用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类型运算说明文档