Red de conocimiento informático - Aprendizaje de programación - Implementación OpenCV Python de recorte de rectángulo rotado

Implementación OpenCV Python de recorte de rectángulo rotado

Entorno

Las operaciones rectangulares son las operaciones más utilizadas que utilizamos en OpenCV, las más comunes son los cuadros delimitadores y los cuadros giratorios. El cuadro delimitador es la operación más común, correspondiente aboundingRect () en OpenCV, que usa un rectángulo para enmarcar objetos y generalmente se usa para la detección de objetivos. Usar un borde para enmarcar el objeto objetivo es una operación relativamente simple, pero a menudo hay un área adicional dentro del borde. El segundo es usar un rectángulo girado, también llamado rectángulo exterior mínimo, correspondiente a OpenCV minAreaRect (), que se usa para maximizar el marco del objeto de destino usando el rectángulo girado para reducir la interferencia de fondo. Se usa más comúnmente en OCR. tareas.

minAreaRect() devuelve los parámetros rectangulares diagonales mínimos del área deseada. A diferencia del cuadro delimitador, que devuelve directamente las coordenadas de los cuatro vértices, minAreaRect() devuelve los parámetros ((x, y), (w, h), ángulo) del rectángulo, que corresponden al centro, ancho, alto, y ángulo de rotación del rectángulo.

El ángulo de rotación (angle) es el ángulo entre el eje horizontal (eje x) de rotación en sentido antihorario y el primer lado del rectángulo encontrado. El largo de este lado es el ancho y el largo del otro lado es la altura. Es decir, el ancho y el alto no están definidos en términos de largo.

En OpenCV, el origen del sistema de coordenadas se encuentra en la esquina superior izquierda en relación con el eje x, la rotación en sentido antihorario es negativa y la rotación en sentido horario es positiva. Por lo tanto, el rango de ángulo devuelto por minAreaRect. () la función es [-90 ~ 0). Imagine un rectángulo largo plano y llamar a minAreaRect() devuelve un ángulo de -90 grados. Si rotamos la imagen hasta que el rectángulo se levante, el ángulo devuelto por minAreaRect() sigue siendo -90°.

La primera forma de recortar un rectángulo rotado es rotar la imagen mediante una transformación afín.

La transformación afín es una transformación lineal de coordenadas bidimensionales a coordenadas bidimensionales. Puede mantener la "linealidad" de los gráficos bidimensionales y el "paralelismo" de las imágenes. transformación Una línea recta sigue siendo una línea recta y un arco sigue siendo un arco. "Paralelismo" (el paralelismo en realidad significa garantizar que la relación posicional relativa entre gráficos bidimensionales permanezca sin cambios, que las líneas paralelas sigan siendo líneas paralelas y que los ángulos de intersección de las líneas que se cruzan permanezcan sin cambios).

Proceso de cálculo:

Si no juzga la longitud del lado y el ángulo, solo puede girar el ángulo del mismo tamaño en el sentido de las agujas del reloj del eje x, que no es así. garantizado El punto de vista girado es el punto de vista correcto:

Dependiendo del tipo de objetivo de la tarea, puede hacer juicios sobre las longitudes y ángulos de los lados y realizar los ajustes correspondientes para garantizar que el punto de vista girado sea el punto de vista correcto:

p>

La segunda forma de recortar un rectángulo rotado es asignar directamente los cuatro vértices del rectángulo rotado a los cuatro vértices del rectángulo regular mediante transformación de perspectiva.

La transformación de perspectiva consiste en proyectar la imagen en un nuevo plano de visión, también llamado mapeo de proyección.

Proceso de cálculo:

Ambos métodos se pueden utilizar para recortar el contenido del rectángulo rotado. El método de transformación afín requiere rotar toda la imagen por adelantado. Al observar la imagen rotada, podemos encontrar que parte de la imagen se ha rotado fuera del límite de la imagen. es fácil salirse de los límites y la clave de imagen no estará en su lugar. Al mismo tiempo, también necesitamos ajustar dinámicamente el ancho, la altura y el ángulo; el método de transformación de perspectiva asigna directamente el área de incrustación. Este método puede omitir el paso de rotación y evitar perder contenido de incrustación. Al mismo tiempo, solo necesitamos definir la relación de mapeo entre 4 vértices sin considerar el ángulo. Las transformaciones de perspectiva son ligeramente más costosas desde el punto de vista computacional que las transformaciones afines, pero la diferencia de latencia en la implementación de c subyacente es inferior a milisegundos.