C++ OpenCV #004 Mat的创建
Mat类似Python中的矩阵,常用来储存图像的通道数据
1. Mat 介绍
-
Mat 由两部分组成:
矩阵头: 包含矩阵尺寸、存储方法等
uchar* data: 指向存储数据的矩阵指针
2. Mat 的创建
#include<opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<string>
using namespace std;
using namespace cv;
void close_log() {
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
}
// Mat的创建
void mat_creat() {
Mat m1; // 无初始化矩阵
Mat m2(100, 100, CV_8UC3, Scalar(0,0,255)); // 创建 100行100列,8位无符号字符型数据的三通道矩阵,颜色为(0,0,255)
// 同:Mat m2(Size(100, 100), CV_8UC3, Scalar(0, 0, 255));
Mat m3(100, 100, CV_8UC3); // 先创建矩阵,后指定通道的数值
m3 = Scalar(255, 0, 0);
Mat m4(m3); // m4共享m3矩阵对象(深拷贝)
Mat m5 = Mat::zeros(100, 100, CV_8UC3); // 初始化全 0 矩阵,8位无符号字符型数据的三通道矩阵
Mat m6 = Mat::zeros(m2.size(), m2.type()); // 初始化与m2相同大小,相同数据类型的矩阵,常用于初始化矩阵
waitKey(0);
destroyAllWindows();
}
int main() {
close_log();
mat_creat();
return 0;
}
3. Mat 的拷贝函数
-
浅拷贝:把数据复制出一份新的,储存在新的内存地址,与原数据互不干涉。
-
深拷贝:把数据复制出一份新的,与原数据共用内存地址,原数据改变,也发生改变。
#include<opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<string>
using namespace std;
using namespace cv;
void close_log() {
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
}
// mat 的浅拷贝和深拷贝
void mat_copy() {
Mat imga, imgb, imgc, imgd, imge;
imga = Mat::zeros(Size(100, 200), CV_8UC3);
// 浅拷贝,imgb, imgc的值等于 imga
imgb = imga.clone();
imgc.copyTo(imga);
// 深拷贝,改变imgd, imge的值,imga也会改变
imgd = imga;
imge(imga);
}
int main() {
close_log();
mat_copy();
return 0;
}
本文来自博客园,作者:{枫_Null},转载请注明原文链接:https://www.cnblogs.com/fengNull/articles/16671129.html

浙公网安备 33010602011771号