1、认识仿射变换

仿射变换(Affine Map)又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。保持二维图形之间的相对位置保持不变,平行线依然是平行线,且直线上的点的位置顺序不变。

一个任意的仿射变换都可以表示为乘以一个矩阵接着再加上一个向量的形式。三种常见的变换形式:

  • 旋转:ratation(线性变换)
  • 平移:translation(向量加)
  • 缩放:scale(线性变换)

通常使用2 x 3的矩阵来表示仿射变换:

2、仿射变换的求法

说明:仿射变换表示的就是两幅图片之间的一种联系,关于这种联系的信息大致可以分为以下两种场景:

  • 已知X和T,而且已知它们是有联系的,接下来的跟着就是求出矩阵M。
  • 已知M和X,想要求得T。只要应用算式T=M*X即可。

如上,点1、2、3(在Image 1中形成一个三角形)与Image 2中的三个点是一一映射的关系,且它们仍然形成三角形,但形状已经和之前的不一样的,可以通过这样的两组三点求出仿射变换,然后把这种变换应用到图像中去。

3、进行仿射变换:warpAffine()函数

warpAffine()函数的作用依据下面的公式对图像做仿射变换:
dst(x,y)=src(M11X+M12Y+M13,M21X+M22Y+M23)dst(x,y)=src(M11X+M12Y+M13,M21X+M22Y+M23) dst(x,y)=src(M11X+M12Y+M13,M21X+M22Y+M23)

void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags=INTER_LINEAR,intborderMOde=BODER_CONSTANT,const Scalar& borderValue=Scalar())
  • 第一个参数:输入图像

  • 第二个参数:输出图像,函数调用后的运算结果存在这里,需要和源图片有一样的尺寸和类型

  • 第三个参数:2 x 3的变换矩阵,求得的仿射变换

  • 第四个参数:表示输出图像的尺寸

  • 第五个参数:插值方法的标识符。默认值是线性插值法(INTER_LINEAR)

  • 第六个参数:边界像素模式

  • 第七个参数:在恒定的边界情况下取值,默认值Scalar(),即0

4、计算二维旋转变换矩阵:getRotationMatrix2D()函数

说明:getRotationMatrix2D()函数用于计算二维旋转变换矩阵。变换会将旋转中心映射到它自身

Mat getRotationMatrix2D(Point2f center,double angle,double scale)
  • 第一个参数:表示源图像的旋转中心
  • 第二个参数:旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)
  • 第三个参数:缩放系统

5、示例程序:

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【经过Warp后的窗口】"
#define WINDOW_NAME3 "【经过Warp和Rotate后的窗口】"
int main()
{system("color 2F");//参数准备Point2f srcTriangle[3];Point2f dstTriangle[3];Mat rotMat(2, 3, CV_32FC1);Mat warpMat(2, 3, CV_32FC1);Mat srcImage, dstImage_warp, dstImage_warp_rotate;//加载源图像srcImage = imread("E:\\Pec\\lan.jpg",1);//设置目标图像的大小和类型与源图像一致dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());//设置源图像和目标图像上的三组点以计算仿射变换//srcTriangle[0] = Point2f(0, 0); //Point2f表示Point类的两个数据x,y为float类型;vector 表示存放四维int//srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);//srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));//dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));//dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));//dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));//获取变换矩阵,指定三个点srcTriangle[0] = Point2f(50, 50); srcTriangle[1] = Point2f(200, 50);srcTriangle[2] = Point2f(50, 200);dstTriangle[0] = Point2f(100, 100);dstTriangle[1] = Point2f(200, 50);dstTriangle[2] = Point2f(100, 250);//求仿射变换,得到一个2x3的矩阵warpMat = getAffineTransform(srcTriangle, dstTriangle);//对源图像应用刚刚的求得的仿射变换warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());//对图像进行缩放后再旋转//计算图像中点顺时针旋转50°缩放因子为0.6的旋转矩阵Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);double angle = -30.0;double scale = 0.8;//通过上面的旋转细节信息求出旋转矩阵rotMat = getRotationMatrix2D(center, angle, scale);//旋转已经缩放后的图像warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());imshow(WINDOW_NAME1, srcImage);imshow(WINDOW_NAME2, dstImage_warp);imshow(WINDOW_NAME3, dstImage_warp_rotate);waitKey(0);return 0;}

【OpenCV】-仿射变换相关推荐

  1. OpenCV仿射变换 SURF特征点描述合辑

    原文:http://blog.csdn.net/poem_qianmo/article/details/33320997?utm_source=tuicool&utm_medium=refer ...

  2. OpenCV仿射变换Affine Transformations

    OpenCV仿射变换Affine Transformations 仿射变换Affine Transformations 目标 理论 什么是仿射变换? 我们如何获得仿射变换? 代码 这个程序做什么? 解 ...

  3. opencv仿射变换:平移,缩放和旋转

    目录 仿射变换原理 opencv中仿射变换实现 使用getAffineTransform()函数求仿射变换矩阵 使用 getRotationMatrix2D()函数获取仿射矩阵 使用仿射矩阵对图像做仿 ...

  4. OpenCV仿射变换--平移

    OpenCV仿射变换--平移 OpenCV仿射变换--平移 OpenCV仿射变换--平移 公式及原理 OpenCV函数 实现代码 代码执行效果 公式及原理 定义原坐标为(x,y),平移后(xoffec ...

  5. opencv仿射变换

    API函数 1.获取仿射矩阵 (1)getAffineTransform       //设置原图像与目标图像上三点计算矩阵 Mat A=getAffineTransform(const Point2 ...

  6. opencv 仿射变换与透视变换详解

    常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换. 仿射变换 原理 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换: ...

  7. (三) OpenCV仿射变换与透射变换(Affine and Perspective Transform)

    图像最基本的变换即仿射变换(Affine Transform)和透射变换(Perspective Transform).仿射变换是对一个向量空间进行一次线性变换并接上一次平移.透射变换是中心投影的射影 ...

  8. OpenCV——仿射变换

    getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换 Mat getRotationMatrix2D( Point2f center, d ...

  9. opencv仿射变换和透视变换门牌号实践总结

    前几日在门牌号识别优化过程中发现当摄像头拍摄角度倾斜或者相机仰头拍摄出来的门牌号发生了畸变,即使能够找到门牌号区域也大大降低了识别的准确度,因此想到了倾斜矫正--仿射变换和透视变换,关于这两个概念网上 ...

  10. OpenCV 仿射变换

    图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合. 仿射变换:一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换 ...

最新文章

  1. Binder 驱动详解(下)
  2. mysql高级查询教程_MYSQL高级查询
  3. 安装nodejs插件并在sublime text 3上使用
  4. Struts2-Value Stack浅析
  5. 山东省计算机二级c语言题,2012计算机二级C语言题库.doc
  6. 不同内核浏览器的差异以及浏览器渲染简介
  7. ae合成设置快捷键_AE超实用快捷键你了解多少?
  8. poj3259 Wormholes floyd求负环
  9. 从零开始SQL注入之二
  10. 以计算机作为类 触摸板作为接口,怎样用Arduinopromicro将电脑触控板转换为USB设备...
  11. Python可视化基础----从0学会matplotlib折线图,条形图,散点图
  12. 每个故事是一座布满灰尘的城墙
  13. python神经网络预测股票组合_神经网络预测股票市场
  14. 第五章(3)行逻辑链接的顺序表
  15. 排序刷默认值sql脚本
  16. SQlite3基本用法,使用sublime编辑器
  17. 无线WiFi可以网络唤醒远程开机吗?WakeOnLan常见问题总结
  18. Edge浏览器固定到任务栏的网页图标显示透明
  19. java 1.8(jdk1.8安装教程)
  20. 欧氏距离(Euclidean distance)

热门文章

  1. chrome观看flash视频卡死的解决办法
  2. 回头看看走过的路,想想下一步该怎么走
  3. 可视化开源软件davinci编译和安装
  4. 友推在Android 实现微信等分享代码的常见问题
  5. Unity 动态加载Prefab
  6. 网易微博用户数5677万 与邮箱打通实现整合
  7. python基础——100多个Python挑战性编程练习
  8. Android 将依赖完全打入aar包供第三方使用
  9. Android已有应用生成aar 并集成到其他应用内部(本地AAR)
  10. 在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?