es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 original

Imagen recortada y rotada

<

p”>Imagen alineada

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”>

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Calcula las cuatro esquinas del cuadro delimitador original utilizando las coordenadas [x1, y1, x2, y2].
    2. Rota cada esquina por el mismo ángulo utilizando la matriz de rotación M calculada en el código mostrado arriba.
    3. Encuentra los nuevos valores mínimos y máximos de x e y entre las coordenadas de las esquinas rotadas.
    4. El nuevo cuadro delimitador se da por [new_x1, new_y1, new_x2, new_y2] donde new_x1 = min_x, new_y1 = min_y, new_x2 = max_x y new_y2 = max_y.

    Aquí está el código para implementar los pasos anteriores:

    # Calcular las esquinas del cuadro delimitador original
    p1 = np.array([x1, y1])
    p2 = np.array([x1, y2])
    p3 = np.array([x2, y2])
    p4 = np.array([x2, y1])
    
    # Calcular la rotación de las esquinas del cuadro delimitador
    rotated_p1 = np.dot(M, np.append(p1, 1))[:2]
    rotated_p2 = np.dot(M, np.append(p2, 1))[:2]
    rotated_p3 = np.dot(M, np.append(p3, 1))[:2]
    rotated_p4 = np.dot(M, np.append(p4, 1))[:2]
    
    # Encontrar las nuevas coordenadas del cuadro delimitador
    min_x = int(min(rotated_p1[0], rotated_p2[0], rotated_p3[0], rotated_p4[0]))
    max_x = int(max(rotated_p1[0], rotated_p2[0], rotated_p3[0], rotated_p4[0]))
    min_y = int(min(rotated_p1[1], rotated_p2[1], rotated_p3[1], rotated_p4[1]))
    max_y = int(max(rotated_p1[1], rotated_p2[1], rotated_p3[1], rotated_p4[1]))
    new_box = [min_x, min_y, max_x, max_y]
    

    Luego puedes utilizar new_box en lugar de [x1, y1, x2, y2] para asegurarte de que el cuadro delimitador rotado cubra completamente el original.

Comments are closed.