OpenCv高阶(六)——图像的透视变换
目录
一、透视变换的定义与作用
二、透视变换的过程
三、OpenCV 中的透视变换函数
1. cv2.getPerspectiveTransform(src, dst)
2. cv2.warpPerspective(src, H, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
四、文档扫描校正(将倾斜文档转为正视图)
五、透视变换 vs 仿射变换
六、注意事项
1、点坐标的准确性
2、边界黑边处理
3、非平面场景的限制
七、总结
一、透视变换的定义与作用
透视变换是将图像从一个视平面投影到另一个视平面的几何变换,用于解决图像的透视畸变问题(如近大远小的视觉效果),或实现视角转换(如从倾斜图像恢复正视图)。
- 核心目标:通过 4 组对应点(原图像与目标图像中的坐标对),计算单应性矩阵(Homography Matrix),将任意四边形区域映射为矩形(或其他四边形),实现视角校正或投影变换。
- 应用场景:文档扫描校正、无人机航拍图像视角调整、增强现实(AR)中的虚拟物体叠加、目标检测中的视角归一化等。

二、透视变换的过程
对一张我们即将做透视变换图像,首先要获取到图像中的4个坐标点,用于与目标图像中的坐标对应,这四个点还是有顺序的以坐标轴原点为参照点,距离原点最近的点为0号坐标,最远的为2号坐标,这两个点是最容易区分出来的;1号和3号位置可以通过坐标相减作为区分,距离X轴近的坐标的y值小于x值,所以按照x坐标减去y坐标得到的值1号坐标的值大于3号坐标的值。
区分0和2号坐标点:对四个点每个点坐标的x和y的值相加求和,我们发现,针对任意图片轮廓,如果被四个点描绘,距离原点最近的点求和的值最小,在右下点的值求和的数值最大,可以区分出左上和右下两个点
区分1和3号坐标点:对四个点每个点坐标的x和y的值相减(x-y),针对任意图片轮廓,如果被四个点描绘,位于右上角做差的值为一个很大的正数,在左下点的值做差的数值为负数,可以区分出左下和右上两个点

三、OpenCV 中的透视变换函数
OpenCV 提供两个核心函数实现透视变换:cv2.getPerspectiveTransform 和 cv2.warpPerspective。
1. cv2.getPerspectiveTransform(src, dst)
-
功能:根据 4 组对应点对计算单应性矩阵 H。
-
参数:
-
src:原图像中 4 个点的坐标(形状为(4,2)或(4,1,2)的浮点型数组)。 -
dst:目标图像中对应 4 个点的坐标(形状同上,通常取矩形的四个角点,如(0,0), (w,0), (w,h), (0,h))。
-
-
返回值:单应性矩阵 H(形状为
(3,3)的浮点型矩阵)。
2. cv2.warpPerspective(src, H, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
-
功能:根据单应性矩阵 H 对图像进行透视变换。
-
参数:
-
src:输入图像(单通道或三通道)。 -
H:单应性矩阵(由getPerspectiveTransform计算得到)。 -
dsize:输出图像的大小(元组(width, height))。 -
flags:插值方法(默认cv2.INTER_LINEAR,常用cv2.INTER_NEAREST或cv2.INTER_CUBIC)。 -
borderMode:边界填充模式(默认cv2.BORDER_CONSTANT,可填充黑色或自定义颜色)。 -
borderValue:边界填充值(默认 0,即黑色)。
-
四、文档扫描校正(将倾斜文档转为正视图)
假设原图像中文档的四个角点坐标为 src_points,目标图像中希望将其映射为宽度 w、高度 h 的矩形(四个角点为 dst_points):
import cv2
import numpy as np# 读取图像
img = cv2.imread('document.jpg')
h, w = img.shape[:2]# 定义原图像中的4个角点(需手动选择或通过特征匹配获取)
src_points = np.float32([[92, 112], [381, 90], [390, 264], [120, 309]]) # 左上、右上、右下、左下(顺序需对应)
# 定义目标图像中的4个角点(通常为矩形的四个角,左上、右上、右下、左下)
dst_points = np.float32([[0, 0], [w, 0], [w, h], [0, h]])# 计算单应性矩阵
H = cv2.getPerspectiveTransform(src_points, dst_points)# 应用透视变换
warped_img = cv2.warpPerspective(img, H, (w, h))# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Warped Image', warped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看出我们将一张歪歪扭扭的照片扶正了,那么接下来我们就可以对图片做一些图像处理,使文本信息更加清晰。
关键点说明:
-
点的顺序:
-
src_points和dst_points中的点必须一一对应,通常按 左上→右上→右下→左下 的顺序排列,确保映射区域正确。
-
-
手动选点:
-
可通过鼠标交互函数(如
cv2.setMouseCallback)手动选择图像中的四个角点,提高灵活性。
-
-
目标图像大小:
-
dsize决定输出图像的宽度和高度,需根据实际需求设置(如原图像尺寸或自定义尺寸)。
-
五、透视变换 vs 仿射变换
| 特性 | 透视变换 | 仿射变换 |
|---|---|---|
| 变换类型 | 3D 投影到 2D 平面(非线性变换) | 2D 平面内的线性变换 + 平移 |
| 对应点要求 | 至少 4 个不共线点对 | 至少 3 个不共线点对 |
| 保持性质 | 直线映射为直线,但平行线可能不平行 | 直线、平行线、相对距离比例保持不变 |
| 变换矩阵 | 3×3 矩阵(8 个自由度) | 2×3 矩阵(6 个自由度) |
| 应用场景 | 视角校正、文档扫描、AR 视角变换 | 旋转、缩放、平移、剪切等简单变换 |
仿射变换的知识我们将在后面通过案例来详细介绍。
六、注意事项
1、点坐标的准确性
输入点对的微小误差会显著影响变换结果,建议通过特征匹配(如 SIFT、ORB)+ 随机抽样一致性算法(RANSAC)自动获取鲁棒的点对。
2、边界黑边处理
变换后的图像可能出现黑边(超出原图像范围),可通过调整 dsize 或裁剪去除黑边。
3、非平面场景的限制
透视变换假设场景为平面(如文档、墙面),若处理 3D 物体(如立方体),需分面处理或使用 3D 重建技术。
七、总结
透视变换是图像处理中解决视角畸变的核心技术,通过单应性矩阵实现任意四边形到矩形(或其他四边形)的映射,广泛应用于文档校正、图像拼接、AR 等领域。关键在于准确获取 4 组对应点对,并合理设置输出图像尺寸和插值方法。实际应用中,结合特征检测与匹配算法(如 SIFT+RANSAC)可实现自动化的透视变换,提高鲁棒性和效率。
相关文章:
OpenCv高阶(六)——图像的透视变换
目录 一、透视变换的定义与作用 二、透视变换的过程 三、OpenCV 中的透视变换函数 1. cv2.getPerspectiveTransform(src, dst) 2. cv2.warpPerspective(src, H, dsize, dstNone, flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue0) 四、文档扫描校正&a…...
性能比拼: Go vs Bun
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 我对 Bun 在之前的基准测试中的出色表现感到惊讶,因此我决定将它与 Go …...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
Qt中读写结构体字节数据
在Qt中读写结构体字节数据通常涉及将结构体转换为字节数组(QByteArray)或直接从内存中读写。以下是几种常见方法: 方法1:使用QDataStream读写结构体 cpp #include <QFile> #include <QDataStream>// 定义结构体 #pragma pack(push, 1) //…...
鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
本文聚焦于ArkUI的布局实战,三种十分重要的布局,线性布局、弹性布局、层叠布局,在实际开发过程中这几种布局方法都十分常见,下面直接上手 线性布局 垂直布局(Column) 官方文档: Column-行列…...
测试基础笔记第七天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…...
[Windows] Adobe Camera Raw 17.2 win/Mac版本
[Windows] Adobe Camera Raw 链接:https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw,支持Photoshop,lightroom等Adobe系列软件,对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…...
开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Gradio(一)
一、前言 在当今信息呈现方式越来越多样化的背景下,如何将文字、图片甚至视频高效转化为可听的音频体验,已经成为内容创作者、教育者和研究者们共同关注的重要话题。Podcastfy是一款基于Python的开源工具,它专注于将多种形式的内容智能转换成…...
深入剖析 Java Web 项目序列化:方案选型与最佳实践
在 Java Web 开发中,“序列化”是一个你无法绕过的概念。无论是缓存数据、共享 Session,还是进行远程过程调用(RPC)或消息传递,序列化都扮演着底层数据搬运工的角色。它负责将内存中的 Java 对象转换成可传输或可存储的…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…...
将 DeepSeek 集成到 Spring Boot 项目实现通过 AI 对话方式操作后台数据
文章目录 项目简介本项目分两大模块 GiteeMCP 简介环境要求项目代码核心实现代码MCP 服务端MCP 客户端 DeepSeek APIDockersse 连接ws 连接(推荐)http 连接 vue2-chat-windowCherry Studio配置模型配置 MCP调用 MCP 项目简介 在本项目中,我们…...
《前端面试题之 Vue 篇(第三集)》
目录 1、 nvm的常用命令①.Node.js 版本与 npm 版本的对应关系②Vue2 与 Vue3 项目的 Node.js 版本分界线③版本管理实践建议 2、Vue2 项目搭建(基于 vue-cli Webpack)① 环境准备② 安装 Vue CLI(脚手架)③.创建项目(…...
PHP实现图片自动添加水印效果
<?php // 设置原始图片路径和水印图片路径 $original_image original.jpg; $watermark_image watermark.png;// 创建图片资源 $original imagecreatefromjpeg($original_image); $watermark imagecreatefrompng($watermark_image);// 获取图片尺寸 $original_width im…...
嵌入式C语言位操作的几种常见用法
作为一名老单片机工程师,我承认,当年刚入行的时候,最怕的就是看那些密密麻麻的寄存器定义,以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器,硬件就是不听话”的情况,简直想把示波器砸了&am…...
基于Djiango实现中药材数据分析与可视化系统
中药材数据分析与可视化系统 项目截图 登录 注册 首页 药材Top20 药材价格 产地占比 历史价格 新闻资讯 后台管理 一、项目概述 中药材数据分析与可视化系统是一个基于Django框架开发的专业Web应用,致力于对各类中药材数据进行全面、系统的采集、分析和可视化展示…...
stm32(gpio的四种输出)
其实GPIO这个片上外设的功能: 用于控制IO引脚。 CPU就如同大脑,而这些片上外设就如同四肢一样的关系 如图 —————————————————————————————— OK类比了以上 其实GPIO是有 八种工作模式的 这八种工作模式 因为GPIO是面向IO…...
系统架构设计师:计算机组成与体系结构(如CPU、存储系统、I/O系统)案例分析与简答题、详细解析与评分要点
计算机组成与体系结构 10道案例分析与简答题 案例分析题(5道) 1. Cache映射与主存编址计算 场景:某计算机系统采用32位地址总线,主存容量为4GB,Cache容量为512KB,块大小为64B,使用4路组相联映射…...
Zookeeper 可观测性最佳实践
Zookeeper 介绍 ZooKeeper 是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群管理等。本文介绍通过 DataKit 采集 Zookeeper 指标&#…...
位运算---总结
位运算 基础 1. & 运算符 : 有 0 就是 0 2. | 运算符 : 有 1 就是 1 3. ^ 运算符 : 相同为0 相异为1 and 无进位相加位运算的优选级 不用在意优先级,能加括号就加括号给一个数 n ,确定它的二进制位中第 x 位是 0 还是 1? 规定: 题中所说的第x位指:int 在32位机器下4个…...
2. 什么是最普通的自动化“裸奔状态”?
什么是最普通的自动化"裸奔状态"?从大厂案例看测试代码的生存困境 一个典型的"裸奔代码"示例 # 打开目标网站 driver.get(http://test-site.com/login-page)# 登录操作 driver.find_element_by_id(user).send_keys(tester) driver.find_eleme…...
头歌java课程实验(函数式接口及lambda表达式)
第1关:利用lambda表达式对Book数组按多个字段进行排序 任务描述 本关任务:利用Comparator接口完成对Book数组同时按多个字段进行排序。 编程要求 1、本任务共有三个文件,可查看各文件的内容 2、无需修改SortBy.java枚举文件及Book.java类文…...
微信小程序三种裁剪动画有效果图
效果图 .wxml <image class"img inset {{status?action1:}}" src"{{src}}" /> <image class"img circle {{status?action2:}}" src"{{src}}" /> <image class"img polygon {{status?action3:}}" src&quo…...
C语言笔记(鹏哥)上课板书+课件汇总(结构体)-----数据结构常用
结构体 目录: 1、结构体类型声明 2、结构体变量的创建和初始化 3、结构体成员访问操作符 4、结构体内存对齐*****(重要指数五颗星) 5、结构体传参 6、结构体实现位段 一、结构体类型声明 其实在指针中我们已经讲解了一些结构体内容了&…...
git清理--解决.git文件过大问题
背景:为什么.git比我仓库中的文件大很多 为什么我的git中只有一个1KB的README,但是.git却又1G多?当我想把这个git库push到gitee时,还会报错: 根据报错信息,可看出失败的原因是:有文件的大小超过…...
Jetson Orin NX 部署YOLOv12笔记
步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意:YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…...
微服务2--服务治理与服务调用
前言 :本文主要阐述微服务架构中的服务治理,以及Nacos环境搭建、服务注册、服务调用,负载均衡以及Feign实现服务调用。 服务治理 服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。 服务注册:在…...
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …...
python生成项目依赖文件requirements.txt
文章目录 通过pip freeze去生成通过pipreqs去生成 通过pip freeze去生成 pip freeze > requirements.txt会将整个python的Interceptor的环境下lib包下所有的依赖都生成到这个文件当中,取决于我们使用的python的版本下所有的安装包。不建议使用这种方式ÿ…...
C语言之高校学生信息快速查询系统的实现
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…...
