目录
[1. Mat 存储图像](#1. Mat 存储图像)
[2. Mat 本质是什么?](#2. Mat 本质是什么?)
[3. 常见 Mat 类型](#3. 常见 Mat 类型)
[4. Mat 访问像素](#4. Mat 访问像素)
[5. Mat 的一个重要特点:浅拷贝](#5. Mat 的一个重要特点:浅拷贝)
| 概念 | 理解 |
|---|---|
| 像素 | 图片中的一个小点 |
| 灰度像素 | 一个数字 0~255 0 = 黑色 128 = 灰色 255 = 白色 |
| 彩色像素 | 三个数字 B,G,R |
| 0 | 最暗,没有光 |
| 255 | 最亮 |
| Mat | 存放这些像素的矩阵 |
在 OpenCV 里,Mat 是 矩阵(Matrix) 的意思,是 OpenCV 中最核心的数据结构之一,用来存储图像、矩阵数据、像素数据等。
在 C++ OpenCV 中,它对应:
cv::Mat
例如:
cpp
#include <opencv2/opencv.hpp>
cv::Mat img;
这里的 img 就是一个 Mat 对象,可以表示一张图片。
1. Mat 存储图像
比如读取图片:
cpp
cv::Mat img = cv::imread("test.jpg");
此时:
img.rows:图片高度(行数)img.cols:图片宽度(列数)img.channels():通道数
例如一张普通彩色图片:
cpp
1920 × 1080 × 3
表示:
- 1080 行
- 1920 列
- 3 个颜色通道(B、G、R)
2. Mat 本质是什么?
可以简单理解:
cpp
Mat
|
+-- 图像尺寸
|
+-- 数据类型
|
+-- 内存地址
|
+-- 像素数据
例如:
cpp
cv::Mat m(3, 3, CV_8UC1);
创建一个:3行 × 3列的单通道 8 位矩阵:
[0 0 0
0 0 0
0 0 0]
其中:
CV_8U:8位无符号整数C1:1个通道
3. 常见 Mat 类型
| 类型 | 含义 |
|---|---|
CV_8UC1 |
8位灰度图 |
CV_8UC3 |
8位彩色图(BGR) |
CV_8UC4 |
带透明通道图片 |
CV_32FC1 |
单通道浮点矩阵 |
CV_64FC3 |
三通道 double |
例如:
cpp
cv::Mat gray(480, 640, CV_8UC1);
灰度图:
cpp
640 × 480
每个像素:
cpp
0~255
4. Mat 访问像素
灰度图:
cpp
uchar value = img.at<uchar>(100, 200);
表示:
cpp
第100行,第200列
彩色图:
cpp
cv::Vec3b pixel = img.at<cv::Vec3b>(100,200);
得到:
cpp
[B, G, R]
5. Mat 的一个重要特点:浅拷贝
OpenCV 的 Mat 默认使用引用计数,复制不会立即复制数据:
cpp
cv::Mat a = cv::imread("test.jpg");
cv::Mat b = a;
此时:
cpp
a ----\
---> 同一块图像数据
b ----/
如果想真正复制:
cpp
cv::Mat c = a.clone();