OpenCV(cv::Point、cv::Rect、cv::Mat)
目录
在OpenCV中,cv::Point
、cv::Rect
和 cv::Mat
是三个常用的类,分别用于表示点、矩形和图像/矩阵数据。
1. cv::Point
cv::Point
类用于表示二维空间中的一个点,有两个常用的类型:
cv::Point
: 用于存储整型的点坐标(x, y)
。cv::Point_<T>
: 模板类,允许使用其他数据类型(如float
或double
)。
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 的顶点位置等。