一、目标

学习如何旋转图片。

二、函数说明

在OpenCV中,没有现成的函数直接用来实现图像旋转,它是用仿射变换函数warpAffine来实现的,此函数目前支持4种插值算法,最近邻、双线性、双三次、兰索斯插值。
函数原型:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

src源图像;
dst目标图像;
M转换矩阵;
dsize转换后图像的大小;
flags插值算法类型;
borderMode,borderValue默认0;

三、程序代码

#include "cv.h"                             //  OpenCV 文件头
#include "highgui.h"
#include "cvaux.h"
#include "cxcore.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <string>using namespace cv;
using namespace std;Mat rotateImage1(Mat img, int degree)
{degree = -degree;//warpAffine默认的旋转方向是逆时针,所以加负号表示转化为顺时针double angle = degree  * CV_PI / 180.; // 弧度  double a = sin(angle), b = cos(angle);int width = img.cols;int height = img.rows;int width_rotate = int(height * fabs(a) + width * fabs(b));int height_rotate = int(width * fabs(a) + height * fabs(b));//旋转数组map// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]float map[6];Mat map_matrix = Mat(2, 3, CV_32F, map);// 旋转中心CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);CvMat map_matrix2 = map_matrix;cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);//计算二维旋转的仿射变换矩阵map[2] += (width_rotate - width) / 2;map[5] += (height_rotate - height) / 2;Mat img_rotate;//对图像做仿射变换//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,warpAffine(img, img_rotate, map_matrix, Size(width_rotate, height_rotate), 1, 0, 0);return img_rotate;
}int main(int argc, char *argv[])
{int degree;Mat m_SrcImg;m_SrcImg = imread("C:\\Users\\lidabao\\Desktop\\Lena1.bmp");namedWindow("原图像", 1);imshow("原图像", m_SrcImg);cout << "请输入旋转的度数:";cin >> degree;Mat m_ResImg = rotateImage1(m_SrcImg, degree);namedWindow("旋转后图像", 1);imshow("旋转后图像", m_ResImg);waitKey(0);
}

四、解释

1、cv2DRotationMatrix

计算二维旋转的仿射变换矩阵

CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle,double scale, CvMat* map_matrix );

center:输入图像的旋转中心坐标
angle:旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角).
scale:各项同性的尺度因子
map_matrix:输出 2×3 矩阵的指针

函数 cv2DRotationMatrix 计算矩阵:

[ α β | (1-α)*center.x - β*center.y ]
[ -β α | β*center.x + (1-α)*center.y ]

where α=scale*cos(angle), β=scale*sin(angle)

该变换并不改变原始旋转中心点的坐标,如果这不是操作目的,则可以通过调整平移量改变其坐标(译者注:通过简单的推导可知,仿射变换的实现是首先将旋转中心置为坐标原点,再进行旋转和尺度变换,最后重新将坐标原点设定为输入图像的左上角,这里的平移量是center.x, center.y)。

2、degree = -degree

warpAffine默认的旋转方向是逆时针,所以加负号表示转化为顺时针

五、结果

程序运行如下图:
旋转角度设为30度。

六、注意

正确的配置opencv
正确使用warpAffine()函数

OPENCV入门教程九:图像旋转任意角度相关推荐

  1. c++实现图像旋转任意角度

    图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转                                 HouSisong@GMail.com   200 ...

  2. c/c++实现图像旋转任意角度

    旋转原理和旋转公式: 文章出处 https://blog.csdn.net/wonengguwozai/article/details/52049092 推导旋转公式: 旋转示意图 有: tg(b)= ...

  3. 【OpenCV入门教程】图像加噪

    图像噪声使图像在获取或是传输过程中收到随机信号干扰,妨碍人们对图像理解及分析处理的信号.很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,也就是使用随机过程的描述,也就 ...

  4. opencv图片旋转关于中心旋转任意角度与坐标转换

    如下例子,实现图片关于中心旋转任意角度,及坐标变换 import os import os.path import cv2 import numpy as np from math import co ...

  5. 转载:【OpenCV入门教程之五】 分离颜色通道多通道图像混合

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...

  6. 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析

    [OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...

  7. 【OpenCV入门教程之五】 分离颜色通道多通道图像混合(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...

  8. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  9. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

    [-] 一开胃菜之一  关于OpenCV的命名空间 二开胃菜之二  关于Mat类型 三图像的载入和显示 imread函数 namedWindow函数 imshow函数 四输出图像到文件imwrite函 ...

最新文章

  1. TensorRT-安装-使用
  2. 用来代替SQUID的软件VARNISH
  3. java 内存模型堆和本地方法
  4. 学习deercao的正则笔记
  5. android http通过post请求发送一个xml
  6. leetcode--53. 最大子序和
  7. 今日头条大佬十年面试了 2000 人,总结了这 5 点
  8. 颈椎病分型及对症治疗
  9. Tomcat URL重写
  10. pku 1094(拓扑排序,多次拓扑)
  11. MySQL大表优化方案,单表优化、读写分离、缓存、分区表……都在这里了
  12. 原生ajax、XMLHttpRequest和FetchAPI简单描述
  13. 用webpack打包加密静态配置文件
  14. 12864液晶显示c语言程序,单片机+lcd12864液晶万年历C程序
  15. 西门子smart200 圆弧插补 整合画图程序 2轴3轴
  16. 我的世界Minecraft Java开服教程(Windows)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器资源包
  17. 使用WSS的Lists.UpdateListItems()方法之被截断的CAML
  18. python调用百度地图、通过经纬度定位_python调用百度地图API得到两地经纬度计算直线距离...
  19. [Python]PEP8 编码规范及开发中的一些惯例和建议
  20. QT系统学习系列:1.2 ToolBar(工具栏)

热门文章

  1. CentOS桌面安装
  2. ysdk接入,支付提示:系统繁忙,请稍后再试 (1003-498686-498686)
  3. JAVA毕设项目家庭记账系统(java+VUE+Mybatis+Maven+Mysql)
  4. 读书笔记(四)《奇特的一生》格拉宁
  5. 使用 Quagga 实现 Linux 动态路由
  6. 从冷战到深度学习:一篇图文并茂的机器翻译史
  7. 富途社招php,富途社招系统测试工程师 一面+二面+终面 准备hr面
  8. Jmeter简单操作
  9. linux dae文件下载,dae文件扩展名,dae文件怎么打开?
  10. 安卓游戏--浅塘之辅助开发(C/S模式)