在 C++ 中,OpenCV 提供了一个强大的类 Mat 来表示图像和多维矩阵。Mat 类是 OpenCV 中最基础和最常用的类,用于存储和操作图像数据。
文章目录
- Mat类简介
- Mat 类的定义
- Mat 类的构造函数
- 代码示例
- 深拷贝示例
- 赋值示例
- 浅拷贝示例
Mat类简介
Mat 类是一个多维的、通用的、压缩的数组容器,主要用于表示图像、点集、特征向量、矩阵等数据。Mat 的底层数据存储采用连续内存块,可以高效地进行矩阵操作和图像处理。
Mat 类的定义
class CV_EXPORTS Mat {
public:
// 默认构造函数
Mat();
// 构造函数
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);
// 拷贝构造函数
Mat(const Mat& m);
// 赋值操作符
Mat& operator = (const Mat& m);
// 其他成员函数...
// 数据访问
uchar* data;
int rows, cols;
// 其他成员变量...
};
Mat 类的构造函数
默认构造函数
Mat();
创建一个空的 Mat 对象。
指定尺寸和类型的构造函数
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);
创建一个指定尺寸和类型的 Mat 对象。type 参数指定了矩阵元素的类型,例如 CV_8UC1 表示单通道 8 位无符号整型,CV_8UC3 表示三通道 8 位无符号整型。
拷贝构造函数
cpp
复制代码
Mat(const Mat& m);
创建一个 Mat 对象,并复制另一个 Mat 对象的数据。
代码示例
深拷贝示例
Mat dst1,dst2;
dst1 = image.clone();
image.copyTo(dst2);
此时dst1,dst2 都是拷贝了image指向的数据。image的数据改变,dst1,dst2都不会随之改变
赋值示例
// 创建空白图像 创建一个8*8的全为0的矩阵, 矩阵的宽度 等于 8*通道数 ,这里的通道数为1 ,一般代表为灰度图
Mat dst3 = Mat::zeros(Size(8,8),CV_8UC(1));
// cout<<dst3<<endl;
cout<<"dst width :"<<dst3.cols<<" dst height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;
// 创建空白图像 创建一个4*4的全为1的矩阵, 矩阵的宽度 等于 4 *通道数 ,这里的通道数为3,一般代表为彩色图
Mat dst4 = Mat::ones(Size(4,4),CV_8UC(3));
// ones 用的时候要小心, 他不会把全部数据初始化为1,只会把第一个通道的函数初始化为1,其余通道为0
cout<<dst4<<endl;
cout<<"dst4 width :"<<dst4.cols<<" dst4 height :"<<dst4.rows<<" dst4 channel :"<<dst4.channels()<<endl;
dst3= 15; //也可以直接赋值 ,这样会直接给第一个通道值全赋值为15
cout<<dst3<<endl;
cout<<"dst3 width :"<<dst3.cols<<" dst3 height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;
CV_8UC1 详解
- CV: OpenCV 定义的前缀,表示这是一个 OpenCV 的类型。
- 8U: 表示每个元素是 8 位无符号整型(8-bit Unsigned)。
- C1: 表示图像有一个通道(1 Channel)。
因此,CV_8UC1 表示一个具有单通道的 8 位无符号整型图像。每个像素点用一个 8 位的值表示,范围是 0 到 255,通常用于表示灰度图像。同理CV_8UC3 表示一个具有三个通道的 8 位无符号整型图像。每个像素点由三个 8 位值组成,通常用于表示彩色图像。C3代表三个通道。
Mat重载了输出,因此可以直接打印

//创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
//使用Scalar可以创建多维通道
dst5 = Scalar(255,0,0);
Scalar函数详解
在 OpenCV 中,Scalar 是一个常用的数据结构,用于表示一个包含四个元素的向量,通常用于定义颜色和其他多通道数据。Scalar 函数主要用于图像处理和计算机视觉中的各种操作,例如设置绘图颜色、定义阈值范围等。
- 基本概念
Scalar 是一个包含四个元素的向量,通常用于表示颜色(BGR 或者 BGRA)或者其他多通道数据。在 OpenCV 中,Scalar 的定义如下:
Scalar(double v0, double v1=0, double v2=0, double v3=0)
- 构造函数参数
v0:第一个元素的值(例如蓝色通道的值)。v1:第二个元素的值(例如绿色通道的值,默认值为 0)。v2:第三个元素的值(例如红色通道的值,默认值为 0)。v3:第四个元素的值(例如 Alpha 通道的值,默认值为 0)。
- 常用方法
Scalar():默认构造函数,初始化所有元素为 0。Scalar(double v0, double v1, double v2, double v3):初始化四个元素的构造函数。val[i]:访问第i个元素的值(i的范围是 0 到 3)。
- 常用场景
- 定义颜色:在绘图函数中使用,例如
cv2.line()、cv2.rectangle()、cv2.circle()等。 - 阈值处理:用于定义阈值范围,例如
cv2.inRange()。 - 图像初始化:用于初始化图像中的所有像素值。
例如 dst5 = Scalar(255,0,0); 因为OpenCV默认为BGR 蓝色优先,显示这个图像的话,就会是纯蓝色

浅拷贝示例
//创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
//使用Scalar可以创建多维通道
dst5 = Scalar(255,0,0);
show_image(dst5);
// 浅拷贝示例, dst6 会随着 dst5 变化而变化
Mat dst6 =dst5;
dst5 = Scalar(255,255,0);
imshow("dst5",dst5);
imshow("dst6",dst6);
waitKey(0);
此时,dst5 和dst6都是指向了相同的内存区域,因此,dst6也会随着dst5变化而变化。如下图所示,dst5的值改变了,dst6的值也跟着改变











![[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fwww.hao123rr.com%2Fzb_users%2Fcache%2Fly_autoimg%2Fn%2FNzc1MzA.jpg&pos_id=f8V9JvdT)








