Motivation
在目标检测中,标注的目标为旋转的,而使用的算法仅支持检测水平矩形框(Bounding Box),这时就需要对数据进行批量数据增强,在输入模型前把输入数据(标注好的水平矩形)旋转任意角度α,得到新的矩形,但是怎么把旋转的矩形变回水平矩形格式呢?
一种朴素(暴力)的做法
取所有点的最值得到水平矩形
{(min(x1,x2),min(y1,y2)),(max(x1,x2),max(y1,y2))}
这样得到的水平矩形很大,而且包住了很多空白部分
本文方法
以原有水平矩形{(x1,y1)(x2,y2)}构建椭圆
(2x1−x2)2(x−2x1+x2)2+(2y1−y2)2(y−2y1+y2)2=1
此椭圆旋转α后得到的旋转椭圆的外切水平矩形即为所求
也就是求椭圆旋转后的x,y的最值
Solution
设一个椭圆 a2x2+b2y2=1
外接矩形易得:{x=±ay=±b
但是,椭圆逆时针旋转一定角度 α 后
即应用一个变换:
[x′y′]=[cosαsinα−sinαcosα][xy]
椭圆的参数方程由
{x=acosθy=bcosθ
变为
{xcosα−ysinα=acosθxsinα+ycosα=bsinθ(θ为参数)
整理得:
{x=cosαacosθ+ysinαy=cosαbsinθ−xsinα
y带入x后得:
x=cosα1(acosθ+sinα(cosαbsinθ−xsinα))xcos2α+xsin2α=acosαcosθ+bsinαsinθcos2α+sin2α=1x=acosαcosθ+bsinαsinθ
这里a,b,α为参数(常数),令acosα=A,bsinα=B,得到关于x的表达式
x=Acosθ+Bsinθx=u(uAcosθ+uBsinθ)←(u=A2+B2)⟹x=usin(θ+β)
x最值即为 ±u
带入u=A2+B2,得
x=±a2cos2α+b2sin2α
同理得到关于y的表达式:
y=±b2cos2α+a2sin2α
a,b为椭圆的参数,α为逆时针旋转角度(CV中yAxis向下,所以是顺时针),带入计算即得x,y的最值,也就是水平矩形{(x1,y1)(x2,y2)}