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::Pointcv::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::Pointcv::Size 用于表示坐标和尺寸。

cv::Scalar 用于表示颜色(如 BGR)。

cv::Rect 用于表示矩形,常用于图像裁剪。

cv::Veccv::Matx 用于表示固定大小的向量和矩阵。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐