(1)参与点乘的两个Mat矩阵的数据类型(type)只能是 CV_32F、 CV_64FC1、 CV_32FC2、 CV_64FC2 这4种类 型中的一种。若选用其他类型,比如CV_8UC1,编译器会报错。
如下列子会报错
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat r=(Mat_<float>(3,3)<<1,1,1,2,2,2,3,3,3);
Mat t=(Mat_<double>(3,3)<<1,1,1,2,2,2,3,3,3);
Mat result=r*t;
cout<return 0;
}
解决矩阵乘法类型不匹配的方法
使用 mat.convertTo方法转换数据类型
如下就顺利解决
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat r=(Mat_<float>(3,3)<<1,1,1,2,2,2,3,3,3);
Mat t=(Mat_<double>(3,3)<<1,1,1,2,2,2,3,3,3);
cout<cout<//convert to CV_32F type
t.convertTo(t,CV_32F);
cout<cout<return 0;
}
(2)获取Mat 中存的数据类型
如下
Mat m;
m.type();
(3)取Mat 的子序列
使用Range类用来指定连续的子序列
如mat.rowRange mat.colRange
下面例子取r的2*2子序列。
#include
#include
#include
using namespace std;
int main() {
Mat r=(Mat_<float>(3,3)<<1,1,1,2,2,2,3,3,3);
Mat subr;
Mat depthsubr;
//浅拷贝
subr=r.rowRange(0,2).colRange(0,2);
//深拷贝
r.rowRange(0,2).colRange(0,2).copyTo(depthsubr);
cout<cout<return 0;
}
(3)取Mat中的某行或某列
使用mat.rowRange和mat.colRange,如(2)例
(4)Mat加减乘除常数值
如下
#include
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat r=(Mat_<float>(2,2)<<1,1,2,2);
Mat show;
//1.add const value
show=r+1;
cout<//2.subtract
show=r-1;
cout<//3., multiply
show=r*2;
cout<//4.divide
show=r/2;
cout<return 0;
}
(5)Mat 矩阵的加减乘除运算及含义
+-代表矩阵对应位置的元素相加相减;
*代表矩阵相乘
/要注意是对应位置的元素的相除;
如下面的列子
#include
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat a=(Mat_<float>(2,2)<<1,1,1,1);
Mat b=(Mat_<float>(2,2)<<1,2,3,4);
Mat show;
//1.add
//show=r.rows(0);
show=a+b;
cout<//2.subtract
show=a-b;
cout<//3., multiply
show=a*b;
cout<//4.divide
show=a/b;
cout<return 0;
}
结果如下
[2, 3;
4, 5]
[0, -1;
-2, -3]
[4, 6;
4, 6]
[1, 0.5;
0.33333334, 0.25]
(6)初始化Mat方法
a)全初始化为0
Mat initZero=Mat::zeros(2,2,CV_32F);
b)全初始化为1
Mat initOne= Mat::ones(2,2,CV_32F);
c)全初始化为对角阵
Mat initEye=Mat::eye(2,2,CV_32F);
(7)矩阵求逆和求转置
用inv()求逆,t()求转置
#include
#include
using namespace std;
using namespace cv;
int main() {
Mat r=(Mat_<float>(2,2)<<1,1,0,2);
cout<cout<cout<return 0;
}