【OpenCV 】Rect 类详解_cv::rect
cv::Rect
是 OpenCV 中表示 矩形区域 的核心数据结构,广泛用于图像处理中的 区域截取(ROI)、目标检测框、几何运算 等场景。以下是其详细说明及使用示例:
1. Rect 类的核心定义
成员变量
x
int
y
int
width
int
height
int
构造函数
// 默认构造(空矩形,x=0, y=0, width=0, height=0)cv::Rect rect;// 通过坐标和尺寸构造cv::Rect rect(x, y, width, height);// 通过两个对角点构造(左上角点和右下角点)cv::Point pt1(x1, y1);cv::Point pt2(x2, y2);cv::Rect rect(pt1, pt2);// 通过左上角点和尺寸构造cv::Point pt(x, y);cv::Size size(width, height);cv::Rect rect(pt, size);
2. 常用成员函数与属性
(1) 基础属性
rect.area()
width * height
)rect.empty()
width <= 0
或 height <= 0
返回 true
)rect.tl()
cv::Point(x, y)
)rect.br()
cv::Point(x + width, y + height)
)rect.size()
cv::Size(width, height)
)(2) 包含与相交判断
rect.contains(Point pt)
pt
是否在矩形内rect & other_rect
3. 常见操作示例
(1) 截取图像 ROI 区域
cv::Mat image = cv::imread(\"image.jpg\");cv::Rect roi_rect(100, 50, 200, 150); // x=100, y=50, width=200, height=150cv::Mat roi = image(roi_rect); // 提取 ROI(浅拷贝,共享数据)cv::imshow(\"ROI\", roi);
(2) 绘制矩形框
cv::Rect bbox(100, 50, 200, 150);cv::rectangle(image, bbox, cv::Scalar(0, 255, 0), 2); // 绘制绿色矩形框
(3) 计算两个矩形的交集
cv::Rect rect1(100, 100, 200, 200);cv::Rect rect2(150, 150, 200, 200);cv::Rect intersection = rect1 & rect2; // 交集区域if (!intersection.empty()) { // 存在重叠区域}
(4) 扩展或移动矩形
cv::Rect rect(100, 100, 200, 200);rect += cv::Point(50, 0); // 向右移动 50 像素(修改 x)rect += cv::Size(50, 50); // 宽度增加 50,高度增加 50
4. 注意事项
- 坐标系统:图像坐标系原点
(0,0)
在左上角,x 向右增加,y 向下增加。 - 有效性检查:确保
width
和height
非负,否则矩形无效。 - 边界溢出:当矩形超出图像范围时,截取 ROI 可能引发错误,需提前检查:
cv::Rect rect(-10, -10, 300, 300); rect = rect & cv::Rect(0, 0, image.cols, image.rows); // 限制在图像范围内
5. 扩展应用
(1) 批量处理多个矩形区域
std::vector boxes = detect_objects(image); // 目标检测返回的矩形框for (const auto& box : boxes) { cv::rectangle(image, box, cv::Scalar(0, 255, 0), 2);}
(2) 计算多个矩形的最小包围矩形
cv::Rect rect1(100, 100, 50, 50);cv::Rect rect2(200, 200, 50, 50);cv::Rect merged_rect = rect1 | rect2; // 最小包围矩形 (100,100) 到 (250,250)
(3) 矩形区域像素统计
cv::Mat roi = image(cv::Rect(100, 100, 200, 200));cv::Scalar mean_val = cv::mean(roi); // 计算 ROI 的像素均值
总结
cv::Rect
是 OpenCV 中处理矩形区域的核心工具,核心功能包括:
- ROI 截取:快速提取图像局部区域。
- 几何运算:交集、并集、移动、缩放。
- 目标定位:表示检测框或兴趣区域。
结合 cv::Mat
和图像处理函数,可高效实现图像分析任务。注意始终验证矩形有效性以避免越界错误。