转自:http://download.csdn.net/source/2642701

/*  程序名:rotate.c
功能:读入图像文件,做图像旋转转,然后显示图像在屏幕上
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>

void myRotate(IplImage *img, int x, int y, float degree,int center[2]);

int main(int argc, char *argv[])
{
   IplImage* img = 0;
   int height,width,step,channels;
 uchar *data;
 int center[2]={0,0};
 argv[1]="d://a_base_1.jpg";
 //请自己添加图像文件路径
 
 img=cvLoadImage(argv[1],1);
 if(!img)
 {
  printf("Could not load image file: %s/n",argv[1]);
  exit(0);
 }
 // 获取图像信息
 height    = img->height; 
 width     = img->width; 
 step      = img->widthStep; 
 channels  = img->nChannels;
 data      = (uchar *)img->imageData;
 printf("Processing a %dx%d image with %d channels/n",height,width,channels); 
 
 // 创建窗口 
 cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
 cvMoveWindow("mainWin", 100, 100);
 
 center[0]=width/2;//这两句可以设置旋转中心的坐标
 center[1]=height/2;
 
 // 反转图像
 myRotate(img,0,0,-1,center);
 // 显示图像
 cvShowImage("mainWin", img );
 cvWaitKey(0);
 cvReleaseImage(&img );
 return 0;
}

void myRotate(IplImage *img, int x, int y, float degree,int center[2])
{
 
 double angle = degree  * CV_PI / 180.; // angle in radian
    double a = sin(angle), b = cos(angle); // sine and cosine of angle
 IplImage* imgSrc=cvCloneImage(img);
 int w_src = imgSrc->width;
 int h_src = imgSrc->height;
 
    // Make w_dst and h_dst to fit the output image
 //int w_dst = int(h_src * a + w_src * b);
    //int h_dst = int(w_src * a + h_src * b);
    //int w_dst = int(h_src * abs(a) + w_src * abs(b));
 // int h_dst = int(w_src * abs(a) + h_src * abs(b));
 
    // map matrix for WarpAffine, stored in statck array
    double map[6];
    CvMat map_matrix = cvMat(2, 3, CV_64FC1, map);
   
    // Rotation center needed for cv2DRotationMatrix
    CvPoint2D32f pt = cvPoint2D32f(center[0], center[1]);
    cv2DRotationMatrix(pt, degree, 1.0, &map_matrix);
 
    // otherwise you will get only part of the result
    map[2] +=x;
    map[5] +=y;
 
    // We need a destination image 
    cvWarpAffine(
              imgSrc,
              img,
              &map_matrix,
              CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
              cvScalarAll(0)
              );
}

转自:http://www.cnblogs.com/HappyXie/archive/2011/03/02/1969434.html

//OpenCV 4 下的图像任意角度的旋转

//需要inter公司的OpenCV的支持.

//OpenCV 4下的图像任意角度的旋转
//待旋转的图像IplImage* Img_old
//返回的旋转后图像 IplImage* Img_tmp.
//旋转的角度,单位度.
//三种不同的方法.其中方法二没有完全测试,方法一可以满足大部分需要
//Vastsky - Nercita   2005 6 12 
//vastsky_sun#126.com
IplImage * CCropMeasureView::FitRotate (IplImage* Img_old, double angle,int method)

{

IplImage* Img_tmp = NULL;

double anglerad  = (CV_PI* (angle/180)) ;
int newheight =int (fabs(( sin(anglerad)*Img_old->width )) + fabs(( cos(anglerad)*Img_old->height )) );
int newwidth  =int (fabs(( sin(anglerad)*Img_old->height)) + fabs(( cos(anglerad)*Img_old->width)) );
    
    Img_tmp = cvCreateImage(cvSize(newwidth,newheight), IPL_DEPTH_8U, 3);
cvFillImage(Img_tmp,0);//目的图像 使用扩展的大小

IplImage* dst = cvCloneImage( Img_old );//目的图像 与原图像等大

float m[6];           
        CvMat M = cvMat( 2, 3, CV_32F, m );

if(1==method)
   {
      //方法一  提取象素四边形,使用子象素精度
     
    int w = Img_old->width;
          int h = Img_old->height;

m[0] = (float)(cos(angle*CV_PI/180.));
            m[1] = (float)(sin(angle*CV_PI/180.));
            m[2] = w*0.5f;
            m[3] = -m[1];
            m[4] = m[0];
            m[5] = h*0.5f;
         
           cvGetQuadrangleSubPix( Img_old, dst, &M, 1, cvScalarAll(0));
  
           cvGetQuadrangleSubPix( Img_old, Img_tmp, &M, CV_INTER_LINEAR, cvScalarAll(0));//+CV_WARP_FILL_OUTLIERS
 
     //方法一  提取象素四边形,使用子象素精度
   }

if(2==method)
   {
   //方法二 使用 二维旋转的仿射变换矩阵 存在问题 要求输入和输出图像一样大 旋转中心不对
 
      CvPoint2D32f center;
   center.x=float (Img_old->width/2.0+0.5);//float (Img_tmp->width/2.0+0.5);
   center.y=float (Img_old->height/2.0+0.5);//float (Img_tmp->height/2.0+0.5);  
   cv2DRotationMatrix( center, angle,1, &M);
  
   cvWarpAffine( Img_old, dst, &M,CV_INTER_LINEAR,cvScalarAll(0) );//小图
       //小目标图像

//对图像进行扩展
   //   只能一定角度以内 不同象限的不同对待
           int dx=int((newwidth -Img_old->width )/2+0.5);
         int dy=int((newheight-Img_old->height)/2+0.5);

uchar* old_ptr,*temp_ptr;
  
            for( int y=0 ; y<Img_old->height; y++) //为了不越界
   {
           for (int x=0 ; x< Img_old->width; x++)
     {
        old_ptr = &((uchar*)(Img_old->imageData + Img_old->widthStep*y))[(x)*3];
     temp_ptr = &((uchar*)(Img_tmp->imageData + Img_tmp->widthStep*(y+dy)))[(x+dx)*3];
     temp_ptr[0]=old_ptr[0]; //green
     temp_ptr[1]=old_ptr[1]; //blue
     temp_ptr[2]=old_ptr[2]; //Red
     }
   }
  
 
   center.x=float (Img_tmp->width/2.0+0.5);
   center.y=float (Img_tmp->height/2.0+0.5);  
   cv2DRotationMatrix( center, angle,1, &M);
  
   IplImage* temp = cvCloneImage( Img_tmp );//生成输出图像
   cvWarpAffine( Img_tmp, temp    , &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );//大图
      Img_tmp=cvCloneImage( temp );
   
   //问题
   //cvWarpAffine( Img_tmp, Img_tmp, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );//大图
  
   //方法二 使用 二维旋转的仿射变换矩阵
   }

if(3==method)
    {
     //方法三 透视变换
      CvPoint2D32f src_point[4];
      CvPoint2D32f dst_point[4];

src_point[0].x=0.0;                    src_point[0].y=0.0;
      src_point[1].x=0.0;                    src_point[1].y=(float) Img_old->height;
      src_point[2].x=(float) Img_old->width; src_point[2].y=(float) Img_old->height;
      src_point[3].x=(float) Img_old->width; src_point[3].y=0.0;

dst_point[0].x=0;              
      dst_point[0].y=(float) fabs(( sin(anglerad)*Img_old->width ));

dst_point[1].x=(float) fabs(( sin(anglerad)*Img_old->height));             
      dst_point[1].y=(float) fabs(( sin(anglerad)*Img_old->width ))+(float) fabs(( cos(anglerad)*Img_old->height));
   
      dst_point[2].x=(float) fabs(( sin(anglerad)*Img_old->height))+(float) fabs(( cos(anglerad)*Img_old->width));
      dst_point[2].y=(float) fabs(( cos(anglerad)*Img_old->height));

dst_point[3].x=(float) fabs(( cos(anglerad)*Img_old->width));
      dst_point[3].y=0;
   
      
      float newm[9];           
            CvMat newM = cvMat( 3, 3, CV_32F, newm );
      cvWarpPerspectiveQMatrix(src_point,dst_point,&newM);
  
      cvWarpPerspective(Img_old,dst,&newM,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0) );
      cvWarpPerspective(Img_old,Img_tmp,&newM,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0) );
        
   //方法三 透视变换
    }
  
   
   //  cvNamedWindow( "dst_litter", 1 );
   //  cvShowImage( "dst_litter", dst );

// cvNamedWindow( "dst_big", 1 );
// cvShowImage( "dst_big", Img_tmp );
  
     return Img_tmp;

}

其他参考博客:

1、  http://cau.anzhi.blog.163.com/blog/static/125775520084240205820/

2、  http://blog.csdn.net/hunnish/article/details/1370998

opencv图像旋转相关推荐

  1. python opencv 图像旋转

    python opencv 图像旋转 原图 顺时针旋转 代码: import cv2 path = '2.jpg' img = cv2.imread(path,1) trans_img = cv2.t ...

  2. OpenCV图像旋转,指定填充背景颜色边界颜色

    OpenCV图像旋转,指定填充背景颜色边界颜色 OpenCV与图像旋转有关的函数: (1)warpAffine函数 void cv::warpAffine ( InputArray  src,     ...

  3. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  4. OpenCV 图像旋转、平移、缩放

    本文是 OpenCV图像视觉入门之路的第7篇文章,本文详细的进行了图像的缩放 cv2.resize().旋转 cv2.flip().平移 cv2.warpAffine()等操作. OpenCV 图像旋 ...

  5. 经验 | OpenCV图像旋转的原理与技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|OpenCV学堂 01 引言 初学图像处理,很多人遇到的 ...

  6. OpenCV图像旋转的原理与技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自|OpenCV学堂 01 引言 初学图像处理,很多人遇到的第一 ...

  7. OpenCV 图像旋转

    在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果. cv2.getRotationMatrix2D(center, ang ...

  8. opencv 图像旋转_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测...

    Dlib 和 OpenCV 这两个库已经在深度学习和人脸识别领域逐渐有了自己的一席之地,基于它们的各种开源项目的越来越多,今天 Gitee 上这个开源项目也是基于 Dlib 和 OpenCV 的,具体 ...

  9. opencv图像旋转和翻转,cv2.flip,cv2.rotate

    目录 翻转图像 图像旋转 翻转图像 opencv中使用cv2.filp可以实现图像翻转 def flip(src, flipCode, dst=None) src:输入图像 flipCode:flip ...

  10. OpenCV图像旋转(cv::rotate)与镜像(cv::flip)

    1.概述 案例:使用OpenCV实现图像的旋转和镜像操作 所用函数:这里主要使用到了两个函数 1.旋转:cv::rotate 2.镜像:cv::flip rotate(InputArray src, ...

最新文章

  1. 如何利用PyTorch中的Moco-V2减少计算约束
  2. Node.js 将Json文件数据转为SQL可执行的insert语句
  3. 最近在弄ionic3的时候遇到的一些问题(遇到就更新)
  4. sparkmllib scala GBDT Demo
  5. WWW 2021 | 融合先验知识的BERT注意力模型
  6. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
  7. 乐视跳过服务器验证,pandwonload不能登录?试试跳过启动验证
  8. php集成环境、基础标记符
  9. Flash Player Control for ASP.NET
  10. Android Studio Tips -- 提取方法
  11. ACL(标准/扩展访问控制列表)
  12. opencv3.2教程linux,Linux编译OpenCV3.2.0-OCL模块并使用
  13. unexpected character `w‘ in type specifier 解决方案
  14. HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲
  15. K-mean(多维度)聚类算法(matlab代码)
  16. uefi怎么念_UEFI和Legacy的区别是什么,请尽量从原理上说明?
  17. takemehigher计算机乐谱,【图片】简谱【无饿不作吧】_百度贴吧
  18. 开班倒计时!12月1日—CDA数据分析就业班火热报名中
  19. 腾讯企业 html邮件模板,用腾讯企业邮做为邮件服务器来发送通知邮件的操作步骤...
  20. 分治法——查找最大最小元素(Python)

热门文章

  1. java三段式if_Java几种常用的断言风格你怎么选?
  2. 华数机器人码垛_冲压机器人研究现状与发展方向
  3. 【论文速读】城市自动驾驶应用的概率语义地图
  4. js中Object类型和Array类型的变量被赋值(复制)给其他变量后,修改被赋值(复制)的新变量的值,会影响原始变量的值,这是为什么呢?
  5. 如何用bat文件快速计算项目代码行数
  6. ThinkPad T420更换SSD实录
  7. 用Unity和C#创建在线多人游戏学习教程
  8. 虚幻引擎C++编程游戏开发基础
  9. C语言网络编程:socket函数
  10. M_Map画南海水深地形图