从已知的边界框坐标计算旋转矩形大小

21

我读了如何从旋转的矩形计算边界框坐标来了解如何从旋转的矩形计算边界框坐标。但在以下特殊情况中,如下图:

http://i.stack.imgur.com/3UNfD.png

如果已经获得了边界框大小、坐标和旋转角度,如何获取旋转矩形大小?

我试着用javascript编写代码。

//assume w=123,h=98,deg=35 and get calculate box size
var deg = 35;
var bw = 156.9661922099485;
var bh = 150.82680201149986;

//calculate w and h
var xMax = bw / 2;
var yMax = bh / 2;
var radian = (deg / 180) * Math.PI;
var cosine = Math.cos(radian);
var sine = Math.sin(radian);
var cx = (xMax * cosine) + (yMax * sine)   / (cosine * cosine + sine * sine);
var cy =  -(-(xMax * sine)  - (yMax * cosine) / (cosine * cosine + sine * sine));
var w = (cx * 2 - bw)*2;
var h = (cy * 2 - bh)*2;

但是...答案与w和h不匹配


“矩形大小”是什么意思?如果您旋转一个对象,您将获得同样的旋转后的对象...相同的长度,相同的面积...如果您只有旋转后的结果而不是原始对象,请使用坐标(您说您已经有了它们),计算“角点”之间的距离以获取每条边的长度。 - ShinTakezou
我假设,参考你的“案例图像”,你已经有了bhbwtheta,并且你想要wh - Li-aung Yip
我认为您的JavaScript代码几乎正确,但是加减号有误。请查看我的答案。 - Li-aung Yip
请看此链接:https://dev59.com/1msz5IYBdhLWcg3w8MYb#30157405 - abernier
2个回答

52

enter image description here

解决方案

给定边界框尺寸 bxby,以及矩形大小为 x 乘以 y 的逆时针旋转值 t

x = (1/(cos(t)^2-sin(t)^2)) * (  bx * cos(t) - by * sin(t))
y = (1/(cos(t)^2-sin(t)^2)) * (- bx * sin(t) + by * cos(t))

推导

为什么会这样呢?

首先,考虑到长度bx被矩形的一个角分成两部分ab。使用三角函数来表示bxxytheta之间的关系:

bx = b          + a
bx = x * cos(t) + y * sin(t)            [1]

同样地,对于by也是如此:

by = c          + d
by = x * sin(t) + y * cos(t)            [2]

12 可以用矩阵形式表示:

[ bx ] = [ cos(t)  sin(t) ] * [ x ]     [3]
[ by ]   [ sin(t)  cos(t) ]   [ y ]

请注意,该矩阵几乎是一个旋转矩阵(但并非完全如此-它有一个负号)。在两边进行左除,得到:

左除矩阵两边,得:

[ x ] = inverse ( [ cos(t)  sin(t) ]    * [ bx ]                        [4]
[ y ]             [ sin(t)  cos(t) ] )    [ by ]

矩阵的逆矩阵对于2x2矩阵来说很容易求得,并且拓展为:
[ x ] = (1/(cos(t)^2-sin(t)^2)) * [ cos(t) -sin(t) ] * [ bx ]           [5]
[ y ]                             [-sin(t)  cos(t) ]   [ by ]

[5]提供了以下两个公式:

x = (1/(cos(t)^2-sin(t)^2)) * (  bx * cos(t) - by * sin(t))             [6]
y = (1/(cos(t)^2-sin(t)^2)) * (- bx * sin(t) + by * cos(t))
< p > 轻松简单!< /p >

4
回答问题所需的时间和精力与问题的趣味程度成正比。这个问题让我为之着迷。;)(注:nerd sniped是指被一个复杂或深奥的问题吸引并花费很多时间去思考这个问题,类似于xkcd漫画中的情节) - Li-aung Yip
我现在正在处理这个问题,但我刚意识到我的问题与之有些不同...https://dev59.com/1mkv5IYBdhLWcg3wvDJF 我已经有了X、Y和T(旋转角度),我想找到BX、BY和左上角的X/Y坐标。上面链接中的问题是用JavaScript编写的,但我已引用了计算的来源(包括您的),所以即使您不了解JS,也应该可以解析它。谢谢! - Campbeln
嗨,当θ为45时,由于除以0而得到非常错误的结果1/(cos(t)^2-sin(t)^2),有什么解决方法吗? - anna.mi
2
@anna.mi,对于45º的情况,不存在逆矩阵。请参考http://www.mathsisfun.com/algebra/matrix-inverse.html - 逆矩阵可能不存在。我会假设您需要使用下面提到的仿射变换方法。 - Marius
1
为了让你的回答更加出色,你能否把公式反过来说一下呢?你看,我需要围绕检测到的人脸旋转和裁剪图像(在你的术语中是(x,y)),我需要计算(bx,by)。 - Motti Shneor
显示剩余7条评论

0

你可能需要类似于仿射变换的东西来发现点坐标。然后使用标准几何公式计算大小。


仿射变换是旋转的一种非常普遍的情况。在这种情况下,只需要简单的三角函数即可。 ;) - Li-aung Yip
虽然了解仿射变换也不会有坏处 :) - Dmitry Reznik
我们如何将仿射变换应用于这个特定实例?你能举个例子吗? - Shotgun Ninja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接