理论

http://www.cnblogs.com/wangguchangqing/p/4045150.html

翻开任意一本图像处理的书,都会讲到图像的几何变换,这里面包括:仿射变换(affine transformation)、投影变换(projecttive transformation)。前者针对的是平面上的物体位姿变化,如水平/垂直方向位移、旋转、缩小/放大,常见的应用有ORC字符识别。后者针对的是三维空间中的位置变化,受限于物体依然是平面的,也称为二维投影变换,常见的应用有车牌识别。

图像变换:以上所有变换均可以通过矩阵描述,将输入图像与变换矩阵进行矩阵乘法得到变换后的图像坐标。显然,这种方式非常适合编程实现。

opencv仿射变换函数说明

opencv提供了,从变换矩阵计算,到图像变换,每个流程的一揽子解决方案。

以opencv 3.0为例,参考几何变换模块说明:

1、getAffineTransform

Mat getAffineTransform(InputArray src, InputArray dst)

该函数需要已知变换前与变换后的坐标,返回相应的变换矩阵,至于是何种变换无需事先知道。适用于目标检测场合,通过检测得到的特征点进行图像匹配。

2、getRotationMatrix2D

Mat getRotationMatrix2D(Point2f center, double angle, double scale)

已知旋转中心坐标(坐标原点为图像左上端点)、旋转角度(单位为度°,顺时针为负,逆时针为正)、放缩比例,返回旋转/放缩矩阵。与getAffineTransform相比,无需知道变换后坐标,适用于一般情况下的图像变换。

返回的矩阵为2x3的变换矩阵:

使用的时候将输入坐标左乘变换矩阵即可

3、warpAffine

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

根据etAffineTransform或getRotationMatrix2D得到的变换矩阵,计算变换后的图像。
src为输入图像

dst为变换后图像,类型与src一致。

M为变换矩阵,需要通过其它函数获得,当然也可以手动输入。

dsize为输出图像的大小

flags,插值算法,详细如下:

enum InterpolationFlags{/** nearest neighbor interpolation */INTER_NEAREST        = 0,  //最近邻插值/** bilinear interpolation */INTER_LINEAR         = 1, //双线性插值/** bicubic interpolation */INTER_CUBIC          = 2, //双三次插值/** resampling using pixel area relation. It may be a preferred method for image decimation, asit gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEARESTmethod. */INTER_AREA           = 3, //区域插值,使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 <span style="font-family: Arial, Helvetica, sans-serif;">INTER_NEAREST</span>方法/** Lanczos interpolation over 8x8 neighborhood */INTER_LANCZOS4       = 4, //Lanczos插值(超过8×8像素邻域的Lanczos插值)/** mask for interpolation codes */INTER_MAX            = 7,/** flag, fills all of the destination image pixels. If some of them correspond to outliers in thesource image, they are set to zero */WARP_FILL_OUTLIERS   = 8, //填充所有输出图像的象素/** flag, inverse transformationFor example, polar transforms:- flag is __not__ set: \f$dst( \phi , \rho ) = src(x,y)\f$- flag is set: \f$dst(x,y) = src( \phi , \rho )\f$*/WARP_INVERSE_MAP     = 16  //逆变换
};

borderMode,边界处理方式

enum BorderTypes {BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`BORDER_TRANSPARENT = 5, //!< `uvwxyz|absdefgh|ijklmno`BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101BORDER_ISOLATED    = 16 //!< do not look outside of ROI
};

opencv实现图像旋转(其它仿射变换的流程与此一致)

 Mat src;Mat dst(src.size(),src.type());
...cv::Point2f center(x0,y0);double ang = -30;cv::Mat rotMat = cv::getRotationMatrix2D(center,ang,1);cv::warpAffine(src,dst,rotMat,src.size());

顺时针旋转30度

更多请参考:

http://blog.csdn.net/xiaowei_cqu/article/details/7616044

http://blog.csdn.net/godenlove007/article/details/9364971

【学习OpenCV】warpAffine函数实现图像旋转相关推荐

  1. opencv4 c++ 提取图片中的白色区域_修正!【从零学习OpenCV 4】分割图像——分水岭法...

    点击上方"小白学视觉",选择"星标"公众号重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开 ...

  2. opencv warpAffine()函数详解 -- 图像旋转与平移

    简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...

  3. 【opencv_getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放 】

    文章目录 仿射变换的基本概念 几种常见的仿射变换形式: 进行仿射变换:warpAffine 函数 代码示例: 仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其 ...

  4. OpenCV基础篇——图形图像旋转

    以前在做图像处理的时候用到了图像的旋转,opencv自带的flip函数只能180度,因为需要旋转任意角度,顺时针和逆时针的情况,所以去找了些效果比较好的函数来实现.网上有的旋转函数有内存泄露的现象,现 ...

  5. matlab将图片旋转的代码_从零开始的matlab学习笔记——(27)图像旋转与动态图...

    matlab应用--求极限,求导,求积分,解方程,函数绘图,三维图像,拟合函数....更多内容尽在个人专栏:matlab学习 昨天思考了一下,因为笔者的GUI只是刚刚入门,如果直接说的话也说不了多少东 ...

  6. opencv离散傅里叶变换进行图像旋转校正

    前言 离散傅立叶变换的一个应用是决定图片中物体的几何方向.     观察这两张幅度图你会发现频域的主要内容(幅度图中的亮点)是和空间图像中物体的几何方向相关的. 通过这点我们可以计算旋转角度并修正偏差 ...

  7. 学习OpenCV——Gabor函数的应用

    原文:http://blog.csdn.net/yao_zhuang/article/details/2532279 下载cvgabor.cpp和cvgabor.h到你的C/C++工程目录下 注:在我 ...

  8. opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分

    注意与cvtColor()函数的区别,cvtColor改变颜色空间,通道数也会改变,converTo只改变数据类型,不改变通道数,原来是几个通道转换后还是几个通道 示例: src.convertTo( ...

  9. 应用OpenCV进行图像旋转和平移

    简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...

最新文章

  1. JS的一些扩展:String、StringBuilder、Uri
  2. 祝大家元宵节快乐,吃好喝好哦~~
  3. 常用的android弹出对话框
  4. CodeProject上的最近几篇关于IronPython技术的文章
  5. ios 部分string颜色_iOS-代码混淆加固方案
  6. 吴枫 python小课账号_无门槛速学编程——Python小短课,自上而下分而治之
  7. 系统文件-- lsof
  8. mysql8.0. linux二进制_linux下安装mysql8.0(二进制方式)
  9. 《京东大鼓——老年迪斯科》(董湘昆)(唱词文本)
  10. PL/SQL基础入门,史上最全的教程
  11. windirstat这个软件可以图形化统计磁盘占用,实用!
  12. [论文总结] 科技论文英语写作笔记1
  13. OpenStack网络QoS
  14. mind map 思维导图
  15. 什么是SaaS?SaaS系统有什么特征?
  16. hello ,酷狗音乐产品体验报告
  17. python中如何把xlsx、xls文件转换为txt文件?安排
  18. 用uniapp组件写登录注册
  19. 复合函数的共轭函数例子
  20. 基础——ROM, RAM, FLASH, SSD, DDR3/4, eMMC, UFS, SD卡, TF卡,相互关系

热门文章

  1. Mysql我国省市区字典数据
  2. SQL Server中已满事务日志原因的检测
  3. 隐藏安卓平板状态栏,还你全面屏体验
  4. Azure SQL 数据库仓库Data Warehouse (3) DWU
  5. Beosin成都链安发布在线EOS-IDE免费版本 EOS智能合约在线编辑、编译、运行调试、部署一步到位...
  6. 能用好小人的老板才算优秀
  7. ogr2ogr矢量数据要素格式转换
  8. 团队项目开发——细思恐极
  9. EF更新使用AutoMapper_se7en3_新浪博客
  10. 笔记本未启用无线服务器,WiFi无线网络提示未启用DHCP无法上网的解决方法