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.