查找覆盖原始矩形的旋转矩形的大小

Posted

技术标签:

【中文标题】查找覆盖原始矩形的旋转矩形的大小【英文标题】:Find size of rotated rectangle that covers orginal rectangle 【发布时间】:2022-01-21 22:40:17 【问题描述】:

大家好,我有一个来自人脸检测系统的人脸边界框,格式为[x1, y1, x2, y2]

我想裁剪并对齐我当前的方法如下: 从眼睛位置计算角度,然后使用 cv2 warpAffine 函数旋转和裁剪。

问题是新的旋转边界框没有完全覆盖旧边界框,我如何计算新边界框的大小使其完全包含旧边界框

选中矩形的原始图像

裁剪和旋转的图像

代码做裁剪部分

center = (x1 + x2) // 2, (y1 + y2) // 2
d_y = eye_center[1] - mouth_center[1]
d_x = eye_center[0] - mouth_center[0]
angle = np.degrees(np.arctan2(d_y, d_x)) + 90
M = cv2.getRotationMatrix2D(center, angle, 1)
M[0, 2] += (width * 0.5) - center[0] # width is x2-x1 from face detector
M[1, 2] += (height * 0.5) - center[1] # height is y2-y1 from face detector
res_img = cv2.warpAffine(img, M, (width, height))

【问题讨论】:

几何?考虑旧 bbox 的点,旋转点 (cv.transform),围绕这些点计算 bbox。 @ChristophRackwitz 似乎如果我将旧框与 cv.transform 一起使用,它会正确返回原始图像上的坐标,但是我如何才能裁剪出旋转的矩形? 您是在问res_img 的尺寸,这取决于不要简单地使用(width, height),而是使用更大的尺寸。到目前为止和我在一起?所以,试试我说的,做一个角点数组,放入 cv.transform。看看结果。 您可以在转换后的角上使用 cv2.boundingRect 函数。 【参考方案1】:

大框尺寸为(小框w,h = width, height,旋转角度Fi):

 H = w * Abs(Sin(Fi)) + h * Abs(Cos(Fi))
 W = w * Abs(Cos(Fi)) + h * Abs(Sin(Fi))

中心保持不变,所以底角坐标是

xx = centerx - (W-w)/2
yy = centery - (H-h)/2

【讨论】:

以上是关于查找覆盖原始矩形的旋转矩形的大小的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳

HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015百度之星题目

bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

bzoj 1185 最小矩形覆盖 —— 旋转卡壳

HTML5 Canvas 中旋转矩形内的鼠标位置

矩形面积 HDU - 5251 (旋转卡壳)