opencv图像透视处理

embedded/2024/9/19 17:20:33/ 标签: 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.ppmy.cn/embedded/111735.html

相关文章

linux安装redis、使用redis、用springboot连接redis

安装redis 解压redis的tar包 tar -vsxf 包名 解压完之后进入解压过的tar包里 编译 make 安装和安装的位置 make PREFIX/opt/redis/redisserver install 成功后进入安装的位置 cd /opt/redis/redisserver/ 进入bin cd bin 找到redis-server,运行 ./redis-…

如何在Flask中实现API

在Flask中实现API是一个相对直接且灵活的过程,它允许你快速构建RESTful(Representational State Transfer)风格的Web服务。由于篇幅限制,我无法提供完整的5000字详细指南,但我可以概述关键步骤和最佳实践,帮…

electron-vite vue3离线使用monaco-editor

目录 1.搭建一个 electron-vite 项目 2.安装monaco-editor和vite-plugin-monaco-editor 3.electron.vite.config.mjs配置 4.创建 worker.js并在main.js 引入 5.创建组件 MonacoVite.vue 组件 6. App.vue中引入组件 7.运行测试 1.搭建一个 electron-vite 项目 pnpm creat…

011复杂度06斐波那契数复杂度

视频地址:011复杂度06斐波那契数复杂度_哔哩哔哩_bilibili 菲波纳粹数列的一个方法,一个是这个,一个是这个,一个是递归版本,一个是非递归版本,我们来估算一下它们的复杂度啊,首先我们先算一下这个那这个复…

记录近期iOS开发几个报错及解决方案

记录近期iOS开发几个报错~ 1、报错:SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a’; try increasing the minimum …

几何概率模型

一、几何概率模型 ① 样本空间的样本点为无限个 ② 每个样本点发生的可能性是均等的 ③ P(A)事件A的几何度量值/样本空间的几何度量值 说明:如果样本空间的样本点为有限个,则为古典概型 通过2个例子,来感受下两者的区别 ① 例&#xff1…

心觉:以终为始,帮你精准实现目标

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作169/1000天 假设你的目标是 一年内赚到150万。我们可以通过“以终为始”和“以始为终”的结合来帮助你实现这个目标 以下是完整的…

[论文笔记]ChatQA: Surpassing GPT-4 on Conversational QA and RAG

引言 今天来看一下上篇论文笔记中反复介绍的 ChatQA: Surpassing GPT-4 on Conversational QA and RAG。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 我们介绍了 ChatQA,这是一个模型套件,一…

Java集合接口List

ArrrayList集合 底层数据结构是数组 构造方法 ArrayList()无参构造,构造一个初始容量为10的空列表 ArrayList(int initialCapacity) 构建具有指定初始容量的空列表 ArrayList并不是一new就会创建初始容量为10的空列表,而是调用add方法后创建 A…

架构设计 - 常用日志收集方案选型对比与推荐

目录 1. 常用组合1.1 ELK Stack -> Elastic Stack1.2 EFK Stack1.3 Graylog1.4 PLG 日志系统1.5 Splunk1.6 Filebeat ELK1.7 AWS CloudWatch Logs1.8 阿里云日志服务1.9 腾讯云 CLS(日志服务) 2. 推荐 日志收集是系统监控和调试中的关键环节。常见的…

二维码的原理以及Java生成二维码【中间带图片】

一、什么是二维码: 二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上) 分布的黑白相间的图形记录数据符号信息的。 二、常用的码制 Data Matrix, Maxi Code, Aztec,…

linux命令用于删除文本文件中的重复行的命令uniq详解

目录 一、概述 二、基本用法 1、uniq 命令的基本语法 2、常用选项 3、获取帮助 三、主要功能 1. 识别并删除相邻重复行 2. 保留重复行的第一个实例 3. 统计重复次数 4. 忽略指定列的比较 四、示例 1. 删除相邻重复行 2. 显示每一行及其重复次数 3. 只显示重复行 4. …

yolov8 rect batch_shapes 672 图像大小变化

遇到这样一种情况:img_sz640,但在val时,输入网络的张量h和w是672 为什么输入图像会从640变大到672? 这是因为一种rectangle增强方法,“同个batch里做rectangle宽高等比变换, 加快训练 ,对于多余的黑边做到…

亚马逊IP关联及其解决方案

在电子商务领域,亚马逊作为全球领先的在线购物平台,吸引了众多商家和个人的参与。然而,随着业务规模的扩大,商家在使用亚马逊服务时可能会遇到IP关联的问题,这不仅影响账户的正常运营,还可能带来一系列不利…

解决idea git比对 contents have differences only in line separators

问题 使用git比对文件时,提示contents have differences only in line separators 解决 rm .git/index git reset

kafka之视频和图片文件

在 Kafka 中存储视频或图片的格式通常取决于应用场景和传输的需求。Kafka 是一种分布式的流处理平台,设计用来处理事件流或消息流,因此在存储和传输视频或图片时,必须将这些二进制数据序列化为合适的格式。以下是视频和图片在 Kafka 中常见的…

Rocky Linux9下安装Docker和卸载Docker

前提条件 安装好Rocky Linux9,可参考 Vmware下安装Rocky Linux9.4 安装Docker 精简版命令 yum install -y yum-utilsyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-cemkdir -p /etc/do…

数据库设计中的需求分析

在数据库设计中,需求分析 是至关重要的一步。它不仅是设计过程的起点,也是后续步骤的基础。如果需求分析出现问题,那么后续所有设计阶段的结果都会受到影响,最终可能导致整个设计返工,耗费大量时间和资源。因此&#x…

教育培训小程序开发,简单实用的入门指南

教育培训小程序可以帮助教育机构和个人老师提供更灵活的在线教学服务,满足学生的学习需求。对于初学者来说,开发一个功能齐全的教育培训小程序并不复杂,只需掌握一些基础的开发知识和工具即可。本文将带你了解如何使用微信小程序开发工具&…

在云服务器上安装 RabbitMQ:从零到一的最佳实践

🛠 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理中间件,广泛应用于高并发、异步任务队列的场景中。在分布式系统架构中,RabbitMQ 可以充当消息的中转站,帮助不同服务之间进行高效的消息通信。 在这篇文章中,我们…