OpenCV 实现透视变换
一:OpenCV透视变换的概念
仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,可针对不同的场合使用适当的变换。
仿射变换和透视变换的数学原理不需深究,在应用层面,仿射变换是图像基于3个固定顶点的变换,如下图所示:

仿射变换是图像基于3个固定顶点的变换,接下来学习的透视变换是4个固定顶点的变换
二:透视变换工作原理
透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为:

(u,v)为原始图像像素坐标,(x=x’/w’,y=y’/w’)为变换之后的图像像素坐标。透视变换矩阵图解如下:

仿射变换(Affine Transformation)可以理解为透视变换的特殊形式。透视变换的数学表达式为:

所以,给定透视变换对应的四对像素点坐标,即可求得透视变换矩阵;反之,给定透视变换矩阵,即可对图像或像素点坐标完成透视变换,如下图所示:


三 ,透视变换的基本步骤
-
确定变换前后的四个对应点:选择变换前图像中的四个关键点,分别对应变换后图像中的四个点。这四个点应该能够构成一个矩形或者四边形,以便进行透视变换。
-
计算透视变换矩阵:通过选定的对应点,利用线性代数的方法计算出透视变换矩阵。这个矩阵可以将原始图像中的点映射到目标图像中对应的位置。
-
应用透视变换矩阵:利用计算得到的透视变换矩阵,对原始图像进行变换操作。通过在原始图像上的每个像素点应用透视变换矩阵,计算出对应的目标图像中的位置。
-
可选的后处理:根据需要,可以对变换后的图像进行一些额外的后处理操作,比如插值、边缘平滑等,以获得更好的视觉效果。
汽车的360度全景影像,从拍照视角变成鸟瞰图


常见的有文档矫正和汽车摄像头转成鸟瞰图,因为视角的原因,近处宽远处窄,呈不规则的四边形

仿射变换是单纯对图片进行平移,缩放,错切(倾斜)和旋转,而这几个操作都不会改变图片线之间的平行关系
仿射变换是在二维空间中,而透视变换则是在三维空间中视角的变化

T1为线性变换完成旋转,错切和放缩,T2完成平移操作,T3就是设了两个变量来表示映射关系
需要选取原图上的四个点以上的点集,并计算出该点集变换后的位置
from cv2 import cv2
import numpy as np# 定义鼠标点击事件的回调函数
def get_mouse_position(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:print(f"Clicked at position ({x}, {y})")# 读取图片文件
demo_file_path = 'paper.jpg'
img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)#获取高宽,调整大小
h ,w = img.shape[:2]
print(h,w) #4624 3472
img2 = cv2.resize(img,(434,578)) #这里新的大小,h,w和上面展示的h,w顺序相反
cv2.imshow('img2',img2)#创建窗口并绑定鼠标事件回调函数
cv2.namedWindow('img2')
cv2.setMouseCallback('img2',get_mouse_position)# 定义对应的点 原始1(书本的4个角落坐标)、变换2
pts1 = np.float32([[109, 148], [307, 135], [99, 456], [326, 452]])
pts2 = np.float32([[0, 0], [434, 0], [0, 578], [434, 578]])# 计算得到转换矩阵 3*3
M = cv2.getPerspectiveTransform(pts1, pts2)# 透视变换
new_img = cv2.warpPerspective(img2, M, (280, 350))cv2.imshow('perspective img', new_img)
cv2.waitKey(0)

四,注意事项
需要注意的是,在进行透视变换时,选择合适的对应点非常重要。对应点的选择应该能够准确地反映出透视畸变,并且能够保持图像内容的一致性。此外,透视变换一般需要借助计算机图形学或图像处理库来实现,例如OpenCV等。
透视变换在许多应用中都有广泛的应用,比如摄影中的图像校正、增强现实中的虚拟物体渲染、计算机视觉中的物体检测与跟踪等。通过透视变换,可以改善图像的观感,提高图像处理和分析的准确性。
相关文章:
OpenCV 实现透视变换
一:OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之…...
ChinaSoft 论坛巡礼|开源软件供应链论坛
2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...
VUE 组合式API
响应式 data 选项式API_响应式 <template><h3>选项式API</h3><p>{{ message }}</p> </template> <script> export default {data(){return{message:"选项式API 绑定数据"}} } </script>组合式API_响应式 <…...
尝试使用php给pdf添加水印
在开发中增加pdf水印的功能是很常见的,经过实验发现这中间还是会有很多问题的。第一种模式,采用生成图片的方式把需要添加的内容保存成图片,再将图片加到pdf中间,这种方法略麻烦一些,不过可以解决中文乱码的问题&#…...
ubuntu上安装edge浏览器
1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…...
动态切换 Spring Boot 打包配置:使用 Maven Profiles 管理 JAR 和 WAR
引言 在多环境开发中,我们经常需要根据部署环境来改变 Spring Boot 应用的打包方式。本文将探讨如何使用 Maven Profiles 结合依赖排除来动态地切换 JAR 和 WAR 打包配置。 1. 修改 pom.xml 以支持 WAR 包 转换 Spring Boot 应用从 JAR 到 WAR 时,首先…...
微信小程序使用阿里巴巴矢量图标
一,介绍 微信小程序使用图标有两种方式,一种是在线获取,一种是下载到本地使用, 第一种在线获取的有个缺点就是图标是灰色的,不能显示彩色图标,而且第一种是每次请求资源的,虽然很快࿰…...
使用JAVA pdf转word
使用spire.pdf 非常简单。 查看 https://mvnrepository.com/artifact/e-iceblue/spire.pdf 注意,这个包在 e-iceblue 下。 下面开始撸代码 先来pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…...
成都瀚网科技有限公司抖音带货的正规
成都瀚网科技有限公司,一家在科技领域有着深厚积累的公司,近年来也开始涉足电子商务领域,特别是在抖音等短视频平台上进行带货活动。在这个充满机遇与挑战的时代,该公司以其独特的商业模式和运营策略,正在赢得消费者的…...
windows服务器热备、负载均衡配置
安装网络负载平衡 需要加入的服务器上全部需要安装网络负载平衡管理器 图形化安装:使用服务器管理器安装 在服务器管理器中,使用“添加角色和功能”向导添加网络负载均衡功能。 完成向导后,将安装 NLB,并且不需要重启计算机。 …...
samba服务器搭建 挂载远程目录 常用配置参数介绍
samba 直接复用linux的用户,但是Linux 用户的密码和 smbpasswd 设置的密码是分开的。 Linux 用户的密码是存储在 Linux 系统的用户数据库中,通常是 /etc/shadow 文件中以加密形式存储的。Samba 用户的密码是存储在专门的 Samba 密码数据库中 smbpasswd…...
Ansible命令使用
ansible ansible的命令 ansible命令模块Pingcommand 模块shell 模块copy 模块file 模块fetch 模块cron 模块yum 模块service 模块user 模块group 模块script 模块setup 模块get_url模块stat模块unarchive模块unarchive模块 ansible的命令 /usr/bin/ansible Ansibe AD-Hoc 临…...
element 周选择器el-date-picker
2023.11.13今天我学习了在使用element 周选择器的时候,我们会发现默认的时间选择为星期日到下一个星期一,如图: 我们需要改成显示星期一到星期天,只需要加一行代码:picker-options <el-date-pickertype"week&…...
No200.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
前端面试之事件循环
什么是事件循环 首先, JavaScript是一门单线程的语言,意味着同一时间内只能做一件事,这并不意味着单线程就是阻塞,而是实现单线程非阻塞的方法就是事件循环 在JavaScript中,所欲任务都可以分为: 同步任务…...
sass 封装媒体查询工具
背景 以往写媒体查询可能是这样的: .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …...
眼科动态图像处理系统使用说明(2023-8-11 ccc)
眼科动态图像处理系统使用说明 2023-8-11 ccc 动态眼科图像捕捉存贮分析与传输系统,是由计算机软件工程师和医学专家组结合,为满足医院临床工作的需要,在2000年开发的专门用于各类眼科图像自动化分析、处理和传输的软件系统。该系统可以和各…...
国际阿里云:提高CDN缓存命中率教程!!!
CDN缓存命中率低会导致源站压力大,静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因,选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时,如果CDN节…...
关于“谈谈你对 ES 的理解”
普通人 它是一个基于 Apache Lucene 开源的一个分布式搜索引擎框架。 一般用它来做 ● 日志记录和分析 ● 公共数据采集 ● 全文检索 ● 数据可视化分析等等 高手 Elasticsearch ,简称 ES 。它是建立在全文搜索引擎库 Apache Lucene 基础之上的一个开源的搜索…...
Element-Ui el-table 动态添加行
一、在项目需要使用 这个需求主要是在项目中需要用到 1.点击新增按钮,可以实现新增行。 2.在每个列里面可以进行输入。 3.可以删除新增的行,包括数据。 二、HTML代码 1.主要是循环每一个列,而且这些列都是动态,根据父组件传过来…...
杰理AD14N/AD15N---自定义GPIO唤醒与长按键开关机配置实战
1. 认识杰理AD14N/AD15N的GPIO唤醒机制 第一次接触杰理AD14N/AD15N芯片的开发者,往往会被其GPIO唤醒机制搞得一头雾水。我刚开始调试时也踩过不少坑,比如明明按照手册配置了唤醒引脚,设备却怎么都唤不醒。后来才发现,问题出在对底…...
Notepad--:当文本编辑遇到真正的跨平台解决方案
Notepad--:当文本编辑遇到真正的跨平台解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 你是否曾因…...
黑客技术?没你想象的那么难!—— DNS 劫持篇
黑客技术?没你想象的那么难!——dns劫持篇 什么是DNS劫持? DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后…...
90% 的 SCI 拒稿都栽在时态上!引言 / 文献综述时态黄金规则,一篇讲透
本文已收录于《科研论文写作与投稿全攻略》专栏,持续更新 SCI 论文写作、选刊投稿、审稿人回复全流程硬核干货。 几乎所有科研人都踩过这个坑:论文的研究内容、实验数据都没问题,结果审稿人一句「时态使用不规范,语言不符合学术写…...
回表为什么慢:二级索引到聚簇索引、覆盖索引与“延迟关联”
目标:你能把“回表”解释成一个可量化的成本模型,并掌握两类实战优化:覆盖索引与延迟关联(先查主键再回表)。1. 先把概念说透:InnoDB 的两棵树 聚簇索引(主键 B 树):叶子…...
2.5m双馈风力发电机DFIG的带储能Simulink电气建模与仿真(参数源自IEEE3)”
2.5m双馈风力发电机DFIG并网_带储能的simulink电气建模与仿真,参数来自IEEE3半夜两点盯着Simulink界面眼冒绿光,手里的咖啡已经续到第五杯——这大概每个搞风电建模的工程师都经历过的场景。今天咱们就唠唠这个让人又爱又恨的2.5MW双馈风机并网模型&…...
彻底卸载Windows 10 OneDrive:开源脚本的完整解决方案
彻底卸载Windows 10 OneDrive:开源脚本的完整解决方案 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 你是否曾为Windows 10内置的…...
Linunx常用命令
一. 通用1.1系统单元启动# 创建系统用户,不允许登录,不创建 home 目录 sudo useradd -r -s /sbin/nologin xxl-job#将 /data/middleware/xxl-job 目录的归属权改为 xxl-job 用户: sudo chown -R xxl-job:xxl-job /data/middleware/xxl-job#检…...
BiliBiliCCSubtitle:B站字幕高效解决方案,解决字幕获取、格式转换与批量处理难题
BiliBiliCCSubtitle:B站字幕高效解决方案,解决字幕获取、格式转换与批量处理难题 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 在数字内…...
5分钟掌握Python抢票神器:告别手动抢票的烦恼!
5分钟掌握Python抢票神器:告别手动抢票的烦恼! 【免费下载链接】damaihelper 支持大麦网,淘票票、缤玩岛等多个平台,演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper 你是否还在为抢不到心仪…...
