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)\}构建椭圆

(xx1+x22)2(x1x22)2+(yy1+y22)2(y1y22)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
即应用一个变换:

[xy]=[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α))xcos2α+xsin2α=acosαcosθ+bsinαsinθcos2α+sin2α=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=±a2cos2α+b2sin2α\begin{equation}x=\pm\sqrt{a^2\cos^2\alpha+b^2\sin^2\alpha}\end{equation}

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

y=±b2cos2α+a2sin2α\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)\}