> 技术文档 > 【OpenCV 】Rect 类详解_cv::rect

【OpenCV 】Rect 类详解_cv::rect

cv::Rect 是 OpenCV 中表示 ​矩形区域​ 的核心数据结构,广泛用于图像处理中的 ​区域截取(ROI)​目标检测框几何运算​ 等场景。以下是其详细说明及使用示例:


1. Rect 类的核心定义

成员变量
变量 说明 类型 x 矩形左上角的 x 坐标(列索引) int y 矩形左上角的 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 * heightrect.empty() 判断矩形是否为空(width <= 0 或 height <= 0 返回 truerect.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 计算两个矩形的交集(若不相交,返回空矩形) `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. 注意事项

  1. 坐标系统​:图像坐标系原点 (0,0) 在左上角,x 向右增加,y 向下增加。
  2. 有效性检查​:确保 width 和 height 非负,否则矩形无效。
  3. 边界溢出​:当矩形超出图像范围时,截取 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 和图像处理函数,可高效实现图像分析任务。注意始终验证矩形有效性以避免越界错误。