Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotate image by 90, 180 or 270 degrees

I need to rotate an image by either 90, 180 or 270 degrees. In OpenCV4Android I can use:

Imgproc.getRotationMatrix2D(new Point(center, center), degrees, 1); Imgproc.warpAffine(src, dst, rotationMatrix, dst.size()); 

However, this is a huge bottleneck in my image processing algorithm. Of course, a simple rotation by a multiple of 90 degrees is much simpler than the most general case of warpAffine, and can be done much more efficiently. For 180 degrees, for instance, I could use:

Core.flip(src, dst, -1); 

where -1 means to flip about both horizontal and vertical axes. Is there a similar optimization I could use for 90 or 270 degree rotations?

like image 559
1'' Avatar asked Apr 28 '13 17:04

1''


People also ask

What is the 270 degree rotation rule?

The rule for a rotation by 270° about the origin is (x,y)→(y,−x) .


1 Answers

I don't know the java api very well, this codes are developed by c++. The logics should be the same, use transpose + flip to rotate the image with 90n(n belongs to N = -minimum value of int, ....., -3, -2, -1, 0, 1, 2, 3, ..., max value of 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 : Improve performance, thanks for the comments of TimZaman and the implementation of 1''

void rotate_90n(cv::Mat const &src, cv::Mat &dst, int angle) {              CV_Assert(angle % 90 == 0 && angle <= 360 && angle >= -360);      if(angle == 270 || angle == -90){         // Rotate clockwise 270 degrees         cv::transpose(src, dst);         cv::flip(dst, dst, 0);     }else if(angle == 180 || angle == -180){         // Rotate clockwise 180 degrees         cv::flip(src, dst, -1);     }else if(angle == 90 || angle == -270){         // Rotate clockwise 90 degrees         cv::transpose(src, dst);         cv::flip(dst, dst, 1);     }else if(angle == 360 || angle == 0 || angle == -360){         if(src.data != dst.data){             src.copyTo(dst);         }     } } 
like image 150
StereoMatching Avatar answered Oct 03 '22 09:10

StereoMatching