上一篇我们学习了仿射变换的warpAffine函数,知道了如何用这个函数对图像进行旋转、平移等操作,那么本节我们一起来学习一下与仿射变换相关的其他函数以及相关的几何图像变换。

一、convertMaps()函数

1、函数原型

void convertMaps(InputArray map1, InputArray map2, OutputArray dstmap1,  OutputArray dstmap2, int dstmap1type,  bool nninterpolation = false);

2、函数功能

将图片的变换映射从一种形式转换为另一种形式。

格式如下:

( (map1.type(), map2.type()) → (dstmap1.type(), dstmap2.type()) )

会支持下面的几种操作:

  • (CV_32FC1, CV_32FC1)→(CV_16SC2, CV_16UC1)

这是一种最常用的转换操作,将原图浮点映射转换为更为紧促和更快的顶点表示!第一个输出里面存储圆角坐标,第二个输出存储插值表中的索引(当函数的参数nninterpolation = false时创建);

  • (CV_32FC2)→(CV_16SC2, CV_16UC1)

与第一种类似,但是原图映射在一个2通道的矩阵中;

  • 反向转换,显然,重建的浮点映射与原图的浮点映射不会完全相同!

3、参数详解

  • 第一个参数,InputArray map1,第一个输入映射,一般它的类型为 CV_16SC2, CV_32FC1, or CV_32FC2;
  • 第二个参数,InputArray map2,第二个输入映射,一般它的类型为CV_16UC1, CV_32FC1,以及空的矩阵(none);
  • 第三个参数,OutputArray dstmap1,第一个输出映射,类型通过dstmap1type定义,尺寸与原图像一致;
  • 第四个参数,OutputArray dstmap2,第二个输出映射;
  • 第五个参数,int dstmap1type,第一个输出映射的类型应该为 CV_16SC2, CV_32FC1, or CV_32FC2;
  • 第六个参数,bool nninterpolation = false,插值的选择方式,默认选择为最近邻插值(INTER_NEAREST),否则将会使用更加复杂的插值方式!

二、getAffineTransform()函数

1、函数原型

Mat getAffineTransform( const Point2f src[],  const Point2f dst[] );Mat getAffineTransform( InputArray src,  InputArray dst );

2、函数功能

用三对相对应的点计算图像的仿射变换;该函数计算仿射变换的2x3矩阵。

具体公式如下:

仿射变换

其中:

仿射变换

3、参数详解

  • 第一个参数,const Point2f src[],原图像三角形在坐标系中的顶点坐标;
  • 第二个参数,const Point2f dst[],目标图像三角形在坐标系中的顶点坐标;
  • 返回值,返回一个2x3的仿射矩阵。

三、getPerspectiveTransform()函数

1、函数原型

Mat getPerspectiveTransform(const Point2f src[],  const Point2f dst[],  int solveMethod = DECOMP_LU);Mat getPerspectiveTransform(InputArray src,  InputArray dst,  int solveMethod = DECOMP_LU);

2、函数功能

用四对相对应的点计算图像的透视变换;

函数计算透视变换的3x3矩阵;

具体公式如下:

透视变换

其中:

透视变换

3、参数详解

  • 第一个参数,const Point2f src[],原图像四边形在坐标系中的顶点坐标;
  • 第二个参数,const Point2f dst[],目标图像四边形在坐标系中的顶点坐标;
  • 第三个参数,int solveMethod = DECOMP_LU,矩阵分解的类型,默认为DECOMP_LU(用最佳的枢轴单元进行高斯分解)
  • 返回值,返回3x3透视变换矩阵

关于第三个参数,矩阵分解的类型还有以下几种分解方式:

矩阵分解的类型

四、getRectSubPix()函数

1、函数原型

void getRectSubPix(InputArray image,  Size patchSize, Point2f center,  OutputArray patch,  int patchType = -1);

2、函数功能

从原图像中提取提取一个感兴趣的矩形区域图像;

具体的公式如下:

getRectSubPix

其中使用双线性内插检索非整数坐标处的像素的值,多通道的图像对每个通道进行单独处理;图像可以是单通道图像,也可以是三通道图像;矩形的中心必须在图像内部,矩形的一部分可以在图像外部;

3、参数详解

  • 第一个参数,InputArray image,原图像,即输入的图像;
  • 第二个参数,Size patchSize,感兴趣区域的大小 ;
  • 第三个参数,Point2f center,从原图像中提取感兴趣区域中心的浮点坐标位置,这个中心坐标必须在原图像内部;
  • 第四个参数,OutputArray patch,输出感兴趣区域的图像,这个图像的大小为第二个参数patchSize,并且与原图像具有同样的通道数;
  • 第五个参数,int patchType = -1,感兴趣区域图像的深度,默认情况下与原图具有同样的深度。

五、getRotationMatrix2D()函数

1、函数原型

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

2、函数功能

计算二维旋转的仿射矩阵;

具体的公式如下:

仿射矩阵

其中,

仿射矩阵

3、参数详解

  • 第一个参数,Point2f center,图像旋转的中心点的坐标;
  • 第二个参数,double angle,图像旋转的角度;
  • 第三个参数,double scale,图像缩放的比例因子;
  • 返回值,返回旋转之后的矩阵。

六、invertAffineTransform()函数

1、函数原型

void invertAffineTransform(InputArray M,  OutputArray iM);

2、函数功能

逆仿射变换,计算由2×3矩阵M表示的逆仿射变换,

具体的公式如下:

逆仿射变换

输出是一个2×3的矩阵,与M具有相同的类型。

3、参数详解

  • 第一个参数,InputArray M,原来的仿射变换;
  • 第二个参数,OutputArray iM,逆仿射变换。

我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C需要编程,C++需要编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!

listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...相关推荐

  1. listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析

    signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端 ...

  2. listen函数的第二个参数_JavaScript数组构造from函数

    之前我们讲解了数组的填充方法fill函数,fill函数是对当前的数组进行填充且返回值为当前的数组对象,from和fill相类似也可以对数组进行填充,但是和fill不同的是form的返回值是一个新的数组 ...

  3. get request uni 参数_接口测试实战| GET/POST 请求区别详解

    在日常的工作当中,HTTP 请求中使用最多的就是 GET 和 POST 这两种请求方式.深度掌握这两种请求方式的原理以及异同之处,也是之后做接口测试一个重要基础. GET.POST 的区别总结 请求行 ...

  4. rpc 调用webservice怎样传递参数_五分钟让你了解RPC原理详解

    欢迎关注专栏[以架构赢天下]--每天持续分享Java相关知识点 以架构赢天下​zhuanlan.zhihu.com 以架构赢天下--持续分享Java相关知识点 每篇文章首发此专栏 欢迎各路Java程序 ...

  5. mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解

    作者:xm_king SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Un ...

  6. C++框架_之Qt的信号和槽的详解

    目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...

  7. c++随机打乱数组_编程之路之php数组操作详解【文末有惊喜】

    一.数组的操作 数组是一种复合数据类型,是数据的集合. 数组中的数据称为元素,每个元素是由键和值组成的键值对. 二.数组分类 1.关联数组 数据是由键和值形式构成的数组,键和值有一定关系 $arr = ...

  8. java识别图片中的图形形状_基于Java+OpenCV技术对几何图像颜色与形状识别

    基于 Java+OpenCV 技术对几何图像颜色与形状识别 杨思阳 黄军 吴春秋 (黔东南民族职业技术学院,贵州 凯里 556000) [摘 要] 通过 Java 调用 OpenCV 视觉库实现几何图 ...

  9. 计算机主板一直滴滴响,主板报警声大全_主板一直滴滴滴短响含义详解

    主板报警声大全_主板一直滴滴滴短响含义详解 在电脑使用过程中,有时我们会听到电脑主板发出类似报警的声音,这时候说明可能电脑主板出现了一定的问题,电脑主板报警的原因有很多,我们可以从报警的声音去区分到底 ...

最新文章

  1. django项目实战(2)-数据库配置
  2. 1.6 去除字符串中的空格(trim())
  3. Atom CSScomb 增强版
  4. overload override
  5. Ubuntu SSH root user cannot login
  6. MAC IOS ssh 连接下修改环境变量
  7. 【Python】python文件名和文件路径操作
  8. 如何将自己的Java项目部署到外网
  9. 计算机网络课程实训方法,《计算机网络基本原理》实践环节指导一
  10. python设置label的位置_Python3 tkinter基础 Label pack 设置控件在窗体中的位置
  11. Httputils请求网络数据
  12. 搭建hadoop的HA集群模式(hadoop2.7.3+hive+spark)
  13. 【转】大厦将倾,互联网将如何变革传统行业(上)
  14. js map的get 和list比 那个快_js中let和var
  15. C语言及程序设计进阶例程-30 联合体及其应用
  16. com线程模型实验之三
  17. SylixOS pci 设备驱动开发
  18. vue3动态加载组件
  19. Android 10.0 recovery prompt_and_wait 跳过弹窗 自动 WIPE_DATA(出厂设置)
  20. MySQL查询——为表和字段取别名

热门文章

  1. C4D样条曲线建模大师班 Cinema 4D MasterClass: Master Modelling using Splines
  2. UE虚幻引擎:建筑可视化学习教程 Unreal Engine : Architectural Visualization
  3. OpenCV和Python动手操作计算机视觉学习教程
  4. ceph bluestore源码分析:admin_socket实时获取内存池数据
  5. 快速求斯特林数总结(洛谷模板题解)
  6. Java - 框架之 SpringBoot 攻略day01
  7. 通过Java代码实现图片的放大和缩小
  8. 存储器结构层次(二)
  9. struct和union的大小问题
  10. C# 2.0 的partial