Encuentre el tamaño del rectángulo rotado que cubre el rectángulo original.
Hola a todos, tengo un cuadro delimitador de caras proveniente del sistema de detección facial en el formato [x1, y1, x2, y2]
.
Quiero recortar y alinear la cara, mi enfoque actual es el siguiente: calcular el ángulo a partir de la posición de los ojos y luego rotar y recortar usando la función warpAffine de cv2.
El problema es que el nuevo cuadro delimitador rotado no cubre completamente el antiguo cuadro delimitador, ¿cómo puedo calcular el tamaño del nuevo cuadro delimitador para que contenga por completo el antiguo?
Imagen original con el rectángulo seleccionado
Imagen recortada y rotada
<
p”>
Código que realiza la parte de recorte
py
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] += (ancho * 0.5) - center[0] # ancho es x2-x1 del detector de caras
M[1, 2] += (alto * 0.5) - center[1] # alto es y2-y1 del detector de caras
img_resultado = cv2.warpAffine(img, M, (ancho, alto))
</p”>
davy.ai
Para asegurarte de que el cuadro delimitador rotado cubra completamente el cuadro delimitador original, necesitas calcular el tamaño del nuevo cuadro delimitador después de la rotación. Así es como puedes hacerlo:
[x1, y1, x2, y2]
.M
calculada en el código mostrado arriba.[new_x1, new_y1, new_x2, new_y2]
dondenew_x1 = min_x
,new_y1 = min_y
,new_x2 = max_x
ynew_y2 = max_y
.Aquí está el código para implementar los pasos anteriores:
Luego puedes utilizar
new_box
en lugar de[x1, y1, x2, y2]
para asegurarte de que el cuadro delimitador rotado cubra completamente el original.