OpenCV Mat基本操作总结

(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;
}

你可能感兴趣的:(图像处理)