0%

Rect

cv::Rect 类 详解

cv::Rect 是 OpenCV 中的一个类,表示一个矩形区域。它常用于图像处理中的矩形区域定义,尤其是在图像裁剪、目标检测、区域分析等任务中。cv::Rect 类非常简洁和高效,提供了多种构造方法和常用操作,使得矩形区域的处理变得简单方便。


cv::Rect 类定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class cv::Rect
{
public:
// 4个构造函数
Rect(); // 默认构造函数
Rect(int _x, int _y, int _width, int _height); // 使用坐标和宽高构造矩形
Rect(const Point& pt1, const Point& pt2); // 使用对角线两个点构造矩形
Rect(const Rect& r); // 拷贝构造函数

// 成员变量
int x; // 矩形左上角的 x 坐标
int y; // 矩形左上角的 y 坐标
int width; // 矩形的宽度
int height;// 矩形的高度
};

参数详解

  1. **x**:

    • 矩形左上角的 x 坐标。
  2. **y**:

    • 矩形左上角的 y 坐标。
  3. **width**:

    • 矩形的宽度,表示矩形水平方向的长度。
  4. **height**:

    • 矩形的高度,表示矩形垂直方向的长度。

构造方法

  1. 默认构造函数

    1
    Rect();  // 默认值 x=0, y=0, width=0, height=0
    • 创建一个默认的矩形,通常是 (0, 0) 为左上角,宽度和高度都为 0。
  2. 指定坐标和宽高构造矩形

    1
    Rect(int _x, int _y, int _width, int _height);
    • 通过指定矩形的左上角 (x, y) 和矩形的 width(宽度)和 height(高度)来构造矩形。
  3. 通过对角线两个点构造矩形

    1
    Rect(const Point& pt1, const Point& pt2);
    • 使用两个对角点 pt1pt2 来创建矩形,pt1pt2 表示矩形的对角线的两个点。
  4. 拷贝构造函数

    1
    Rect(const Rect& r);
    • 通过另一个矩形对象来拷贝构造一个新的矩形。

成员函数

  1. **area()**:

    • 返回矩形的面积(即 width * height)。
    1
    int area() const;
  2. **empty()**:

    • 检查矩形是否为空(即宽度或高度为 0)。
    1
    bool empty() const;
  3. **br()**:

    • 返回矩形的右下角点。
    1
    Point br() const;  // 返回 (x + width, y + height)
  4. **tl()**:

    • 返回矩形的左上角点。
    1
    Point tl() const;  // 返回 (x, y)

常用操作

  1. 矩形相加

    • 两个矩形相加,得到一个包含两个矩形的最小外接矩形。
    1
    2
    3
    Rect r1(0, 0, 10, 10);
    Rect r2(5, 5, 10, 10);
    Rect r3 = r1 | r2; // 得到一个包含两个矩形的外接矩形
  2. 矩形相交

    • 得到两个矩形的交集部分,返回一个新的矩形。
    1
    2
    3
    Rect r1(0, 0, 10, 10);
    Rect r2(5, 5, 10, 10);
    Rect r3 = r1 & r2; // 得到两个矩形的交集
  3. 矩形移动

    • 移动矩形的位置。
    1
    2
    3
    Rect r(10, 20, 30, 40);
    r.x += 5; // 修改 x 坐标
    r.y += 5; // 修改 y 坐标
  4. 矩形包含检测

    • 判断一个点是否在矩形内,或者一个矩形是否包含另一个矩形。
    1
    2
    3
    4
    5
    6
    7
    Rect r(10, 10, 50, 50);
    Point pt(30, 30);
    bool inside = r.contains(pt); // 判断点 (30, 30) 是否在矩形内

    Rect r1(10, 10, 50, 50);
    Rect r2(20, 20, 10, 10);
    bool contained = r1.contains(r2); // 判断 r2 是否完全包含在 r1 中

常见应用场景

  1. 图像裁剪

    • 在图像处理任务中,cv::Rect 用于指定感兴趣区域(ROI)。通过矩形定义裁剪区域,可以快速地对图像进行裁剪。
    1
    2
    3
    Mat img = imread("image.jpg");
    Rect roi(100, 100, 200, 200); // 定义感兴趣区域
    Mat cropped = img(roi); // 裁剪图像
  2. 目标检测

    • 在目标检测任务中,通常使用矩形框来表示检测到的目标。例如,检测到的人脸、车辆或其他物体通常会使用矩形框进行标记。
  3. 图像窗口和标注

    • cv::Rect 用于表示图像中的标注区域或绘制图像的窗口。在 OpenCV 中经常会使用矩形框来标记特定区域,如绘制矩形框标记目标。
  4. 区域分析

    • 在图像分析中,cv::Rect 常用于表示分析的区域,尤其是在分割、提取特征等任务中。

示例代码

创建矩形并输出其属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main() {
// 创建矩形
Rect r1(10, 20, 30, 40);
cout << "Rect 1: (" << r1.x << ", " << r1.y << ", " << r1.width << ", " << r1.height << ")" << endl;

// 计算矩形面积
cout << "Area: " << r1.area() << endl;

// 判断矩形是否为空
if (r1.empty()) {
cout << "Rect is empty" << endl;
} else {
cout << "Rect is not empty" << endl;
}

// 获取矩形的右下角
Point br = r1.br();
cout << "Bottom-right corner: (" << br.x << ", " << br.y << ")" << endl;

return 0;
}

输出

1
2
3
4
Rect 1: (10, 20, 30, 40)
Area: 1200
Rect is not empty
Bottom-right corner: (40, 60)

总结

  • cv::Rect 是一个简单而强大的类,用于表示矩形区域,在图像处理、目标检测、图像裁剪、区域分析等多种应用中都有广泛的用途。
  • 它提供了多种构造方法、成员函数和常用操作,使得矩形的使用非常方便。
  • cv::Rect 主要用于图像处理中的区域定义、裁剪、目标检测、区域计算等任务,是 OpenCV 中不可或缺的重要类。
感谢老板支持!敬礼(^^ゞ