Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV: how to rotate IplImage?

Tags:

I need to rotate an image by very small angle, like 1-5 degrees. Does OpenCV provide simple way of doing that? From reading docs i can assume that getAffineTransform() should be involved, but there is no direct example of doing something like:

IplImage *rotateImage( IplImage *source, double angle); 
like image 385
user11323 Avatar asked Feb 18 '10 15:02

user11323


People also ask

How do you rotate an image 90 degrees in Python?

rotate() function is used to rotate an image by an angle in Python.

How to rotate an image using Open cv in Python?

We can rotate a given image using OpenCV in two ways. One is using the cv. rotate() function and other is using cv2. getRotationMatrix2D() function.


2 Answers

If you use OpenCV > 2.0 it is as easy as

using namespace cv;  Mat rotateImage(const Mat& source, double angle) {     Point2f src_center(source.cols/2.0F, source.rows/2.0F);     Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0);     Mat dst;     warpAffine(source, dst, rot_mat, source.size());     return dst; } 

Note: angle is in degrees, not radians.

See the C++ interface documentation for more details and adapt as you need:

  • getRotationMatrix
  • warpAffine
like image 150
Martin Avatar answered Sep 30 '22 23:09

Martin


Edit: To down voter: Please comment the reason for down voting a tried and tested code?

#include "cv.h" #include "highgui.h" #include "math.h" int main( int argc, char** argv ) {     IplImage* src = cvLoadImage("lena.jpg", 1);         IplImage* dst = cvCloneImage( src );      int delta = 1;     int angle = 0;     int opt = 1;   // 1: rotate & zoom                // 0:  rotate only     double factor;     cvNamedWindow("src", 1);     cvShowImage("src", src);      for(;;)     {     float m[6];     CvMat M = cvMat(2, 3, CV_32F, m);     int w = src->width;     int h = src->height;      if(opt)           factor = (cos(angle*CV_PI/180.) + 1.05) * 2;     else          factor = 1;     m[0] = (float)(factor*cos(-angle*2*CV_PI/180.));     m[1] = (float)(factor*sin(-angle*2*CV_PI/180.));     m[3] = -m[1];     m[4] = m[0];     m[2] = w*0.5f;       m[5] = h*0.5f;        cvGetQuadrangleSubPix( src, dst, &M);     cvNamedWindow("dst", 1);     cvShowImage("dst", dst);     if( cvWaitKey(1) == 27 )         break;     angle =(int)(angle + delta) % 360;     }          return 0; } 

UPDATE: See the following code for rotation using warpaffine https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/affine2_cpp.cpp?r=48

#include <cv.h> #include <highgui.h>  using namespace cv;  int main(int argc, char **argv) {   // (1)load a specified file as a 3-channel color image,   //    set its ROI, and allocate a destination image   const string imagename = argc > 1 ? argv[1] : "../image/building.png";   Mat src_img = imread(imagename);   if(!src_img.data)     return -1;   Mat dst_img = src_img.clone();    // (2)set ROI   Rect roi_rect(cvRound(src_img.cols*0.25), cvRound(src_img.rows*0.25), cvRound(src_img.cols*0.5), cvRound(src_img.rows*0.5));   Mat src_roi(src_img, roi_rect);   Mat dst_roi(dst_img, roi_rect);    // (2)With specified three parameters (angle, rotation center, scale)   //    calculate an affine transformation matrix by cv2DRotationMatrix   double angle = -45.0, scale = 1.0;   Point2d center(src_roi.cols*0.5, src_roi.rows*0.5);   const Mat affine_matrix = getRotationMatrix2D( center, angle, scale );    // (3)rotate the image by warpAffine taking the affine matrix   warpAffine(src_roi, dst_roi, affine_matrix, dst_roi.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar::all(255));    // (4)show source and destination images with a rectangle indicating ROI   rectangle(src_img, roi_rect.tl(), roi_rect.br(), Scalar(255,0,255), 2);    namedWindow("src", CV_WINDOW_AUTOSIZE);   namedWindow("dst", CV_WINDOW_AUTOSIZE);   imshow("src", src_img);   imshow("dst", dst_img);   waitKey(0);    return 0; } 
like image 33
enthusiasticgeek Avatar answered Oct 01 '22 01:10

enthusiasticgeek