OpenCV学习笔记1 基础类型:Mat、Point、Size、Scalar、Rect、Matx、Vec
介绍了opencv的基石——基本类型:cv::Mat:核心类,存储图像数据。可以表示二维矩阵,支持多通道图像(如 RGB)。cv::Point:表示二维坐标,常用于表示图像中的点位置,如矩形的顶点。cv::Scalar:表示四元组,通常用于表示颜色(如 BGR)或单一数值。cv::Rect:表示矩形区域,常用于图像裁剪或定义感兴趣区域(ROI)。cv::Matx:固定大小矩阵,适合进行小规模线性代
OpenCV 基础类型 (C++)版
常用类型
cv::Mat //矩阵,存像素点数据
cv::Point //点,2D坐标
cv::Size //大小,宽高
cv::Scalar //四元组,颜色或值
cv::Rect //矩形区域
cv::Matx //固定大小的矩阵(不动态分配内存)
cv::Vec //固定大小向量
1. cv::Mat(矩阵)
1.1 基本概念
cv::Mat是 OpenCV 中最核心的类,用于存储图像数据,表示一个矩阵(Matrix),每个图像都可以用cv::Mat来表示。- 它不仅仅是一个二维矩阵,还支持多维矩阵,用于处理多通道图像(例如 RGB 图像、RGBA 图像等)
1.2 cv::Mat类的基本结构
- 重要参数:
rows:图像的行数(高度)
cols:图像的列数(宽度)
channels():图像的通道数(1 通道灰度图,3 通道彩色图)
depth():图像的数据类型(如 CV_8U,CV_32F)
U是unsigned无符号类型,表示在内存中一个像素点占的字节数,C是channels,表示图像通道数。
CV_8UC1:单通道 8 位无符号整数(灰度图像)
CV_8UC3:三通道 8 位无符号整数(RGB 图像)
CV_32FC1:单通道 32 位浮动点数(单通道浮点图像)
类型转化://转灰度图 cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); // 将 BGR 转换为灰度 cv::cvtColor(img, img_rgb, cv::COLOR_BGR2RGB);//BGR转RGB cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);//从 BGR 到灰度 cv::cvtColor(img, img_hsv, cv::COLOR_BGR2HSV);//从 BGR 到 HSV cv::cvtColor(img_hsv, img_bgr, cv::COLOR_HSV2BGR);//从 HSV 到 BGR在MATLAB和 Matplotlib中,图像的默认空间为RGB,而opencv读取的默认空间为BGR,因此在Python中使用时需要进行类型转化
# 读取图像 img = cv2.imread('image.jpg') # OpenCV 默认使用 BGR,需要将其转换为 RGB img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
1.3 常用用法
1.3.1 创建Mat
- 空矩阵
cv::Mat m; // 创建一个空的 Mat 对象
- 指定大小的矩阵
cv::Mat m(3, 3, CV_8UC3); // 创建一个 3x3 大小的 3 通道 (RGB) 图像,元素类型为 8 位无符号整数
- 从已有数据创建 Mat
unsigned char data[3] = {100, 150, 200}; // 假设是一个 1x3 的灰度图
cv::Mat m(1, 3, CV_8UC1, data); // 创建 1 行 3 列的灰度图像
- 使用图像文件创建 Mat(读取文件)
cv::Mat img = cv::imread("image.jpg"); // 读取图像文件到 Mat 中
1.3.2 像素操作
- 获取单个像素值
cv::Mat img = cv::imread("image.jpg");
cv::Vec3b color = img.at<cv::Vec3b>(10, 10); // 获取 (10, 10) 位置的像素,CV_8UC3 类型,3 通道颜色
int blue = color[0]; // 获取蓝色通道值
int green = color[1]; // 获取绿色通道值
int red = color[2]; // 获取红色通道值
- 修改像素值
img.at<cv::Vec3b>(10, 10) = cv::Vec3b(255, 0, 0); // 设置 (10, 10) 位置的像素为蓝色(BGR)
1.3.3 矩阵操作
- 获取图像尺寸(行列)
int rows = img.rows; // 获取图像的行数(高度)
int cols = img.cols; // 获取图像的列数(宽度)
- 获取图像通道数
int channels = img.channels(); // 获取图像的通道数,RGB 图像返回 3
- 矩阵重置(清空数据)
img.release(); // 释放内存
- 矩阵复制
cv::Mat img2 = img.clone(); // 深拷贝 img 到 img2
-矩阵切片(裁剪图像区域)
cv::Mat roi = img(cv::Rect(50, 50, 200, 200)); // 获取图像中指定区域
2. cv::Point(点)
2.1 基本概念
cv::Point 是 OpenCV 中用于表示 二维坐标 的类。
它常用于图像处理中的 位置表示,例如:矩形区域的左上角或右下角、图像中感兴趣区域(ROI)的坐标等。
2.2 cv::Point 的基本结构
cv::Point 有两个常用的构造方法:
cv::Point(int x, int y)//构造一个指定坐标的点。
cv::Point() //默认构造函数,创建一个 (0, 0) 的点。
2.3 常用用法
2.3.1 基本用法
获取 cv::Point p1 的坐标
int x = p1.x; // 获取 x 坐标
int y = p1.y; // 获取 y 坐标
修改坐标
p1.x = 50; // 修改 x 坐标为 50
p1.y = 60; // 修改 y 坐标为 60
cv::Point 可以用于表示矩形的左上角或右下角:
cv::Rect rect(cv::Point(10, 20), cv::Size(100, 50)); // 创建矩形,左上角为 (10, 20),宽为 100,高为 50
2.3.2 点的算术运算
cv::Point 支持 加法、减法 和 乘法 等常见运算。
cv::Point p1(10, 20);
cv::Point p2(30, 40);
// 点的加法
cv::Point p3 = p1 + p2; // p3 = (40, 60)
// 点的减法
cv::Point p4 = p2 - p1; // p4 = (20, 20)
// 点与标量的乘法
cv::Point p5 = p1 * 2; // p5 = (20, 40)
常见应用
- 经常用于图像中的感兴趣区域(ROI)、矩形框、圆形中心等操作中。
- 在绘制图形时,常常需要指定一些点的坐标:
cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3); // 创建一个黑色图像
cv::Point p1(100, 100), p2(400, 400);
// 在图像上绘制直线
cv::line(img, p1, p2, cv::Scalar(0, 255, 0), 2, cv::LINE_8);
cv::imshow("Line", img);
cv::waitKey(0);
- 在图像上绘制圆形使用
cv::Point来表示圆心坐标:
cv::Point center(250, 250);
int radius = 100;
cv::circle(img, center, radius, cv::Scalar(0, 0, 255), 3);
定义多边形cv::Point 可用于定义多边形的顶点:
std::vector<cv::Point> points = {cv::Point(100, 100), cv::Point(200, 100), cv::Point(150, 200)};
cv::polylines(img, points, true, cv::Scalar(255, 0, 0), 2);
cv::Point和cv::Size的组合使用
cv::Size 常用来表示图像尺寸(宽度和高度),而 cv::Point 可以用于表示位置。它们在一起常用于定义图像的区域。
cv::Point pt1(50, 50);
cv::Size size(200, 150);
cv::Rect rect(pt1, size); // 创建矩形,从 (50, 50) 开始,宽 200,高 150
3. cv::Scalar(四元组,颜色或值)
3.1 基本概念
cv::Scalar 是一个 四元组 类型,分别表示 BGR 图像的 蓝色、绿色、红色 和 透明度(alpha 通道,默认情况下不使用)。
cv::Scalar 中的元素可以表示颜色通道的值或任意float类型的数值。
3.2 常见用法
- 表示颜色(BGR 通道):
cv::Scalar blue(255, 0, 0); // 蓝色
cv::Scalar red(0, 0, 255); // 红色
cv::Scalar green(0, 255, 0); // 绿色
- 灰度图像(单通道):
cv::Scalar gray(128); // 灰度值 128
- 在图像上绘制颜色:
cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3); // 创建一个空白图像
cv::circle(img, cv::Point(250, 250), 100, cv::Scalar(255, 0, 0), -1); // 绘制蓝色圆形
4. cv::Rect(矩形区域)
4.1 基本概念
cv::Rect 用于表示 矩形区域,常用于图像处理中的 裁剪、感兴趣区域(ROI) 的定义。
cv::Rect 通过左上角点的坐标 (x, y) 和矩形的 宽度(width)、高度(height) 来表示矩形。
4.2 常见用法
- 创建矩形区域:
cv::Rect rect(50, 50, 200, 100); // (x, y) 为左上角,宽 200,高 100
- 获取矩形区域的坐标
//左上角坐标:
cv::Point tl = rect.tl();
//右下角坐标:
cv::Point br = rect.br();
- 裁剪图像区域
cv::Mat roi = img(rect); // 从图像 img 中提取矩形区域
5. cv::Matx(固定大小的矩阵)
5.1 基本概念
cv::Matx 是一个 固定大小 的矩阵类。它适用于需要小矩阵(如 2x2、3x3 或 4x4 矩阵)并且矩阵的大小是已知且固定的情况。
cv::Matx 是一种轻量级的矩阵类,不会动态分配内存,因此适用于计算密集型的操作。
5.2 常见用法
- 创建 3x3 矩阵:
cv::Matx33f M(1.0f, 0.0f, 0.0f, // 创建一个 3x3 单精度浮点矩阵
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f);
- 矩阵元素访问:
float value = M(1, 1); // 获取第 2 行第 2 列的值(从 0 开始)
- 矩阵乘法:
cv::Matx33f M1(1, 2, 3, 4, 5, 6, 7, 8, 9);
cv::Matx33f M2(9, 8, 7, 6, 5, 4, 3, 2, 1);
cv::Matx33f result = M1 * M2; // 矩阵相乘
6. cv::Vec(固定大小向量)
6.1 基本概念
cv::Vec 用于表示 固定大小的向量。cv::Vec 常用于表示颜色通道或向量数据,如 RGB 颜色通道。
cv::Vec 是模板类,支持不同数据类型和不同大小(如 2D 向量、3D 向量等)。
6.2 常见用法
- 创建 3D 向量:
cv::Vec3b color(255, 0, 0); // 创建一个 BGR 蓝色通道(蓝色)
- 访问和修改向量的元素:
int blue = color[0]; // 获取蓝色通道值
int green = color[1]; // 获取绿色通道值
int red = color[2]; // 获取红色通道值
color[0] = 100; // 修改蓝色通道的值为 100
- 使用 cv::Vec 表示 2D 向量:
cv::Vec2f vector(1.5, 2.5); // 创建 2D 浮点向量
总结
cv::Mat 用于存储图像数据,几乎所有的图像操作都涉及到它。
cv::Point 和 cv::Size 用于表示坐标和尺寸。
cv::Scalar 用于表示颜色(如 BGR)。
cv::Rect 用于表示矩形,常用于图像裁剪。
cv::Vec 和 cv::Matx 用于表示固定大小的向量和矩阵。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)