OpenCV(cv::Point、cv::Rect、cv::Mat)



在OpenCV中,cv::Pointcv::Rectcv::Mat 是三个常用的类,分别用于表示点、矩形和图像/矩阵数据。

1. cv::Point

cv::Point 类用于表示二维空间中的一个点,有两个常用的类型:

  • cv::Point: 用于存储整型的点坐标 (x, y)
  • cv::Point_<T>: 模板类,允许使用其他数据类型(如 floatdouble)。

1.1 主要属性:

  • x: 点的 x 坐标。
  • y: 点的 y 坐标。

1.2 示例:

cv::Point p1(10, 20);  // 创建一个点 (10, 20)
cv::Point2f p2(10.5f, 20.5f);  // 创建一个浮点类型的点

1.3 用途:

cv::Point 常用于表示图像中的坐标位置,如像素位置、直线的端点、形状的顶点等。



2. cv::Rect

cv::Rect 类用于表示矩形,通过其左上角的点和尺寸来定义矩形。常用于表示图像中的一个区域(ROI, Region of Interest)。

2.1 主要属性:

  • x: 矩形左上角的 x 坐标。
  • y: 矩形左上角的 y 坐标。
  • width: 矩形的宽度。
  • height: 矩形的高度。

2.2 主要方法:

  • contains(const cv::Point& pt): 判断点是否在矩形内部。
  • area(): 计算矩形的面积。
  • tl(): 返回矩形的左上角坐标。
  • br(): 返回矩形的右下角坐标。

2.3 示例:

cv::Rect r1(10, 10, 50, 50);  // 创建一个矩形,左上角为 (10, 10),宽度为 50,高度为 50
cv::Point p(15, 15);
if (r1.contains(p)) {
    std::cout << "Point is inside the rectangle!" << std::endl;
}

2.4 用途:

  • 在图像处理中用于定义感兴趣区域(ROI),比如裁剪图像、绘制矩形、检测到的物体边界框等。


3. cv::Mat

cv::Mat 类是 OpenCV 中最基础和核心的数据结构之一,用于存储图像和矩阵数据。它可以存储不同类型的数据(如 8 位无符号整型、浮点型等)和多维数组(如灰度图、彩色图、三维数据等)。

3.1 主要属性:

  • rows: 矩阵的行数(图像的高度)。
  • cols: 矩阵的列数(图像的宽度)。
  • data: 指向矩阵数据的指针。
  • type(): 返回矩阵元素的数据类型(如 CV_8UC1, CV_32FC3 等)。

3.2 主要方法:

  • at<T>(int y, int x): 访问矩阵中 (x, y) 位置的元素。
  • clone(): 深拷贝矩阵。
  • copyTo(): 将当前矩阵的内容拷贝到另一个矩阵。
  • zeros(), ones(): 创建全零矩阵或全一矩阵。
  • reshape(): 改变矩阵的维度。
  • convertTo(): 转换矩阵的数据类型。

3.3 示例:

cv::Mat img = cv::imread("image.jpg");  // 读取图像文件
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);  // 转换为灰度图像
int pixelValue = gray.at<uchar>(10, 10);  // 访问 (10, 10) 处的像素值

3.4 用途:

  • cv::Mat 是所有图像处理操作的基础,可以用于存储图像、视频帧、点云、核矩阵等各种数据。
  • 它支持各种类型的数据操作,如像素级别的操作、过滤、变换、特征提取等。


4. 总结

  • cv::Point: 表示二维空间中的点,用于表示像素位置、形状顶点等。
  • cv::Rect: 表示矩形区域,通常用于定义图像中的兴趣区域或检测到的物体边界。
  • cv::Mat: OpenCV 中最核心的数据结构,用于存储图像、矩阵、视频帧等多维数组数据。

它们共同构成了 OpenCV 中大部分图像处理任务的基础,彼此之间可以协同工作。例如,使用 cv::Rect 定义的 ROI 可以用来从 cv::Mat 图像中裁剪子区域,cv::Point 可以指定 ROI 的顶点位置等。



posted @ 2024-08-28 13:43  做梦当财神  阅读(252)  评论(0编辑  收藏  举报