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);
rotate() function is used to rotate an image by an angle 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.
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:
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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With