Saltar al contenido

Girar la imagen 90, 180 o 270 grados

Esta duda se puede solucionar de variadas maneras, sin embargo te compartimos la que para nosotros es la solución más completa.

Solución:

No conozco muy bien la API de Java, estos códigos están desarrollados por C++. Las lógicas deben ser las mismas, use transpose + flip para rotar la imagen con 90n(n pertenece a N = -valor mínimo de int, ….., -3, -2, -1, 0, 1, 2, 3, …, valor máximo de int)

/*
 *@brief rotate image by multiple of 90 degrees
 *
 *@param source : input image
 *@param dst : output image
 *@param angle : factor of 90, even it is not factor of 90, the angle
 * will be mapped to the range of [-360, 360].
 * angle = 90n; n = -4, -3, -2, -1, 0, 1, 2, 3, 4 
 * if angle bigger than 360 or smaller than -360, the angle will
 * be map to -360 ~ 360.
 * mapping rule is : angle = ((angle / 90) % 4) * 90;
 *
 * ex : 89 will map to 0, 98 to 90, 179 to 90, 270 to 3, 360 to 0.
 *
 */
void rotate_image_90n(cv::Mat &src, cv::Mat &dst, int angle)
   
   if(src.data != dst.data)
       src.copyTo(dst);
   

   angle = ((angle / 90) % 4) * 90;

   //0 : flip vertical; 1 flip horizontal
   bool const flip_horizontal_or_vertical = angle > 0 ? 1 : 0;
   int const number = std::abs(angle / 90);          

   for(int i = 0; i != number; ++i)
       cv::transpose(dst, dst);
       cv::flip(dst, dst, flip_horizontal_or_vertical);
   

Edit: Mejora el rendimiento, gracias por los comentarios de TimZaman y la implementación de 1”

void rotate_90n(cv::Mat const &src, cv::Mat &dst, int angle)

Este es el primer resultado cuando lo busca en Google y ninguna de estas soluciones realmente responde la pregunta o es correcta o concisa.

Core.rotate(Mat src, Mat dst, Core.ROTATE_90_CLOCKWISE); //ROTATE_180 or ROTATE_90_COUNTERCLOCKWISE

Esto rotará una imagen cualquier número de grados, utilizando los medios más eficientes para múltiplos de 90.

    void
    rotate_cw(const cv::Mat& image, cv::Mat& dest, int degrees)
    
        switch (degrees % 360) 
            case 0:
                dest = image.clone();
                break;
            case 90:
                cv::flip(image.t(), dest, 1);
                break;
            case 180:
                cv::flip(image, dest, -1);
                break;
            case 270:
                cv::flip(image.t(), dest, 0);
                break;
            default:
                cv::Mat r = cv::getRotationMatrix2D(image.cols/2.0F, image.rows/2.0F, degrees, 1.0);
                int len = std::max(image.cols, image.rows);
                cv::warpAffine(image, dest, r, cv::Size(len, len));
                break; //image size will change
        
    

Pero con opencv 3.0, esto se hace simplemente a través del comando cv::rotate:

cv::rotate(image, dest, e.g. cv::ROTATE_90_COUNTERCLOCKWISE);

Reseñas y calificaciones

Al final de la página puedes encontrar las crónicas de otros sys admins, tú de igual manera tienes la libertad de dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *