Mat类的介绍
Mat类表示n维单通道或多通道的密集数值数组,它可用于存储实值或复数向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图。
使用实例
创建一个7×7的复数矩阵并用1+3j填充
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat M(7, 7, CV_32FC2, Scalar(1, 3));
waitKey(0);
destroyAllWindows();
return 0;
}
接下来打断点调试,更为生动的查看这段数据


下面这段内存就是存在矩阵M里面的数据,由于是32位矩阵,所以每段数据占四个字节,里面的0000803f从内存中提取出来就是0x3f800000,根据浮点数的转换规则,转换为十进制就是1.0,后面的0x40400000转换为浮点数十进制为3.0,可以观察到双通道的数据布局方式。
将上面矩阵转换为另一格式
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat M(7, 7, CV_32FC2, Scalar(1, 3));
M.create(100, 60, CV_8UC(15));
waitKey(0);
destroyAllWindows();
return 0;
}
create函数会让让新的数据格式覆盖掉原先的数据
对Mat矩阵进行行列变换
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat M(7, 7, CV_8UC1, Scalar(1));
//第五行乘3加第三行赋值给第三行
M.row(3) = M.row(3) + M.row(5) * 3;
//把第六列复制给第一列,这里不能用等于号赋值,具体原因我还没搞明白,感觉可能是行和列格式不一样吧
Mat M1 = M.col(1);
M.col(6).copyTo(M1);
waitKey(0);
destroyAllWindows();
return 0;
}
创建一个BGR3通道图像
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
//创建一个320×240的3通道BGR彩色图像
Mat img(Size(320, 240), CV_8UC3);
imshow("src", img);
//定义一个img上的区域
Mat roi(img, Rect(10, 10, 100, 100));
//赋值为绿色
roi = Scalar(0, 255, 0);
imshow("dst", roi);
waitKey(0);
destroyAllWindows();
return 0;
}
对图像的复制,获取图像信息等操作
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg");
Mat m1, m2;
m1 = image.clone();
image.copyTo(m2);
//创建空白图像
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
std::cout << m3 << std::endl;
//获取图像宽度
int width = image.cols;
//获取图像高度
int height = image.rows;
//获取图像通道数
int dim = image.channels();
int d = image.depth();
int t = image.type();
printf("width:%d,height:%d,channel:%d,depth:%d,type:%d\n", width, height, dim, d, t);
//创建单通道8位矩阵
Mat t1 = Mat(256, 256, CV_8UC1);
//给t1赋值
t1 = Scalar(0);
imshow("t1", t1);
Mat t2 = Mat(Size(256, 256), CV_8UC3);
t2 = Scalar(255, 0, 255);
imshow("t2", t2);
waitKey(0);
destroyAllWindows();
return 0;
}
对Mat进行遍历
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg",IMREAD_GRAYSCALE);
if (image.empty())
{
printf("no such picture");
return -1;
}
imshow("input", image);
int height = image.rows;
int width = image.cols;
int channels = image.channels();
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (channels == 3)
{
Vec3b pixel = image.at<Vec3b>(row, col);
int blue = pixel[0];
int green = pixel[1];
int red = pixel[2];
image.at<Vec3b>(row, col)[0] = 255 - blue;
image.at<Vec3b>(row, col)[1] = 255 - green;
image.at<Vec3b>(row, col)[2] = 255 - red;
}
else if (channels == 1)
{
int p = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - p;
}
}
}
imshow("output", image);
waitKey(0);
destroyAllWindows();
return 0;
}