850. Rectangle Area II

本文详细解析了如何通过扫描线算法解决矩形重叠面积计算问题。通过沿y轴扫描并使用合并区间的方法,有效地计算出由多个可能重叠的矩形组成的图形总面积。
  • 题目链接850. Rectangle Area II
  • 题目意思
    • 给出一些矩形,这些矩形可能会重叠,求矩形所围成图形的面积。
  • 题目解答
  • 步骤
    • 延y轴扫描
      • y = 0, 底 3 = 3 - 0, 高 y = 0,
      • y = 1, 底 2 = 2 - 0, 高 y = 1, 面积 前底 3 x (当前高1 - 前高0) = 3;
      • y = 2, 底 2 = 2 - 0, 高 y = 2, 面积 前底 2 x (当前高2 - 前高1) = 2;
    • 怎么算底呢?我们可以用合并区间的方式,如合并y=0时的各个底边(0,2), (1,2), (1,3),可以按照最前的元素排序区间,在合并这些区间。
   public int rectangleArea(int[][] rectangles) {
       int OPEN = 0, CLOSE = 1;
       int[][] events = new int[rectangles.length * 2][];
       int t = 0;
       for (int[] rect : rectangles) {
           events[t++] = new int[]{rect[1], OPEN, rect[0], rect[2]};
           events[t++] = new int[]{rect[3], CLOSE, rect[0], rect[2]};
       }
       Arrays.sort(events, (a,b)->Integer.compare(a[0], b[0]));
       List<int[]> active = new ArrayList<>();
       int cur_y = events[0][0];
       long res = 0;
       for (int[] event : events) {
           int y = event[0], type = event[1], x1 = event[2], x2 = event[3];
           long query = 0;
           int cur = -1;
           // 合并区间
           for (int[] act : active) {
               cur = Math.max(cur, act[0]);
               query += Math.max(act[1] - cur, 0);
               cur = Math.max(cur, act[1]);
           }
           res += query * (y - cur_y);
           if (type == OPEN) {
               active.add(new int[]{x1, x2});
               Collections.sort(active, (a, b) -> Integer.compare(a[0], b[0]));
           } else {
               for (int i = 0; i < active.size(); i++) {
                   if (active.get(i)[0] == x1 && active.get(i)[1] == x2) {
                       active.remove(i);
                       break;
                   }
               }
           }
           cur_y = y;
       }
       res %= 1_000_000_007;
       return (int)res;
   }
<think> 我们正在讨论dlib.rectangle。根据引用[2]和引用[4]中的代码示例,dlib.rectangle是dlib库中用于表示矩形区域的对象。它通常用于指定图像中目标的位置(如人脸检测框、跟踪目标初始框等)。 核心功能与特点: 1. 表示矩形区域:通过左上角和右下角坐标定义矩形 2. 坐标系统:采用图像处理常用的坐标系(左上角为原点(0,0),向右为x正方向,向下为y正方向) 3. 属性访问:提供left(), top(), right(), bottom()等方法获取边界坐标 4. 与OpenCV Rect兼容:可通过坐标转换与OpenCV的矩形表示互操作 使用方法: 1. 创建矩形对象: ```python import dlib # 方法1: 直接指定四个边界坐标 rect1 = dlib.rectangle(left, top, right, bottom) # 方法2: 从OpenCV的bbox转换 (x,y,w,h格式) x, y, w, h = cv2_rect # 假设cv2_rect来自cv2.boundingRect() rect2 = dlib.rectangle(int(x), int(y), int(x+w), int(y+h)) ``` 2. 访问矩形属性: ```python print(f"左上角: ({rect.left()}, {rect.top()})") print(f"右下角: ({rect.right()}, {rect.bottom()})") print(f"宽度: {rect.width()}, 高度: {rect.height()}") print(f"面积: {rect.area()}") ``` 3. 几何运算(部分支持): ```python # 矩形平移 moved_rect = dlib.move_rect(rect, x_offset, y_offset) # 矩形缩放 scaled_rect = dlib.resize_rect(rect, scale_factor) # 矩形交集 overlap = dlib.rectangle() if rect1.intersect(rect2, overlap): # 若存在交集 print(f"交集区域: {overlap}") ``` 4. 实际应用场景(结合引用[2][3][4]): - 人脸检测结果表示(引用[2]): ```python # 检测人脸 detector = dlib.get_frontal_face_detector() dets = detector(image, 1) # 返回dlib.rectangle列表 for rect in dets: # 绘制矩形框 cv2.rectangle(image, (rect.left(), rect.top()), (rect.right(), rect.bottom()), (0,255,0), 2) ``` - 目标跟踪初始化(引用[4]): ```python tracker = dlib.correlation_tracker() tracker.start_track(image, dlib.rectangle(startX, startY, endX, endY)) ``` - 人脸关键点检测(引用[3]): ```python predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") shape = predictor(image, rect) # 输入为dlib.rectangle对象 ``` 注意事项: 1. 坐标类型:所有坐标均为整数(int) 2. 坐标范围:right和bottom是开区间(即矩形不包含right列和bottom行的像素) $$ [left, right-1] \times [top, bottom-1] $$ 3. 与OpenCV Rect差异: | 属性 | dlib.rectangle | OpenCV Rect | |------------|-------------------|-------------------| | 表示方式 | (left,top,right,bottom) | (x,y,width,height) | | 右下角计算 | 直接存储 | x+width, y+height | | 包含关系 | 右下开区间 | 右下闭区间 | 转换工具函数: ```python # dlib.rectangle → OpenCV Rect (x,y,w,h) def dlib_rect_to_cv(rect): x = rect.left() y = rect.top() w = rect.width() h = rect.height() return (x, y, w, h) # OpenCV Rect → dlib.rectangle def cv_rect_to_dlib(x, y, w, h): return dlib.rectangle(x, y, x+w, y+h) ``` 总结: dlib.rectangle是dlib库中用于表示矩形区域的核心数据结构,具有以下优势: 1. **高效内存**:仅存储四个整数坐标 2. **计算优化**:内置快速几何运算方法 3. **API统一**:完美适配dlib的人脸检测、目标跟踪等模块 §§相关问题§§ 1. dlib.rectangle与OpenCV的Rect在使用上有哪些主要区别? 2. 如何用dlib.rectangle实现多个矩形区域的合并? 3. 在目标跟踪任务中,dlib.rectangle如何与correlation_tracker协同工作? </think> ### `dlib.rectangle` 使用指南及功能介绍 `dlib.rectangle` 是 dlib 库中用于**表示图像内矩形区域**的核心数据结构,广泛应用于目标检测、跟踪和关键点定位等计算机视觉任务。以下是详细解析: --- #### 一、核心功能与特点 1. **几何表示** - 通过**左上角**和**右下角**坐标定义矩形: $$ \text{rect} = \text{dlib.rectangle}(\mathtt{left}, \mathtt{top}, \mathtt{right}, \mathtt{bottom}) $$ - 坐标系原点为图像左上角($x$ 轴向右,$y$ 轴向下) 2. **边界访问方法** ```python rect = dlib.rectangle(100, 120, 300, 320) print(rect.left()) # 100 (左边界x坐标) print(rect.top()) # 120 (上边界y坐标) print(rect.right()) # 300 (右边界x坐标) print(rect.bottom()) # 320 (下边界y坐标) ``` 3. **几何属性计算** ```python width = rect.width() # 200 = right - left height = rect.height() # 200 = bottom - top area = rect.area() # 40000 = width * height ``` 4. **与OpenCV兼容** - 可与 `cv2.rectangle()` 无缝协作(见引用[2][3]): ```python cv2.rectangle(image, (rect.left(), rect.top()), (rect.right(), rect.bottom()), (0,255,0), 2) ``` --- #### 二、典型应用场景 1. **目标检测结果表示** dlib人脸检测器返回 `dlib.rectangle` 对象列表(引用[2]): ```python detector = dlib.get_frontal_face_detector() faces = detector(image_gray) # 返回dlib.rectangle列表 ``` 2. **目标跟踪初始化** `correlation_tracker` 通过矩形框初始化(引用[4]): ```python tracker = dlib.correlation_tracker() tracker.start_track(image, dlib.rectangle(100, 120, 300, 320)) ``` 3. **人脸关键点定位** `shape_predictor` 在矩形区域内预测关键点(引用[3]): ```python predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") shape = predictor(image, face_rect) # face_rect为dlib.rectangle ``` --- #### 三、创建与转换方法 | **创建方式** | **示例代码** | **说明** | |--------------|--------------|----------| | 直接构造 | `rect = dlib.rectangle(100, 120, 300, 320)` | 指定四个边界值 | | 从OpenCV格式转换 | `rect = dlib.rectangle(x, y, x+w, y+h)` | OpenCV的 `(x,y,w,h)` → `dlib.rectangle` | | 从边界列表转换 | `rect = dlib.rectangle(*[100, 120, 300, 320])` | 解包列表参数 | --- #### 四、几何操作函数 ```python # 移动矩形位置 new_rect = dlib.move_rect(rect, x_offset=10, y_offset=-5) # 缩放矩形尺寸 scaled_rect = dlib.resize_rect(rect, scale_factor=1.2) # 计算两矩形交集 overlap = rect1.intersect(rect2) # 检查点是否在矩形内 contains_point = rect.contains(dlib.point(150, 200)) ``` --- #### 五、最佳实践 1. **坐标边界校验** 避免坐标越界: ```python rect = dlib.rectangle( max(0, left), max(0, top), min(image_width, right), min(image_height, bottom) ) ``` 2. **与深度学习框架交互** 转换为PASCAL VOC格式(左上x, 左上y, 右下x, 右下y): ```python voc_box = [rect.left(), rect.top(), rect.right(), rect.bottom()] ``` 3. **多目标处理** 合并重叠矩形(如NMS后处理): ```python merged_rect = dlib.rectangle() dlib.find_candidate_object_locations(image, merged_rect, min_size=50) ``` --- ### 总结 `dlib.rectangle` 的核心价值在于: 1. **轻量高效**:仅存储4个整数坐标,计算开销低 2. **接口统一**:完美适配 dlib 的检测、跟踪、关键点模块 3. **跨库兼容**:与 OpenCV/Numpy/PyTorch 等生态无缝协作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值