OPENCV入门教程九:图像旋转任意角度
一、目标
学习如何旋转图片。
二、函数说明
在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入门教程九:图像旋转任意角度相关推荐
- c++实现图像旋转任意角度
图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转 HouSisong@GMail.com 200 ...
- c/c++实现图像旋转任意角度
旋转原理和旋转公式: 文章出处 https://blog.csdn.net/wonengguwozai/article/details/52049092 推导旋转公式: 旋转示意图 有: tg(b)= ...
- 【OpenCV入门教程】图像加噪
图像噪声使图像在获取或是传输过程中收到随机信号干扰,妨碍人们对图像理解及分析处理的信号.很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,也就是使用随机过程的描述,也就 ...
- opencv图片旋转关于中心旋转任意角度与坐标转换
如下例子,实现图片关于中心旋转任意角度,及坐标变换 import os import os.path import cv2 import numpy as np from math import co ...
- 转载:【OpenCV入门教程之五】 分离颜色通道多通道图像混合
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...
- 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析
[OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...
- 【OpenCV入门教程之五】 分离颜色通道多通道图像混合(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨) ...
- 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
[-] 一开胃菜之一 关于OpenCV的命名空间 二开胃菜之二 关于Mat类型 三图像的载入和显示 imread函数 namedWindow函数 imshow函数 四输出图像到文件imwrite函 ...
最新文章
- TensorRT-安装-使用
- 用来代替SQUID的软件VARNISH
- java 内存模型堆和本地方法
- 学习deercao的正则笔记
- android http通过post请求发送一个xml
- leetcode--53. 最大子序和
- 今日头条大佬十年面试了 2000 人,总结了这 5 点
- 颈椎病分型及对症治疗
- Tomcat URL重写
- pku 1094(拓扑排序,多次拓扑)
- MySQL大表优化方案,单表优化、读写分离、缓存、分区表……都在这里了
- 原生ajax、XMLHttpRequest和FetchAPI简单描述
- 用webpack打包加密静态配置文件
- 12864液晶显示c语言程序,单片机+lcd12864液晶万年历C程序
- 西门子smart200 圆弧插补 整合画图程序 2轴3轴
- 我的世界Minecraft Java开服教程(Windows)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器资源包
- 使用WSS的Lists.UpdateListItems()方法之被截断的CAML
- python调用百度地图、通过经纬度定位_python调用百度地图API得到两地经纬度计算直线距离...
- [Python]PEP8 编码规范及开发中的一些惯例和建议
- QT系统学习系列:1.2 ToolBar(工具栏)
热门文章
- CentOS桌面安装
- ysdk接入,支付提示:系统繁忙,请稍后再试 (1003-498686-498686)
- JAVA毕设项目家庭记账系统(java+VUE+Mybatis+Maven+Mysql)
- 读书笔记(四)《奇特的一生》格拉宁
- 使用 Quagga 实现 Linux 动态路由
- 从冷战到深度学习:一篇图文并茂的机器翻译史
- 富途社招php,富途社招系统测试工程师 一面+二面+终面 准备hr面
- Jmeter简单操作
- linux dae文件下载,dae文件扩展名,dae文件怎么打开?
- 安卓游戏--浅塘之辅助开发(C/S模式)