OpenCV:图像变换-仿射变换与透视变换研究

2024-01-31 01:08

本文主要是介绍OpenCV:图像变换-仿射变换与透视变换研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                           

                      

上面三幅图分别为标志图形、道路标线、QR码的校正前后图,校正采用的是透视变换矩阵。

下面就主要研究一下透视变换。

1. 概念

透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

上面是百度百科上关于透视变换的定义。(看了一遍没看懂)

讲到透视变换通常也会听到仿射变换,那么透视变换和仿射变换有什么区别呢?

简单看一眼下图,基本可以从图中看出仿射变换和透视变换的区别:仿射变换可以把图像放大、缩小、旋转、或者是变成平行四边形,而透视变换除了获得仿射变换的这些效果之外,还能将图片变成梯形,具有更高的自由度。

                                                                

仿射变换:

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式.

                                                                 

透视变换即投影矩阵H:

透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射. 
相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换;

                                                 

其中,(u,v)为变换前的坐标,(x‘,y')为变换后的坐标;

由上述公式可知,仿射变换有6个未知数,透视变换有8个未知数,因此仿射变换矩阵的求解只需3组映射点(三点确定一个平面),透视变换矩阵的求解只需4组点构成8个方程(四点确定一个三维空间)。

2. 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,

其通用变换公式为:

                                                    

透视变换矩阵元素的含义:

                                                  

注:平移、缩放、旋转矩阵 https://blog.csdn.net/baidu_38172402/article/details/88920639

3. opencv函数形式

仿射变换函数:

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

仿射变换矩阵生成函数:

Mat getAffineTransform(const Point2f* src, const Point2f* dst)
//@param: const Point2f* src:原图的三个固定顶点
//@param: const Point2f* dst:目标图像的三个固定顶点
//@return:仿射变换矩阵,可直接用于warpAffine()函数
//顶点数组长度超过3个,则会自动以前3个为变换顶点;

透视变换函数:

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst)
//@param: src,dst原始点和目标点,个数>=4
//@:透视变换顶点为4个。

参考文章:

1.  https://mp.weixin.qq.com/s/b10zBadlvrSCeXVnrYHwHQ

2.  https://blog.csdn.net/yong_qi2015/article/details/80108276

3.  https://www.cnblogs.com/liekkas0626/p/5262942.html

4.  https://blog.csdn.net/hitwengqi/article/details/6890220 

5.  http://m.elecfans.com/article/593459.html

6. https://blog.csdn.net/flyyufenfei/article/details/80208361仿射变换和透视变换的区别

这篇关于OpenCV:图像变换-仿射变换与透视变换研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/662127

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境