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()

 可以看出我们将一张歪歪扭扭的照片扶正了,那么接下来我们就可以对图片做一些图像处理,使文本信息更加清晰。

关键点说明:

  1. 点的顺序

    • src_points 和 dst_points 中的点必须一一对应,通常按 左上→右上→右下→左下 的顺序排列,确保映射区域正确。

  2. 手动选点

    • 可通过鼠标交互函数(如 cv2.setMouseCallback)手动选择图像中的四个角点,提高灵活性。

  3. 目标图像大小

    • 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)可实现自动化的透视变换,提高鲁棒性和效率。

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

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

相关文章

资源-又在网上淘到金了

前言: 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍: mantissa.xyz,about作者介绍为:Midge “Mantissa” Sinnaeve (米奇辛纳夫)是一位屡获殊荣的艺术家和导演,提供动画、…

Linux疑难杂惑 | 云服务器重装系统后vscode无法远程连接的问题

报错原因:本地的known_hosts文件记录服务器信息与现服务器的信息冲突了,导致连接失败。 解决方法:找到本地的known_hosts文件,把里面的所有东西删除后保存就好了。 该文件的路径可以在报错中寻找:比如我的路径就是&a…

FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)

本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…

【音视频】音视频FLV合成实战

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…

全链路开源数据平台技术选型指南:六大实战工具链解析

在数字化转型加速的背景下,开源技术正重塑数据平台的技术格局。本文深度解析数据平台的全链路架构,精选六款兼具创新性与实用性的开源工具,涵盖数据编排、治理、实时计算、联邦查询等核心场景,为企业构建云原生数据架构提供可落地…

JAVA设计模式——(1)适配器模式

JAVA设计模式——(1)适配器模式 目的理解实现优势 目的 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。 理解 可以想象成一个国标的插头,结果插座是德标的&…

Qt C++ 解析和处理 XML 文件示例

使用 Qt C 解析和处理 XML 文件 以下是使用 Qt C 实现 XML 文件处理的几种方法&#xff0c;包括解析、创建和修改 XML 文件。 1. 使用 QXmlStreamReader (推荐方式) #include <QFile> #include <QXmlStreamReader> #include <QDebug>void parseXmlWithStr…

坐标上海,20~40K的面试强度

继续分享最新的面经&#xff0c;面试的岗位是上海某公司的Golang开发岗&#xff0c;给的薪资范围是20~40K&#xff0c;对mongodb要求熟练掌握&#xff0c;所以面试过程中对于mongodb也问的比较多。 下面是我整理好的面经&#xff08;去除了项目相关的问题&#xff09;&#xf…

B端管理系统:企业运营的智慧大脑,精准指挥

B端管理系统的定义与核心功能 B端管理系统&#xff08;Business Management System&#xff09;是专门设计用于支持企业内部运作和外部业务交互的一套软件工具。它集成了多种功能模块&#xff0c;包括但不限于客户关系管理(CRM)、供应链管理(SCM)、人力资源管理(HRM)以及财务管…

IDE中使用Spring Data Redis

步骤一&#xff1a;导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二&#xff1a;配置Redis数据源 步骤三&…

ARINC818协议的帧格式

SOFi:sof initiale;这个是第一个ADVB帧的SOF开始&#xff0c;一帧只有一个SOFi。 SOFn:sof normal;这个是非首个ADVB帧的SOF头的normal头。 Vsync为场同步&#xff0c;两个SOFi之间为Vsync信号&#xff0c;也就是一帧&#xff0c;也就是VS信号。 Hsync为行同步&#xff0c;如果…

Git核心命令

Git核心命令完全指南&#xff1a;从入门到高效协作 前言 在软件开发领域&#xff0c;Git已成为现代版本控制的代名词。据统计&#xff0c;全球超过90%的开发团队使用Git进行代码管理。然而&#xff0c;许多开发者仅停留在基础命令的机械使用层面&#xff0c;未能真正掌握Git命…

【计算机视觉】CV实战项目- Face-and-Emotion-Recognition 人脸情绪识别

Face-and-Emotion-Recognition 项目详细介绍 项目概述项目功能项目目录结构项目运行方式1. 环境准备2. 数据准备3. 模型训练4. 模型运行 常见问题及解决方法1. **安装依赖问题**2. **数据集问题**3. **模型训练问题**4. **模型运行问题** 项目实战建议项目参考文献 项目概述 F…

java lambda

案例1 lambda表达式看做成一个函数对象 方法引用 1.Math是类型&#xff0c;max是静态方法 2.Student是对象&#xff0c;getName是非静态方法 3.对象&#xff1a;&#xff1a;非静态方法 4.类型&#xff1a;&#xff1a;new关键字 练习1 假设已有对象 常见函数接口 predicate…

并发网路通信-套接字通信

套接字通信就是网络通信 在网络通信时,客户端和服务器的比例是N:1 服务器如何处理多个客户端的请求 并发处理方式 1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理 2.多进程->进程池 3.io多路转接,使用select或者epoch进行处理,使用io转接函数…

AI当前状态:有哪些新技术

一、到目前为址AI领域出现的新技术 到目前为止&#xff0c;AI领域涌现了许多令人兴奋的新技术。以下是一些关键的进展&#xff0c;涵盖了从基础模型到实际应用的多个方面&#xff1a; 1. 更强大的大型语言模型 (LLMs): 性能提升: 新一代LLM&#xff0c;例如OpenAI的GPT-4o和…

AI与IT的共生

AI并非“职业终结者”&#xff0c;而是IT从业者的“认知杠杆”。通过工具化协作、技能升级与伦理治理&#xff0c;人类可释放创造力&#xff0c;探索量子计算、生物启发算法等深水区。未来的IT行业将呈现“AI赋能人类&#xff0c;人类定义AI边界”的共生格局。 一、AI如何改变…

swagger的简介及使用方法

Swagger 是一个用于描述、生成、文档化和测试 RESTful API 的开源工具集。它可以自动生成 API 文档&#xff0c;帮助开发者理解和使用 API。Swagger 由 Swagger.io 提供&#xff0c;并已经发展成了一套广泛应用于 API 设计和文档的标准。 Swagger 项目的历史可以追溯到 2010 年…

解决Flutter 2.10.5在升级Xcode 16后的各种报错

Flutter 环境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 问题一&#xff1a;XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…

Vue + Spring Boot 整合全解析

一、引言 在当今的Web开发领域&#xff0c;前后端分离架构已成为主流。Vue.js作为一款流行的前端框架&#xff0c;以其简洁易用和高效的特点深受开发者喜爱&#xff1b;Spring Boot则是Java后端开发中快速构建应用的利器。将Vue和Spring Boot整合&#xff0c;能够充分发挥两者…