OpenCv高阶(六)——图像的透视变换

news2025/4/21 18:18:33

目录

一、透视变换的定义与作用

二、透视变换的过程

三、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.coloradmin.cn/o/2339597.html

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

相关文章

性能比拼: Go vs Bun

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 我对 Bun 在之前的基准测试中的出色表现感到惊讶,因此我决定将它与 Go …

定制化 Docsify 文档框架实战分享

🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…

鸿蒙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的开源工具,它专注于将多种形式的内容智能转换成…

Python 深度学习实战 第11章 自然语言处理(NLP)实例

Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…

将 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(脚手架)③.创建项目&#xff08…

嵌入式C语言位操作的几种常见用法

作为一名老单片机工程师,我承认,当年刚入行的时候,最怕的就是看那些密密麻麻的寄存器定义,以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器,硬件就是不听话”的情况,简直想把示波器砸了&am…

基于Djiango实现中药材数据分析与可视化系统

中药材数据分析与可视化系统 项目截图 登录 注册 首页 药材Top20 药材价格 产地占比 历史价格 新闻资讯 后台管理 一、项目概述 中药材数据分析与可视化系统是一个基于Django框架开发的专业Web应用,致力于对各类中药材数据进行全面、系统的采集、分析和可视化展示…

stm32(gpio的四种输出)

其实GPIO这个片上外设的功能: 用于控制IO引脚。 CPU就如同大脑,而这些片上外设就如同四肢一样的关系 如图 —————————————————————————————— OK类比了以上 其实GPIO是有 八种工作模式的 这八种工作模式 因为GPIO是面向IO…

Zookeeper 可观测性最佳实践

Zookeeper 介绍 ZooKeeper 是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群管理等。本文介绍通过 DataKit 采集 Zookeeper 指标&#…

微信小程序三种裁剪动画有效果图

效果图 .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语言笔记(鹏哥)上课板书+课件汇总(结构体)-----数据结构常用

结构体 目录&#xff1a; 1、结构体类型声明 2、结构体变量的创建和初始化 3、结构体成员访问操作符 4、结构体内存对齐*****&#xff08;重要指数五颗星&#xff09; 5、结构体传参 6、结构体实现位段 一、结构体类型声明 其实在指针中我们已经讲解了一些结构体内容了&…

git清理--解决.git文件过大问题

背景&#xff1a;为什么.git比我仓库中的文件大很多 为什么我的git中只有一个1KB的README&#xff0c;但是.git却又1G多&#xff1f;当我想把这个git库push到gitee时&#xff0c;还会报错&#xff1a; 根据报错信息&#xff0c;可看出失败的原因是&#xff1a;有文件的大小超过…

Jetson Orin NX 部署YOLOv12笔记

步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意&#xff1a;YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…

微服务2--服务治理与服务调用

前言 &#xff1a;本文主要阐述微服务架构中的服务治理&#xff0c;以及Nacos环境搭建、服务注册、服务调用&#xff0c;负载均衡以及Feign实现服务调用。 服务治理 服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。 服务注册&#xff1a;在…

C语言之高校学生信息快速查询系统的实现

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…

Spring Boot 项目中发布流式接口支持实时数据向客户端推送

1、pom依赖添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>2、事例代码 package com.pojo.prj.controller;import com.pojo.common.core.utils.String…