当前位置: 首页 > article >正文

OpenCV 图像透视变换详解

在计算机视觉领域,图像的视角问题常常会影响后续的分析与处理。例如,从倾斜角度拍摄的文档、带有畸变的场景图像等,都需要通过特定的方法进行矫正。OpenCV 作为计算机视觉领域的重要库,提供了强大的图像透视变换功能,能够帮助我们轻松解决这类问题。本文将深入讲解 OpenCV 图像透视变换的原理、实现方法,并结合实际案例进行演示。

一、透视变换原理

透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

在二维图像中,透视变换可以将一个四边形区域映射到另一个任意四边形区域,无论后者是否是矩形。透视变换可以用一个 3×3 的矩阵来表示,称为透视变换矩阵(Perspective Transformation Matrix)。该矩阵包含 8 个自由度,即需要 8 个方程来求解。一般通过在原图像和目标图像上选取 4 个对应点(这 4 个点在原图像和目标图像中不能共线),就可以计算出透视变换矩阵。

透视变换的数学表达式为:

\( \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \)

其中,\((x, y)\) 是原图像中的点坐标,\((x', y')\) 是变换后图像中的点坐标。变换后的坐标 \((x', y')\) 需要通过除以变换后齐次坐标的第三个分量 \(a_{31}x + a_{32}y + a_{33}\) 来得到实际的二维坐标:

\( x' = \frac{a_{11}x + a_{12}y + a_{13}}{a_{31}x + a_{32}y + a_{33}} \)

\( y' = \frac{a_{21}x + a_{22}y + a_{23}}{a_{31}x + a_{32}y + a_{33}} \)

二、OpenCV 实现透视变换

在 OpenCV 中,实现透视变换主要通过 cv2.getPerspectiveTransform 和 cv2.warpPerspective 这两个函数来完成。

1. cv2.getPerspectiveTransform 函数

cv2.getPerspectiveTransform 函数用于计算透视变换矩阵。其函数原型如下:

cv2.getPerspectiveTransform(src, dst)
  • src:原图像中四边形顶点的坐标,数据类型为 numpy.array,形状为 (4, 2)。
  • dst:目标图像中对应四边形顶点的坐标,数据类型为 numpy.array,形状为 (4, 2)。
  • 返回值:计算得到的 3×3 透视变换矩阵。

2. cv2.warpPerspective 函数

cv2.warpPerspective 函数用于对图像进行透视变换。其函数原型如下:

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  • src:输入的原图像。
  • M:由 cv2.getPerspectiveTransform 函数计算得到的透视变换矩阵。
  • dsize:输出图像的大小,格式为 (width, height)。
  • dst(可选):输出图像,如果不指定,则会自动创建一个与 dsize 大小相同的图像。
  • flags(可选):插值方法,默认值为 cv2.INTER_LINEAR。
  • borderMode(可选):边界像素模式,默认值为 cv2.BORDER_CONSTANT。
  • borderValue(可选):边界填充值,默认值为 0。
  • 返回值:经过透视变换后的图像。

3. 代码示例

下面通过一个示例,演示如何使用 OpenCV 对一张倾斜的银行卡图像进行透视变换,将其矫正为正面视角。

import cv2import numpy as np# 读取图像image = cv2.imread('bank_card.jpg')# 定义原图像中银行卡的四个顶点坐标src_points = np.float32([[111, 219], [287, 188], [37, 616], [253, 628]])# 定义目标图像中对应的四个顶点坐标(假设目标图像为矩形)dst_points = np.float32([[0, 0], [300, 0], [0, 400], [300, 400]])# 计算透视变换矩阵M = cv2.getPerspectiveTransform(src_points, dst_points)# 进行透视变换warped_image = cv2.warpPerspective(image, M, (300, 400))# 显示原图像和变换后的图像cv2.imshow('Original Image', image)cv2.imshow('Warped Image', warped_image)cv2.waitKey(0)cv2.destroyAllWindows()

在上述代码中,首先读取银行卡图像,然后手动指定原图像中银行卡四个顶点的坐标,以及目标图像中对应的四个顶点坐标(这里将目标图像设定为一个固定大小的矩形)。接着通过 cv2.getPerspectiveTransform 函数计算透视变换矩阵,最后使用 cv2.warpPerspective 函数对图像进行透视变换,并显示结果。

三、应用场景

  1. 文档扫描:当我们拍摄纸质文档时,由于拍摄角度问题,文档图像可能会出现倾斜或畸变。通过透视变换,可以将文档图像矫正为正面视角,使其更便于后续的文字识别(OCR)等处理。
  1. 图像拼接:在全景图像拼接过程中,不同视角的图像可能存在透视差异。利用透视变换可以将这些图像变换到同一平面,从而实现无缝拼接。
  1. 目标检测与跟踪:在一些复杂场景中,目标可能会因视角变化而产生形状变形。通过透视变换将目标变换到标准视角,有助于提高目标检测和跟踪的准确性。

四、总结

OpenCV 的图像透视变换功能为我们处理图像视角问题提供了高效的解决方案。通过理解透视变换的原理,掌握 cv2.getPerspectiveTransform 和 cv2.warpPerspective 函数的使用方法,我们可以在实际项目中灵活运用这一技术,解决各种图像视角相关的问题。

希望本文对你理解和使用 OpenCV 图像透视变换有所帮助。如果你在实践过程中遇到任何问题,欢迎在评论区留言交流!

上述博客涵盖了原理、代码与应用,希望能帮你掌握 OpenCV 图像透视变换。若你想调整案例、补充内容,欢迎随时告诉我。

相关文章:

OpenCV 图像透视变换详解

在计算机视觉领域,图像的视角问题常常会影响后续的分析与处理。例如,从倾斜角度拍摄的文档、带有畸变的场景图像等,都需要通过特定的方法进行矫正。OpenCV 作为计算机视觉领域的重要库,提供了强大的图像透视变换功能,能…...

AI日报 - 2024年5月16日

🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | OpenAI推出GPT-4.1及mini版,专为编码优化;Google DeepMind发布AlphaEvolve,Gemini驱动算法发现。 GPT-4.1提升编码效率与指令遵循,AlphaEvolve在矩阵乘法、数学问…...

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库(通用稳定版仓库) codename$(…...

Python requests GET 报错:ChunkedEncodingError

问题 在实际项目中遇到的这样一个问题:通过Python GET从服务器请求url列表,因为是公司内部数据,知道大概多少条数据,所以直接一次请求500条。平稳运行了一段时间之后,突然某天这个GET请求报错了… response request…...

RabbitMQ是什么?应用场景有哪些?

RabbitMQ 是一款开源的消息代理中间件,基于 AMQP(高级消息队列协议)实现,用于在分布式系统中进行异步通信和消息传递。它通过将消息的发送者和接收者解耦,提高了系统的可扩展性、可靠性和灵活性。 核心特点 多协议支持:不仅支持 AMQP,还兼容 STOMP、MQTT 等多种消息协议…...

打造智能化军工软件工厂,破解版本管理难题

在数字化浪潮席卷全球的当下,军工行业正经历着前所未有的软件工业化转型。作为这一进程的核心支撑,软件工厂模式正在重塑军工领域的研发体系。然而,传统版本管理方式已难以适应现代军工软件研发的复杂需求,成为制约行业发展的关键…...

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景,我们分配了以下服务器资源: 10.1.9.98:充当客户端10.0.3.137:一级代理10.0.4.105:二级代理10.0.4.129:三级代理10.0.4.120:服务器端 各级代理配置 以下是各级代理的基本配…...

allure报告自定义logo和名称

根据pytest框架,做自动化测试的时候,选择的是allure测试报告,这个报告是目前所有报告中功能最强大最好用的测试报告之一 我们在使用这个测试报告的时候,怎么样去把allure的logo和名称替换成自己公司或者自己的logo呢?…...

鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp

UniApp 实现的地图定位与导航功能 随着移动互联网的发展,地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能,并探讨如何适配鸿蒙系统,助力开发者打造更加流畅的地图体验。 前言 最近在做一…...

【AI论文】对抗性后期训练快速文本到音频生成

摘要:文本到音频系统虽然性能不断提高,但在推理时速度很慢,因此对于许多创意应用来说,它们的延迟是不切实际的。 我们提出了对抗相对对比(ARC)后训练,这是第一个不基于蒸馏的扩散/流模型的对抗加…...

Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)

PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项,使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖: // pdfimplementation("com.github.bar…...

Linux 软件包|服务管理

rpm 指令备注rpm -qa查看已安装软件,可以结合grep过滤查找rpm -e firefox卸载firefoxrpm -ivh firefox-115.12.0-1.el7.centos.i686.rpm安装gcc(只能离线安装) yum 能够从指定的服务器自动下载 RPM 包并且安装 指令备注yum list列出所有可…...

测试工程师如何学会Kubernetes(k8s)容器知识

Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…...

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1542 标注数量(xml文件个数):1542 标注数量(txt文件个数):1542 …...

每日Prompt:迷你 3D 建筑

提示词 3D Q版迷你风格,一个充满奇趣的迷你星巴克咖啡馆,外观就像一个巨大的外带咖啡杯,还有盖子和吸管。建筑共两层,大大的玻璃窗清晰地展示出内部温馨而精致的设计:木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…...

解决 Sarspace 处理陆探一号辐射定标地理编码出现条纹问题:DEM 下载篇

在使用 Sarspace 处理陆探一号辐射定标地理编码时,结果出现条纹现象,经排查确定是 DEM(数字高程模型)下载存在问题。以下为利用自动下载功能解决该问题的过程。 问题排查 陆探一号数据处理中,条纹现象的出现往往与多种…...

el-breadcrumb 面包屑第一项后面怎么写没有分隔符

<el-breadcrumb separator"/"><el-breadcrumb-item>当前位置&#xff1a;</el-breadcrumb-item><el-breadcrumb-item :to"{ path: / }">首页</el-breadcrumb-item><el-breadcrumb-item><a href"/">活…...

Free2AI解锁教育新可能:LLM+RAG 技术驱动智能学习的关键路径

一、引言​ 在科技飞速发展的当下,人工智能技术正深刻地改变着各个领域,教育领域也不例外。大型语言模型(LLM)和检索增强生成(RAG)技术的兴起,为教育与智能学习带来了前所未有的机遇。LLM 凭借其强大的语言理解和生成能力,能够与用户进行自然流畅的对话,仿佛一位知识…...

MYSQL 高可用

目录 一 什么是MYSQL高可用 1.1 什么是MySQL高可用 1.2方案组成 1.3 优势 2.1 案例环境 二 案例实施 1.安装mysql数据库 &#xff08;1 基础环境 &#xff08;2二进制安装进行bash (3 设置配置文件 MYSQL 的配置文件跟上面编译安装的配置文件类似 &#xff08;4. 配…...

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战

目录 1 背景介绍 2 CDC的实现原理 3 DRS的CDC实现方式 4 DRS的CDC使用介绍 5 总结 1 背景介绍 随着国内各大行业数字化转型的加速&#xff0c;客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时&#xff0c;华为云通常会创建…...

HoloTime:从一张图片生成可交互的4D虚拟世界——突破静态生成模型,重构VR/AR内容生产范式

引言:静态生成模型的局限与HoloTime的突破 在空间智能与虚拟内容生成领域,传统生成模型(如扩散模型)面临两大瓶颈: 静态输出:仅能生成固定视角的3D场景或局部物体动画。沉浸感缺失:无法构建用户可“走进去”的动态4D空间(时间+空间)。HoloTime 通过“图像→全景视频→…...

【Python CGI编程】

Python CGI&#xff08;通用网关接口&#xff09;编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南&#xff0c;包含核心概念、实现步骤及安全实践&#xff1a; 一、CGI 基础概念 1. 工作原理 浏览器请求 → Web服务器&#xff08;如Apache&#xff09; → 执行…...

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式&#xff08;HH:mm:ss 或 HH:mm&#xff09;与十进制小时&#xff08;如 17.5&#xff09;的相互转换。两个函数分别处理时间字符串到十进制小时&#xff0c;以及十进制小时到时间字符串的转换&#xff0c;支持灵活的输入和输出格式。这…...

【深度学习】#11 优化算法

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…...

《数字藏品APP开发:解锁高效用户身份认证与KYC流程》

开发一款数字藏品APP&#xff0c;要面对诸多复杂且关键的环节&#xff0c;其中&#xff0c;实现高效的用户身份认证与KYC&#xff08;了解你的客户&#xff09;流程&#xff0c;无疑是重中之重。这不仅关乎用户资产安全与平台合规运营&#xff0c;更是构建用户信任、保障平台可…...

ros2中自定义的package查不到?

在ros2中自定义的package功能包&#xff0c;使用命令&#xff1a;ros2 pkg list无法查找到自己的功能包&#xff1f; 首先&#xff0c;利用ros2 pkg create命令创建好功能包之后要利用colcon build命令进行编译&#xff0c;编译成功之后&#xff0c;在当前路径需要运行命令&am…...

根据台账批量制作个人表

1. 前期材料准备 1&#xff09;要有 人员总的信息台账 2&#xff09;要有 个人明白卡模板 2. 开始操作 1&#xff09;打开 人员总的信息台账&#xff0c;选择所需要的数据模块&#xff1b; 2&#xff09;点击插入&#xff0c;选择数据透视表&#xff0c;按流程操作&…...

LocaleContextResolver实现多语言切换-笔记

1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale&#xff08;语言环境&#xff09; 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…...

Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系

从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭,代码耦合得跟一团麻线似的,改个小功能都能牵一发而动全身;也可能有些团队在协作时,经常因为代码冲突或者职责不清搞得焦头烂额。相信我,这些问题我都经历过,真的能把人逼疯!所以,咱得找个更好的方式…...

Zephyr OS Nordic芯片的Flash 操作

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…...