opencv 旋转图片

旋转图像

有几种方法旋转OpenCV的图像。旋转图像中的主要问题是它会留下一些空白图像的四个角。有几种方法来应对的空白区域

下面是一个例子,旋转图像,同时保留它的大小。 

#include <opencv/cv.h>
#include <opencv/highgui.h>

IplImage *rotateImage(const IplImage *src, int angleDegrees)
{    
    IplImage *imageRotated = cvCloneImage(src);

    if(angleDegrees!=0){
        CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
    
        // Compute rotation matrix
        CvPoint2D32f center = cvPoint2D32f( cvGetSize(imageRotated).width/2, cvGetSize(imageRotated).height/2 );
        cv2DRotationMatrix( center, angleDegrees, 1, rot_mat );

        // Do the transformation
        cvWarpAffine( src, imageRotated, rot_mat );
    }

    return imageRotated;
}


int main()
{
          
          IplImage* img;
          IplImage* rotated_img;

          int angle=0;
          
          //creating the window with a track bar
          cvNamedWindow("MyWindow");
          cvCreateTrackbar("Angle", "MyWindow", &angle, 360, 0);
          
          while(true){
              //load the original image
              img = cvLoadImage("d:/1.jpg");
              
              //rotate the image
              rotated_img=rotateImage(img,angle);

              //display the rotated image
              cvShowImage("MyWindow", rotated_img); 

              //clean up
              cvReleaseImage(&img);
              cvReleaseImage(&rotated_img);
              
              //if user press 'ESC' button, program quit the while loop
              int c=cvWaitKey(50);               
              if(c==27) break;
          }
          
          
          cvDestroyWindow("MyWindow");
          
          return 0;
}



Explanation
Here are the new OpenCV functions , found in the above example.
  • cvCloneImage(const IplImage* src)
Makes a identical(cloned) copy of the 'src' image including header and region of interrest(ROI) 

Returns IplImage* points to the cloned image

Arguements -
    • IplImage* src - source image to be cloned

  •  cvCreateMat(int rows, int columns, int types)
Creates matrix header and allocates matrix data
Returns  CvMat*  points to the matrix

Arguements -
    • int rows - number of rows of the matrix
    • int columns - number of columns of the matrix
    • int types - CV_<no. of bits of the image data><data type of image data>C<no. of channel>
                             <no. of bits of the image data>  = 8,16,32, ....
                             <data type of image data> = 'S' for signed data, 'U' for unsigned data and  'F' for float data
                             <no. of channel> = 1,2,3
                             
                             eg. : CV_8UC1 = 8 bit unsigned image with a single channel
                                     CV_32FC3 = 32 bit float image with 3 channels

  • cvPoint2D32f (float x, float y)
It is a basic structure for 2D point with floating point cordinates
            
             typedef   struct   CvPoint2D32f
            {
                 float   x ;
                 float   y ;
            }
            CvPoint2D32f ;

/* Constructor */
inline CvPoint2D32f cvPoint2D32f( double x, double y );

  • cv2DRotationMatrix(CvPoint2D32f center, double angle, double scale, CvMat* mapMatrix)
Computes affine matrix of 2D rotation

Arguements - 
    • CvPoint2D32f center - specifies the ceter of rotation
    • double angle - rotation angle in degrees (Positive value means counter clockwise rotation and negative value means clockwise rotation)
    • double scale -Isotrophic scale factor
    • CvMat* mapMatrix - the pointer to the resultant matrix which should be 2x3 matrix



  • cvWarpAffine(const CvArr* srcCvArr* dstconst CvMat* mapMatrix)
Applies an affine transformation to the source image
Arguements -
    • const CvArr* src - source image
    • CvArr* dst - destination image which is the affine transformed image of the source image
    •  const CvMat* mapMatrix - 2x3 transformation matrix

#include <opencv/cv.h>
#include <opencv/highgui.h>


IplImage *rotateImage(const IplImage *src, int angleDegrees, double zoom)
{    
    IplImage *imageRotated = cvCloneImage(src);

    
    CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
    
    // Compute rotation matrix
    CvPoint2D32f center = cvPoint2D32f( cvGetSize(imageRotated).width/2, cvGetSize(imageRotated).height/2 );
    cv2DRotationMatrix( center, angleDegrees, zoom, rot_mat );

    // Do the transformation
    cvWarpAffine( src, imageRotated, rot_mat );
    
    return imageRotated;
}


int main()
{
          
          IplImage* img;
          IplImage* rotated_img;

          int angle=0;
          int zoom=24;
          
          //creating the window with 2 track bars
          cvNamedWindow("MyWindow");
          cvCreateTrackbar("Angle", "MyWindow", &angle, 360, 0);
          cvCreateTrackbar("Zoom", "MyWindow", &zoom, 99, 0);
          
          while(true){
              //load the original image
              img = cvLoadImage("d:/lena.jpg");
              
              //rotate the image
              rotated_img=rotateImage( img, angle, (zoom+1)/25.0 );

              //display the rotated image
              cvShowImage("MyWindow", rotated_img); 

              //clean up
              cvReleaseImage(&img);
              cvReleaseImage(&rotated_img);
              
              //if user press 'ESC' button, program quit the while loop
              int c=cvWaitKey(50);               
              if(c==27) break;
          }
          
          
          cvDestroyWindow("MyWindow");
          
          return 0;
} 




旋转填充式:

#include <opencv/cv.h>
#include <opencv/highgui.h>


IplImage* rotateImage(const IplImage* src, int angleDegrees)
{
    //take the dimention of original image
    int w = src->width;
    int h = src->height; 

    // Make a new image for the result
    CvSize newSize;
    newSize.width = cvRound(w);
    newSize.height = cvRound(h);
    IplImage *imageRotated = cvCreateImage( newSize, src->depth, src->nChannels );
    
    
    // Create a map_matrix, where the left 2x2 matrix is the transform and the right 2x1 is the dimensions.
    float m[6];
    CvMat M = cvMat(2, 3, CV_32F, m);
    
    float angleRadians = angleDegrees * ((float)CV_PI / 180.0f);
    m[0] = (float)( cos(angleRadians) );
    m[1] = (float)( sin(angleRadians) );
    m[3] = -m[1];
    m[4] = m[0];
    m[2] = w*0.5f;  
    m[5] = h*0.5f;  


    // Transform the image
    cvGetQuadrangleSubPix( src, imageRotated, &M);

    return imageRotated;
}


int main()
{
          
          IplImage* img;
          IplImage* rotated_img;
          int angle=0; 
       
          //creating the window with a track bar
          cvNamedWindow("MyWindow");
          cvCreateTrackbar("Angle", "MyWindow", &angle, 360, 0);
          
          while(true){
              //load the original image
              img = cvLoadImage("d:/lena.jpg");
              
              //rotate the image
              rotated_img=rotateImage(img,angle);

              //display the rotated image
              cvShowImage("MyWindow", rotated_img); 

              //clean up
              cvReleaseImage(&img);
              cvReleaseImage(&rotated_img);
              
              //if user press 'ESC' button, program quit the while loop
              int c=cvWaitKey(50);               
              if(c==27) break;
          }
          
          
          cvDestroyWindow("MyWindow");
          
          return 0;
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值