利用OpenCV的函数warpPerspective()作图像的透视变换

news2024/11/26 4:37:41

图像的透视变换是指按照物体的成像投影规律进行变换。通过透视变换可以将图像投影到新的成像平面上。

图像的透视变换通常用来解决相机的视线与物体所在平面不垂直的问题。
比如,下面这幅图中,如果相机的视线与正方形是垂直的,那么应该是下面这样的成像效果:
在这里插入图片描述
但我们相机的视线很多时候与要拍摄的物体平面不垂直,比如下面示意图中的相机与物体平面:
在这里插入图片描述
当相机的视线与要拍摄的物体平面不垂直时,就照成了下面这样:
请添加图片描述
我们可以利用透视变换对上面的图像进行校正操作。

在OpenCV开发环境下,我们可以利用函数warpPerspective()作图像的透视变换。

利用函数warpPerspective()作图像的透视变换前需要有一个3×3的透视变换矩阵,可以利用函数getPerspectiveTransform()得到3×3的透视变换矩阵。

函数getPerspectiveTransform()的原型如下:

Mat cv::getPerspectiveTransform(const Point2f src[],
                                const Point2f dst[],
                                int solveMethod = DECOMP_LU )
retval=cv.getPerspectiveTransform(src, dst[, solveMethod])

参数意义如下:
src—原图像中4个像素点的坐标,注意坐标值的数据类型为float。
dst—目标图像中4个像素点的坐标,注意坐标值的数据类型为float。
solveMethod—选择计算透视变换矩阵的方法,默认值为DECOMP_LU,其枚举值有如下这些:
在这里插入图片描述
DECOMP_LU:最佳主轴元素的高斯消元法。
DECOMP_SVD :奇异值分解(SVD)方法。
DECOMP_EIG :特征值分解法。
DECOMP_CHOLESKY :Cholesky分解法。
DECOMP_QR :QR分解法。
DECOMP_NORMAL :使用归一化公式,可以与前面的标志一起使用。

函数warpPerspective()的原型如下:

void cv::warpPerspective(InputArray src,
                         OutputArray dst,
                         InputArray M,
                         Size dsize,
                         int flags = INTER_LINEAR,
						 int borderMode = BORDER_CONSTANT,
                         const Scalar & borderValue = Scalar() )
dst=cv.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

参数意义如下:
src—输入图像。
M—尺寸为2×3的仿射变换矩阵。
dsize—输出图像的尺寸。
dst—仿射变换后的图像,与输入图像的数据类型相同,但是尺寸由参数dsize指定。
flags—插值方法和正反变换的标志位。
borderMode—像素边界外推方法的标志,详情见博文 https://www.hhai.cc/thread-178-1-1.html
borderValue—边界填充时的填充值,默认情况下为0。

给大家使用OpenCV的函数warpPerspective()作图像的透视变换的Python示例代码,
示例代码请访问本博文的原文获取。
本博文的原文链接如下:

https://www.hhai.cc/thread-192-1-1.html

代码说明:
透视变换前的四个点选取的就是图中正方形框的四个角点。
透视变换后的四个点的坐标就根据自己的需要自己设定了,不过也不是随便设定,比如在上面的代码中,我希望透视变换后的正方形是真正的正方形,那么四个点的坐标连接起来显然应该是一个是正方形。
运行结果如下图所示:
在这里插入图片描述
C++代码暂略,需要C++的朋友可以联系昊虹君,昊虹君可以把上面的代码改为C++代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改bug神器,ChatGPT分分钟扫描,真香!

最近ChatGPT大火,各大论坛中都会出现它的关键词。 机器和人对话本不是什么新鲜事,而ChatGPT上线仅5天,用户数量就超百万,之所以能在短时间吸引到这么多用户尝鲜,是因为它比“人工智障”的AI前辈们聪明多了~ 玩了一会…

T900------900MHz跳频电台核心模块(兼容P900,远距离)

(咨询申请 - 上海皕科电子有限公司--专注物联网注册后,可以获取详细数据手册和评估工具) 目录 1 概述 2 性能特点 3 硬件说明 4 整机介绍 1 概述 T900 模块使用点对点(PP)、点对多点(PMP&#xff0…

浅析几种常见的诊断数据库——ARXML

分别回忆了常见诊断数据库CDD、ODX文件格式,今天主要介绍另外一种常用的数据库文件格式——ARXML(主要应用于AUTOSAR流程数据交互) AUTOSAR诊断提取模板——ARXML AUTOSAR是汽车开放系统架构,该架构有利于车辆电子系统软件的交互与更新,并为高效管理复杂的车辆电子和软件…

Linux 管理联网 配置静态解析 域名解析

问题引入 # 我们平时在网址栏访问网址的时候, 比如 : 访问 百度 的时候,是怎样访问的 ? >>> 那是不是就是在 地址栏 我们输入 www.baidu.com 随后就跳转到 百度的页面去了~! 但实际是 : >&g…

MySQL-事务

文章目录事务(Transaction)为什么会出现事务ACID四大属性事务提交的方式事务基本操作:事务隔离级别(MVCC)隔离级别:如何理解隔离性?为何要存在隔离级别?一致性读读并发写写并发读写并…

机器学习基础概念篇 | 10大经典算法

“数据算法模型”。 面对具体的问题,选择切合问题的模型进行求解十分重要。有经验的数据科学家根据日常算法的积累,往往能在最短时间内选择更适合该问题的算法,因此构建的模型往往更准确高效。本文归纳了机器学习的10大算法,并分别…

FIX:WIN11客户机完美支持 Eyeshot Fem 最新Crack

概述 将 CAD 功能添加到您的 .NET 应用程序 Eyeshot 是一个基于.NET Framework 的CAD 控件。它允许开发人员快速将 CAD 功能添加到 WinForms 和 WPF 应用程序。Eyeshot 提供了从头开始构建几何体、使用有限元方法对其进行分析并在其上生成刀具路径的工具。还可以使用 CAD 交换…

Ubuntu安装Tango教程

文章目录环境步骤其他指令参考环境 虚拟机:VMware Ubuntun:20.04LTS Tango:9.3.4 步骤 为tango-controls安装: sudo apt-get install g openjdk-8-jdk mariadb-server libmariadb-dev zlib1g-dev libomniorb4-dev libcos4-dev omniidl li…

RPM包制作

如何准备编译制作一个RPM包 编译制作RPM包,主要包含如下几个步骤: 规划好制作一个什么样的RPM包 搜集相关的软件和压缩包、补丁 创建SPEC文件 制作RPM包 测试验证RPM包规划好制作一个什么样的RPM包 一般情况下,有如下几种情况会需要制作RPM包 应用程…

MySQL中Innodb 存储引擎的Buffer Pool详解

MYSQL的InnoDB存储引擎为了提高性能,减少磁盘IO,而设计了缓冲池(Buffer Pool)。结构图如下: Buffer Pool 什么是Buffer Pool Buffer Pool即缓冲池(简称BP),BP以Page页为单位&#x…

详解Lombok 的使用,工作原理,优缺点

文章目录Lombok概述Lombok的安装Lombok的具体使用Lombok工作原理Lombok的优缺点Lombok概述 相信大家对于lombok应该都不陌生,Lombok是一个可以大幅减少java模板代码的工具。通俗一点来说,通过添加注解的方式,不需要为类编写常用几个方法&…

stm32f407VET6 系统学习 day05 复位, 时钟,看门狗, 滴答定时器

1. 复位 1.三种类型的复位,系统复位,电源复位,备份复位; 2.复位作用:让程序从头开始运行,恢复到一开始运行的状态 2.stm32 时钟源 1. 5个是时钟源 1.HSI高速内部时钟:RC振荡器,频率为16MHz,精度不高。可…

npm中dependencies与devDependencies的区别

这个问题的出现是我下载npm包中的依赖文件安装错地方了,导致上线项目有问题,顺便一起来看看它们的区别。 一、前言 说白了就是当初学的时候太菜,没注意到它们的区别,也没去查明白。哈哈哈 二、dependencies与devDependencies的区别…

【人工智能与机器学习】——深度学习(学习笔记)

📖 前言:长期以来,图像识别技术一直是人工智能研究领域的难题。近年来,随着算力的提升、物联网与大数据的出现、机器学习算法的快速发展,科学家们终于找到了有效的方法来实现图像识别,这就是基于人工神经网…

【OpenCV-Python】教程:8-2 图像修复 Image Inpainting

OpenCV Python 图像修复 【目标】 去除小噪声和笔画等; 【理论】 大多数人家里都会有一些旧照片,上面有一些黑点,一些笔画等。你想过把它修复回来吗?我们不能简单地在油漆工具中删除它们,因为它只会用白色结构取代黑色结构&a…

代码随想录拓展day4 143.重排链表;141. 环形链表;面试题 02.07. 链表相交

代码随想录拓展day4 143.重排链表;141. 环形链表;面试题 02.07. 链表相交 关于链表的一些应用,基本都用到了快慢指针的思路。对于单链表来说,确定边界,也就是遍历时的终止条件非常重要。 143.重排链表 143. 重排链表…

Web前端105天-day65-ToolChain

ToolChain01 目录 前言 一、Webpack 二、指南 总结 前言 ToolChain01学习开始 一、Webpack 官网:webpack 浏览器仅支持: html css 和 js 三种语言实际开发中: 会使用到其他的一些语言, 例如 TS, sass, scss 等.... 这些语言开发起来更加方便快捷, 但是浏览器不…

pinia 笔记

1、安装 npm i pinia -S2、创建store基本结构 1、在src下创建store文件夹并创建app.js文件,同时编写基本代码结构 // 引入实例化store的函数 import { defineStore } from "pinia";// 实例出一个名为app的store,那appStore是什么?它代表当前…

【SpringMVC】SpringMVC实现文件上传

1.一般的文件上传 1.1 文件上传的必要前提 form 表单的 enctype 取值必须是&#xff1a;multipart/form-data(默认值是:application/x-www-form-urlencoded) enctype:是表单请求正文的类型 method 属性取值必须是 Post 提供一个文件选择域<input type"file" /&…

代码随想录二刷day2

代码随想录复习 文章目录代码随想录复习209.长度最小的子数组&#xff08;滑动窗口&#xff09;76.最小覆盖子串904.水果成篮59.螺旋矩阵2螺旋矩阵1209.长度最小的子数组&#xff08;滑动窗口&#xff09; 209.长度最小的子数组 复习一下滑动窗口&#xff0c;滑窗的复杂度还是…