7.4 仿射变换(Affine Transformation)

7.4.1 概念

1.仿射变换,放射映射,在几何中,一个向量空间按进行一次线性变换(乘以一个矩阵)并接上一个平移(加上一个向量),变换为另一个向量空间的过程,保持了二维图形的平直性和平行性。
2.变换形式:(1)旋转,rotation(2)平移,translation(3)缩放,scale
3.矩阵表示:
          
  使用矩阵A和矩阵B对二维向量X=[x;y]做变换:
                    
  或
                    
  即:
                    
4.涉及函数:warpAffine()和getRotationMatrix2D()函数

7.4.2 仿射变换函数:warpAffine()函数

1.函数原型:

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

2.参数说明:
(1)输入图像
(2)输出图像
(3)2*3的变换矩阵M
(4)输出图像尺寸
(5)插值方式标识符,默认INTER_LINEAR,可选插值方式:
          
(6)边界像素模式,默认BORDER_CONSTANT
(7)在恒定边界情况下取的值,默认Scalar(),即0

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

1.函数原型:

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

2.参数说明:
(1)源图像旋转中心
(2)旋转角度
(3)缩放系数
3.函数操作:
  函数计算以下矩阵:
                  
  其中,            

7.4.4 仿射变换示例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【Warp后的图像】"
#define WINDOW_NAME3 "【Warp和Rotate后的图像】"int main()
{//参数准备//定义两组点,代表两个三角形Point2f srcTriangle[3];Point2f dstTriangle[3];//定义一些Mat变量Mat rotMat(2, 3, CV_32FC1);Mat warpMat(2, 3, CV_32FC1);Mat srcImage, dstImage_warp, dstImage_warp_rotate;//加载原图并初始化srcImage = imread("love.jpg");if (!srcImage.data){printf("载入原图失败~!\n");return false;}//设置目标图像大小和类型dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());//设置源图像与目标图像上的三组点以计算仿射变换srcTriangle[0] = Point2f(0, 0);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));//仿射变换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 = -50.0;double scale = 0.6;//通过上面的旋转细节信息求得旋转矩阵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;
}

运行效果:

《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换相关推荐

  1. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  2. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  3. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)

    若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...

  4. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  5. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  6. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  7. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  8. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

  9. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

  10. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

最新文章

  1. 最新离婚大数据曝光:所有的分手,都是蓄谋已久
  2. 让你的JS代码更具可读性
  3. Linux(ubuntu)下安装JDK
  4. linux 编译C++错误整理
  5. Source insight关联QT库函数
  6. weblogic概览下的上下文根配置_Weblogic服务下获取上下文路劲问题
  7. 多学一招总没错吧?SpringBoot解决前后端分离的跨域问题
  8. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
  9. Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
  10. 使用MAT分析dump文件
  11. matlab中polyfit与polyval的功能
  12. QT入门(一)——QT概述
  13. UV Mapping(UV贴图)
  14. ASP.NET MVC2 视频教程下载地址
  15. 用Google地图获取地图上某点的经纬度坐标
  16. 数字化改造大宗商品供应链 ,为大宗商品贸易增添活力
  17. 网络协议—三要素与五层网络协议
  18. 微信小程序--获取二维码(java后端)
  19. Windows 10 截图功能再度升级
  20. 集成电路开发及应用-版图设计专栏目录

热门文章

  1. NLP进阶之(七)膨胀卷积神经网络
  2. pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization...
  3. 使用idea新建maven工程的web项目的步骤
  4. i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核
  5. TVM交叉编译和远程RPC
  6. FPGA最全科普总结
  7. 2021年大数据Hadoop(二十六):YARN三大组件介绍
  8. 微信 request 合法域名校验出错
  9. pip install numpy/pandas时报错的解决方法
  10. 谷歌不更新android studio,彻底迈向64位:谷歌宣布 Android Studio 将停止 32 位版本更新...