在 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的值也跟着改变