Motivation

在目标检测中,标注的目标为旋转的,而使用的算法仅支持检测水平矩形框(Bounding Box),这时就需要对数据进行批量数据增强,在输入模型前把输入数据(标注好的水平矩形)旋转任意角度α\alpha,得到新的矩形,但是怎么把旋转的矩形变回水平矩形格式呢?

一种朴素(暴力)的做法

取所有点的最值得到水平矩形

{(min⁡(x1,x2),min⁡(y1,y2)),(max⁡(x1,x2),max⁡(y1,y2))}\{(\min(x_1,x_2),\min(y_1,y_2)),(\max(x_1,x_2),\max(y_1,y_2))\}

这样得到的水平矩形很大,而且包住了很多空白部分

本文方法

以原有水平矩形{(x1,y1)(x2,y2)}\{(x_1,y_1)(x_2,y_2)\}构建椭圆

(x−x1+x22)2(x1−x22)2+(y−y1+y22)2(y1−y22)2=1\frac{(x-\frac{x_1+x_2}{2})^2}{(\frac{x_1-x_2}{2})^2}+\frac{(y-\frac{y_1+y_2}{2})^2}{(\frac{y_1-y_2}{2})^2}=1

此椭圆旋转α\alpha后得到的旋转椭圆的外切水平矩形即为所求
new rectangle
也就是求椭圆旋转后的x,yx,y的最值

Solution

设一个椭圆 x2a2+y2b2=1\frac{x^2}{a^2}+\frac{y^2}{b^2}=1
外接矩形易得:{x=±ay=±b\begin{cases} x=\pm a\\ y=\pm b\\ \end{cases}
但是,椭圆逆时针旋转一定角度 α\alpha 后
即应用一个变换:

[x′y′]=[cos⁡α−sin⁡αsin⁡αcos⁡α][xy]\begin{equation}\begin{bmatrix} x^{'} \\ y^{'} \\ \end{bmatrix} = \begin{bmatrix} \cos\alpha&-\sin\alpha \\ \sin\alpha&\cos\alpha \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}\end{equation}

椭圆的参数方程由

{x=acos⁡θy=bcos⁡θ\begin{cases} x = a\cos\theta\\ y=b\cos\theta \end{cases}

变为

{xcos⁡α−ysin⁡α=acos⁡θxsin⁡α+ycos⁡α=bsin⁡θ(θ为参数)\begin{cases} x\cos\alpha-y\sin\alpha=a\cos\theta\\ x\sin\alpha+y\cos\alpha=b\sin\theta \end{cases} (\theta为参数)

整理得:

{x=acos⁡θ+ysin⁡αcos⁡αy=bsin⁡θ−xsin⁡αcos⁡α\begin{equation}\begin{cases} x=\frac{a\cos\theta+y\sin\alpha}{\cos\alpha} \\ y=\frac{b\sin\theta-x\sin\alpha}{\cos\alpha} \end{cases}\end{equation}

yy带入xx后得:

x=1cos⁡α(acos⁡θ+sin⁡α(bsin⁡θ−xsin⁡αcos⁡α))xcos⁡2α+xsin⁡2α=acos⁡αcos⁡θ+bsin⁡αsin⁡θ↪cos⁡2α+sin⁡2α=1x=acos⁡αcos⁡θ+bsin⁡αsin⁡θx=\frac{1}{\cos\alpha} (a\cos\theta+\sin\alpha(\frac{b\sin\theta-x\sin\alpha}{\cos\alpha})) \newline x\cos^2\alpha+x\sin^2\alpha = a\cos\alpha\cos\theta+b\sin\alpha\sin\theta \newline \xhookrightarrow{\cos^2\alpha+\sin^2\alpha=1} x=a\cos\alpha\cos\theta+b\sin\alpha\sin\theta

这里a,b,αa,b,\alpha为参数(常数),令acos⁡α=A,bsin⁡α=Ba\cos\alpha=A, b\sin\alpha=B,得到关于xx的表达式

x=Acos⁡θ+Bsin⁡θx=u(Aucos⁡θ+Busin⁡θ)←(u=A2+B2)  ⟹  x=usin⁡(θ+β)x = A\cos\theta+B\sin\theta \newline x = u(\frac{A}{u}\cos\theta+\frac{B}{u}\sin\theta) \gets (u=\sqrt{A^2+B^2})\newline \implies x = u\sin(\theta+\beta)

xx最值即为 ±u\pm u
带入u=A2+B2u=\sqrt{A^2+B^2},得

x=±a2cos⁡2α+b2sin⁡2α\begin{equation}x=\pm\sqrt{a^2\cos^2\alpha+b^2\sin^2\alpha}\end{equation}

同理得到关于yy的表达式:

y=±b2cos⁡2α+a2sin⁡2α\begin{equation}y=\pm\sqrt{b^2\cos^2\alpha+a^2\sin^2\alpha}\end{equation}

a,ba,b为椭圆的参数,α\alpha为逆时针旋转角度(CV中yyAxis向下,所以是顺时针),带入计算即得x,yx,y的最值,也就是水平矩形{(x1,y1)(x2,y2)}\{(x_1,y_1)(x_2,y_2)\}