opencv图像透视处理

引言

在图像处理与计算机视觉领域,透视变换(Perspective Transformation)是一种重要的图像校正技术,它允许我们根据图像中已知的四个点(通常是矩形的四个角)和目标位置的四个点,将图像从一个视角映射到另一个视角。这种技术广泛应用于文档扫描、增强现实、图像拼接以及许多其他领域。本文将通过OpenCV这一强大的图像处理库,介绍如何执行图像的透视变换。

目录

引言

OpenCV简介

透视变换的基础

公式

OpenCV中的透视变换

步骤

结论


OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它包含了大量的图像处理函数和算法,可以运行在多种操作系统上,具有高效的性能和广泛的应用。

透视变换的基础

透视变换可以通过一个3x3的变换矩阵(也称为透视变换矩阵)来实现。这个矩阵定义了源图像和目标图像之间的映射关系。为了计算这个矩阵,我们需要知道源图像和目标图像中对应点的坐标。

公式

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

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

其中,(x,y) 是源图像中的点,(x′,y′) 是变换后图像中的对应点。w′ 是一个用于归一化的因子(通常不需要直接使用,但在计算时很有用)。

OpenCV中的透视变换

在OpenCV中,cv2.getPerspectiveTransform() 函数用于计算透视变换矩阵,而 cv2.warpPerspective() 函数则用于应用这个矩阵到图像上。

步骤

  1. 确定源点和目标点:首先,你需要从源图像中选取四个点(通常是矩形的四个角),并确定这四个点在目标图像中的位置。

  2. 计算透视变换矩阵:使用 cv2.getPerspectiveTransform(src, dst) 来计算透视变换矩阵,其中 src 是源点坐标(形式为 (x, y) 的列表的列表),dst 是目标点坐标。

  3. 应用透视变换:使用 cv2.warpPerspective(src_img, M, (width, height)) 将变换矩阵 M 应用到源图像 src_img 上,width 和 height 是目标图像的宽度和高度。

代码示例

import cv2  
import numpy as np  # 读取图像  
img = cv2.imread('source_image.jpg')  # 定义源点和目标点  
pts_src = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])  
pts_dst = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])  # 计算透视变换矩阵  
M = cv2.getPerspectiveTransform(pts_src, pts_dst)  # 应用透视变换  
height, width = img.shape[:2]  
warped_img = cv2.warpPerspective(img, M, (width, height))  # 显示结果  
cv2.imshow('Warped Image', warped_img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

代码实例

import cv2
import numpy as npdef order_points(pts):"""根据点的位置对它们进行排序,以便左上角、右上角、右下角、左下角的顺序。这里使用简单的排序逻辑,可能需要根据实际情况调整。"""rect = np.zeros((4, 2), dtype="float32")# 按x坐标排序,然后按y坐标排序(如果需要)s = pts.sum(axis=1)rect[0] = pts[np.argmin(s)]rect[2] = pts[np.argmax(s)]# 计算x坐标的差值diff = np.diff(pts, axis=1)rect[1] = pts[np.argmin(diff)]rect[3] = pts[np.argmax(diff)]return rectdef four_point_transform(image, pts):"""对图像进行透视变换。:param image: 输入图像:param pts: 源图像中的四个点(矩形的四个角),格式为[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]:return: 变换后的图像"""rect = order_points(pts)(tl, tr, br, bl) = rect# 计算目标矩形的宽度widthA = np.linalg.norm(br - bl)widthB = np.linalg.norm(tr - tl)maxWidth = max(int(widthA), int(widthB))# 计算目标矩形的高度heightA = np.linalg.norm(tr - br)heightB = np.linalg.norm(tl - bl)maxHeight = max(int(heightA), int(heightB))# 目标点dst = np.array([[0, 0],[maxWidth - 1, 0],[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype="float32")# 计算透视变换矩阵并应用它M = cv2.getPerspectiveTransform(rect, dst)warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))# 返回变换后的图像return warped# 读取图像
image = cv2.imread('bea.jpg')
if image is None:print("Error: Unable to load image.")
else:# 假设我们手动选取了文档的四个角点(这里用示例坐标代替)pts = np.array([[56, 65], [368, 52], [28, 387], [389, 390]], dtype="float32")# 进行透视变换warped_image = four_point_transform(image, pts)# 显示结果cv2.imshow('Original Image', image)cv2.imshow('Warped Image', warped_image)cv2.waitKey(0)cv2.destroyAllWindows()

结果:

结论

通过本文,我们学习了如何使用OpenCV进行图像的透视变换。从理论基础到实践代码,我们逐步了解了透视变换的整个过程。这项技术不仅可以用于图像校正,还可以为许多其他应用提供强大的支持。希望本文能为你处理图像透视变换提供有力的帮助。

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

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

相关文章

【鸿蒙开发从0到1 day09】

鸿蒙开发基础-ArkUI基本布局 一 .设计资源-图标库1.阿里矢量图图标库2.HarmonyOS图标库 二.布局属性1.内边距2.外边距3.边框线4.边框圆角 三.背景属性1.背景颜色2.背景图片(1)背景图的缩放(2)背景图的显示位置 四.颜色渐变1.线性渐变2.径向渐变 五.阴影六.可选择链操作符(?)七…

如何更改磁盘卷标名称?

磁盘卷标(Volume Label)是用来标识和管理磁盘驱动器的名称,通常在文件资源管理器中显示。卷标有助于用户快速识别和区分不同的磁盘或分区。 为什么要更改磁盘卷标名称? 磁盘卷标作为磁盘的名字,可以帮助用户更容易地识…

通过C# 裁剪PDF页面

在处理PDF文档时,有时需要精确地裁剪页面以适应特定需求,比如去除广告、背景信息或者仅仅是为了简化文档内容。 本文将指导如何使用免费.NET控件通过C#实现裁剪PDF页面。 免费库 Free Spire.PDF for .NET 支持在 .NET (C#, VB.NET, ASP.NET, .NET Core)…

【特点】浅谈大模型的特点

在人工智能(AI)的发展历程中,大模型无疑是一个重要的里程碑。大模型是指利用海量数据,通过先进的算法和技术,训练得到的具有强大预测和决策能力的模型,这类模型具备了强大的语言理解和生成能力,能够完成各种复杂的自然…

GORM事务:确保数据一致性的利器

在现代软件开发中,数据库事务是确保数据一致性和完整性的关键技术。GORM,作为Go语言中一个流行的ORM库,提供了强大的事务管理功能。本文将深入探讨GORM的事务管理机制,包括如何使用事务、嵌套事务、手动事务控制以及保存点的使用。…

搬运5款冷门但值得下载的PC软件

​ 分享5款冷门但值得下载的Windows软件,个个都很实用,你可能一个都没见过,但是我觉得你用过之后可能就再也离不开了。 1. 图片管理——Picasa ​ Picasa 是一款由谷歌开发的图片管理和编辑软件,能够帮助用户轻松地组织、编辑和…

自动生成表单及表格界面

根据后端数据,自动生成表单及表格 // 此功能需要与后端协定好接口数据结构const customModuleList [// form表单结构{seq: 1, // 模块唯一标识isTable: N, // 是否为表格customName: form表单,fieldDatas: [{isRequired: true, // 是否必填disabled: false, // …

电子邮件加密软件哪个好用?分享这五款加密工具,防范邮件泄密!2024企业必备!

"密语藏锋刃,安全重于山。" 在数字洪流中,电子邮件是企业沟通的重要桥梁,其安全性不容忽视。 因此,选择一款高效可靠的电子邮件加密软件,是企业保障信息安全的关键。 本文将为您推荐五款2024年企业必备的电…

前端框架有哪些?全面解析主流前端框架

一、React React 是由 Facebook 开发和维护的一个前端框架,它专注于构建用户界面。React 采用组件化的开发模式,允许开发者将用户界面拆分成多个可复用的组件。 主要特点 组件化: React 的核心是组件,它允许开发者将界面拆分成独立的、可复…

解析主子格式的 csv

某 csv 文件不规范,奇数行为主表记录,一行对应一条记录,有 3 个字段 idUniversity、nameOfUniversity、noOfBuses,其中第 3 个字段是冗余的,用来指明偶数行上子表记录的记录数量。偶数行为子表记录,一行有 …

基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的…

Uniapp + Vite + Vue3 + uView + Pinia 实现自定义底部 Tabbar(最新保姆级教程)

Uniapp Vite Vue3 uView Pinia 实现自定义底部 Tabbar(最新保姆级教程) 1、效果展示2、环境准备2.1 新建 uniapp 项目2.2. 安装 uView2.3 安装 pinia 3. 配置环境4. 创建目录结构5、编写 pages.json 页面路由6、编写 tabbar.js 状态数据7、编写 tabb…

VUE面试题1*

scss是什么? 预处理css,把css当前函数编写,定义变量,嵌套. vue-router有哪几种导航钩子? 三种。 一种是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截。 第二种&a…

软件测试之压力测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

日本IT工作内容---一篇梗概

日本IT工作现场是一个充满活力、技术导向且多元化的工作环境。以下是对日本IT工作内容的详细概述: 1. 软件开发(Software Engineering, SE) 主要任务:编写、测试和维护软件,以满足客户需求。这包括使用多种编程语言和…

Win10下借助CMake编译OpenMVS

笔者在编译OpenMVS的过程十分曲折。刚开始借助CMake编译,能够把与库生成相关的工程编译出来,但是与可执行文件相关的工程会报错;后来参考官方教程借助VCPKG编译,发现VCPKG并没有想中强大、好用,最终也是遇到了各种问题没有编译成功。但是,笔者在解决问题的过程发现了问题…

linux中vim介绍以及常用命令大全

前言 在Linux系统中,Vim是一个功能强大的文本编辑器,它广泛应用于服务器管理、脚本编写和程序开发中。Vim拥有两种模式:命令模式和插入模式。了解和掌握常用的Vim命令对于提高文本编辑效率至关重要。本文将详细介绍Vim的常用命令&#xff0c…

HCIP--<OSPF2>

目录 一,OSPF的不规则区域 1)远离骨干区域的非骨干区域 2)不连续骨干区域(和上面一样) 二,OSPF数据库表 三。优化OSPF的LSA(缺少LSA的更新量) [1]手工汇总:减少骨干区域的LSA [2]特殊区域&…

编程新纪元:AI如何成为你的编程伙伴

随着人工智能技术的不断进步,我们正步入一个编程的新纪元。在这个时代,AI不仅仅是一个工具,更是程序员的伙伴。它通过提供智能辅助、自动化编码和增强开发效率,正在改变我们编写和理解代码的方式。本文将探讨AI如何成为程序员的得…

【关爱多系统萎缩患者】必知!这些维生素是健康守护神

亲爱的朋友们,今天我们来聊聊一个需要更多社会关爱与理解的群体——多系统萎缩(MSA)患者。面对这一复杂而罕见的疾病,科学合理的饮食调整,尤其是维生素的补充,显得尤为重要。让我们一起成为他们健康路上的温…