Mat类型的构造方式有二十多种,仅学习了常用的构造方式。
1)利用im.read函数读入图像
Mat Img1 = imread("C:/Users/Desktop/lena.jpg");//读入图像 路径用/递进
namedWindow("Input img",WINDOW_AUTOSIZE); //创建一个窗口1
imshow("Input img", Img1); //在窗口1上展示图片
2)拷贝构造
Mat Img2;
Img2 = Img1.clone(); // Img2就拷贝了一份Img1的图像
imshow("output img", Img2);
3)相同类型构造
Mat Img3;
Img3 = Mat(Img1.size(), Img1.type()); //取图像1的大小 图像1的类型相同构造一个大小相同的矩阵
Img3 = Scalar(255, 0, 0); //BGR 三位
//由于Img1是三通道的,故Scalar可以有三个参数赋值
//分别对应三通道的BGR Blue Green Red
namedWindow("Output img", WINDOW_AUTOSIZE); //创建一个窗口1
imshow("Output img", Img2);
4)构造时赋值操作
//rows为行数,cols为列数 Size(cols,rows)
Mat Img3(Size(480, 640), CV_8UC1); //构造一个行为640 列为480的 8位无符号单通道矩阵
Img3 = Scalar(255); //此单通道灰度图像 可以将所以的单元赋值为255 灰度值
///还可以直接在开始便进行赋值操作
Mat a(2, 2, CV_8UC3, Scalar(255, 255, 255)); // 2*2 8位无符号三通道矩阵 每个元素都是255
5)利用数组构造
Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
//利用枚举法赋值操作
Mat c = cv::Mat_<int>(3, 3); //创建一个的3*3的矩阵
for (int i = 0;i < c.rows;i++)
for (int j = 0;j < c.cols;j++)
c.at<int>(i, j) = i+j; //给每个元素赋值操作
//利用数组进行赋值//
unsigned char arr[8] = { 5,6,7,8,1,2,3,4 };
Mat f = cv::Mat(2, 2, CV_8UC2, arr);
6)类方法赋值
//类方法赋值//
Mat a = cv::Mat::eye(3,3,CV_8UC1); //构建3*3单位矩阵 对角元素为1
Mat b = (cv::Mat_<int>(1, 3) << 1, 2, 3); //构建1*3的矩阵 数据为 1 2 3
Mat c = cv::Mat::diag(b); //c的对角元素为b的元素 其余都是0
Mat d = cv::Mat::ones(3, 3, CV_8UC1); //构建单通道全为1的3*3矩阵
Mat e = cv::Mat::zeros(4, 2, CV_8UC1); //构建单通道全为0的 4*2的矩阵
Mat类的运算
Mat创建的是图像矩阵,其运算规则类似与矩阵的运算。 乘法分为矩阵的乘法与数乘运算
Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
//加法减法就是矩阵的加法减法 --乘法除法为数乘数除
c = a + b;
d = a - b;
e = 2 * a;
f = a / 2;
Mat a1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
Mat b1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
Mat g;
g = a1 * b1;
//要进行矩阵乘法 元素类型必须都是CV_32FC1 CV_64FC1 CV_32FC1 CV_64FC2
//即矩阵类型为float或者double类型
double k;
k = a.dot(b); //dot返回类型是double
//即把a矩阵扩展成一个行向量
//b矩阵扩展成一个列向量 然后进行内积乘
// 结果即是1+4+9+16..... 1-9的平方和
cout << k << endl;
Mat m;
m = a.mul(b); //a与b进行数乘运算 每个对应的矩阵元素相乘 而不是进行矩阵乘法,内积运算