[CV] Rotated IoU 计算旋转矩形之间的重叠面积

本文介绍了在计算机视觉中计算旋转矩形之间的重叠面积,即旋转IoU。通过解析SECOND目标检测论文的源码,文章详细探讨了旋转包围盒的编码方式,包括中心点和顶点编码,并提供了数学公式和代码实现。此外,还讨论了相交区域的判断、顶点排序和三角剖分等关键步骤,以帮助理解旋转矩形的相交面积计算。
摘要由CSDN通过智能技术生成

[CV] Rotated IoU 计算旋转矩形之间的重叠面积

简介

在目标检测的领域,基于Anchor的方法需要对Anchor分配正负样本的标签。通常,对于axis-aligned的anchor和ground truth,可以直接通过 [top left right down]四个值计算他们之间的重叠面积。但是针对于旋转的矩形框,这个问题就变得尤为复杂。

我参考了3D目标检测论文SECOND的源码,来尝试解释一下如何计算旋转包围盒的重叠面积。

代码全部来自second.pytorch这个项目的早期版本,去掉了numba/cuda加速的代码。

旋转包围盒的编码方式

作者代码使用了两种方式

  1. 通过包围盒中心点位置,尺度以及角度来编码rbbox
rbbox = [x, y, x_d (w), y_d (h), angle]
  1. 通过包围盒的顶点corners来编码

矢量的旋转公式

将矢量看作列矢量 α ⃗ ∈ R 2 × 1 \vec{\alpha}\in \mathbb R^{2\times1} α R2×1, 则将其逆时针旋转 θ \theta θ 之后的矢量为:

[ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] α ⃗ \begin{bmatrix}\cos\theta&-\sin\theta\\ \sin\theta & \cos\theta\end{bmatrix}\vec{\alpha} [cosθsinθsinθcosθ]α

包围盒转化为角点

旋转示意图

如图,rbbox为绿色的包围盒,是原始黑色包围盒通过逆时针旋转 θ \theta θ角度得到。分析 A ’ A’ A 的真实坐标:

首先向量 O A → \overrightarrow{OA} OA 被表示为

O A → = [ − x d 2 , − y d 2 ] T \overrightarrow{OA} = [-\frac{x_d}{2}, -\frac{y_d}{2}]^T OA =[2xd,2yd]T

旋转后的向量可以被表示为

O A ′ → = T θ O A → = [ cos ⁡ θ ⋅ − x d 2 − sin ⁡ θ − y d 2 sin ⁡ θ − x d 2 + cos ⁡ θ − y d 2 ] \overrightarrow{OA'} = T_\theta\overrightarrow{OA} = \begin{bmatrix} \cos\theta\cdot\frac{-x_d}{2} -\sin\theta\frac{-y_d}{2}\\ \sin\theta \frac{-x_d}{2} + \cos\theta\frac{-y_d}{2}\end{bmatrix} OA =TθOA =[cosθ2xdsinθ2ydsinθ2xd+cosθ2yd]
通过 A ’ = O + O A ’ → A’ = O + \overrightarrow{OA’} A=O+OA 恢复顶点的坐标即可。

代码表示

下段代码将[x, y, x_d, y_d, angle]转化为顺时针方方向表示的顶点坐标[x0, y0, x1, y1, x2, y2, x3, y3]

import math
def rbbox_to_corners(rbbox):
    # generate clockwise corners and rotate it clockwise
    # 顺时针方向返回角点位置
    cx, cy, x_d, y_d, angle = rbbox
    a_cos = math.cos(angle)
    a_sin = math.sin(angle)
    corners_x = [-x_d / 2, -x_d / 2, x_d / 2, x_d / 2]
    corners_y = [-y_d / 2, y_d / 2, y_d / 2, -y_d / 2]
    corners = [0] * 8
    for i in range(4):
        corners[2 *
                i] = a_cos * corners_x[i] + \
                     a_sin * corners_y[i] + cx
        corners[2 * i +
                1] = -a_sin * corners_x[i] + \
                     a_cos * corners_y[i] + cy
    return corners

测试一下结果:

rbbox = [0, 0, 2, 4, math.pi / 2]
corners = rbbox_to_corners(rbbox)
print([round(_) for _ in corners])
# [-2, 1, 2, 1, 2, -1, -2, -1]

相交区域的特点

两个四边形(矩形),求交叠面积,可以先求出相交的多边形(Polygon)的顶点, 构成多边形的顶点可由两种类型的点构成:

  1. 原始四边形的顶点
  2. 四边形的边相交产生的交点

对应问题为:

  1. 判断点在四边形内
  2. 判断线段的交点

点在四边形(矩形)内

如图所示,四边形(矩形)通过ABCD四个顶点表示,可以使用较强的规则判断P在矩形内,即APAB 的投影在线段AB上,在AD的投影在线段AD上。

点积投影
点积的物理意义

两个矢量的点积是标量,点积满足交换律:

  1. 矢量的模被定义为 ∣ a ∣ = a ⋅ a |a|=\sqrt{a\cdot a} a=aa
  2. a ⋅ b = ∣ a ∣
  • 34
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是C# Emgucv绘制旋转矩形的代码: ```csharp using Emgu.CV; using Emgu.CV.Structure; using System.Drawing; // 定义旋转矩形的中心点、宽度、高度和旋转角度 PointF center = new PointF(100, 100); float width = 200; float height = 100; float angle = 45; // 创建一个空白的图像 Image<Bgr, byte> img = new Image<Bgr, byte>(500, 500, new Bgr(255, 255, 255)); // 计算旋转矩形的四个顶点 PointF[] vertices = new PointF[4]; vertices[0] = new PointF(center.X - width / 2, center.Y - height / 2); vertices[1] = new PointF(center.X + width / 2, center.Y - height / 2); vertices[2] = new PointF(center.X + width / 2, center.Y + height / 2); vertices[3] = new PointF(center.X - width / 2, center.Y + height / 2); // 创建旋转矩阵 Matrix<float> rotationMatrix = new Matrix<float>(new float[,] { { (float)Math.Cos(angle * Math.PI / 180), (float)Math.Sin(angle * Math.PI / 180), 0 }, { -(float)Math.Sin(angle * Math.PI / 180), (float)Math.Cos(angle * Math.PI / 180), 0 }, { 0, 0, 1 } }); // 将旋转矩阵应用于顶点 rotationMatrix.TransformPoints(vertices); // 绘制旋转矩形 img.DrawPolyline(vertices, true, new Bgr(0, 0, 255), 2); // 显示图像 CvInvoke.Imshow("Rotated Rectangle", img); CvInvoke.WaitKey(0); ``` 这段代码首先定义了旋转矩形的中心点、宽度、高度和旋转角度,然后创建了一个空白的图像。接着计算旋转矩形的四个顶点,并创建旋转矩阵。最后将旋转矩阵应用于顶点,绘制旋转矩形,并显示图像。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值