在 Python 中使用 OpenCV 通过透视校正转换图像

在这里插入图片描述

在计算机视觉和图像处理领域,透视变换是一个强大的工具。它允许我们改变图像的视角以获得新的视点,通常用于校正扭曲或模拟不同的相机角度。本文将探讨一个 Python 脚本,该脚本使用计算机视觉领域流行的 OpenCV 库对图像执行透视变换。我们将详细介绍该脚本的工作原理以及如何将其用于图像处理任务。

理解脚本

加载图像:
脚本首先使用 OpenCV 的函数加载图像**cv2.imread**。它检查图像是否正确加载,以避免后续步骤中出现错误。
在这里插入图片描述

设置源点和目标点:
该脚本定义两组点 - 源 ( src_points) 和目标 ( dst_points)。源点是原始图像上的坐标,而目标点是这些点在变换图像中应位于的位置。这类似于在地图上标记点,然后决定它们在新地图上的位置。

**计算透视变换矩阵:cv2.getPerspectiveTransform**脚本
使用该函数计算变换矩阵。该矩阵就像一组指令,用于将每个像素从其原始位置移动到新位置。

应用变换:
然后,脚本使用 将此矩阵应用于原始图像**cv2.warpPerspective**。这一步是实际变换发生的地方,根据定义的点重塑图像。

调整图像大小:
转换后,脚本将图像大小调整为其原始尺寸。这类似于调整相机的缩放级别以更好地查看变换后的图像。

显示和保存图像:
最后,脚本在窗口中显示转换后的图像并将其保存为新文件。这使您可以直观地验证转换并保留结果以供进一步使用。
在这里插入图片描述

详细代码:

import cv2
import numpy as np# Load the image
image = cv2.imread(r'192.168.1.41_01_20230919175221813.jpg')
if image is None:print("Error loading image!")exit()height, width, _ = image.shape# Define the 4 corners of the image
src_points = np.array([[799, 222], [1036, 195],  # 第一行[537, 1024], [1228, 992]  # 最后一行
], dtype=np.float32)# Define the corresponding 4 points on the ground in world coordinates
dst_points = np.array([[0, 0],[400, 0],[0, 1680],[400, 1680]
], dtype=np.float32)# Compute the perspective trans matrix
M = cv2.getPerspectiveTransform(src_points, dst_points)# Apply the transformation
transformed_image = cv2.warpPerspective(image, M, (400, 1680))frame =transformed_image# 缩放图像
scale_percent = 100# 缩放到原来的200%
width = int(frame.shape[1] * scale_percent / 100)
height = int(frame.shape[0] * scale_percent / 100)
dim = (width, height)
resized_frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)cv2.imshow("frame", resized_frame)
cv2.waitKey(0)
cv2.destroyAllWindows()#保存为图片
cv2.imwrite('1111111111111.jpg', resized_frame)
print("保存成功")

进一步探索:

为了扩大您的理解,您可以考虑:

  • 尝试不同的源点和目标点集,看看它们如何影响变换后的图像。
  • 探索 OpenCV 中可用的其他图像变换,例如仿射变换。
  • 将此脚本集成到更大的应用程序中,例如用于实时校正相机失真的自动化系统。

该脚本演示了 OpenCV 和 Python 在处理图像方面的强大功能。通过理解和使用透视变换,您可以显着增强图像处理能力,无论是校正扭曲、提高视觉美感还是为机器学习任务准备图像。

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

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

相关文章

01-TiDB概述

分布式关系型数据库 1、支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) :OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)解决方案 2、无限制的水平扩容或者缩容 3、兼容MySQL &#xf…

openresty 安装, nginx与 openresty

openresty VS nginx Nginx 是一款高性能的 Web 服务器和反向代理服务器,具备基础的功能如HTTP服务、负载均衡、反向代理以及动静分离等。它是许多互联网应用的核心组件,因其模块化和可扩展的设计而受到欢迎。1 OpenResty 是基于 Nginx 的 Web 平台&…

nodeJs+express+Vue+MongoDB

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3: SQLite3是一个轻量级的数据库系统,它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库,而不是独立运行的系统服务。适用场景:如小型工具、游戏、本地…

ubuntu20根目录扩容

ubuntu根目录/ 或者 /home文件夹有时出现空间满了的情况,可以用gparted工具进行空间的重新分配。 首先,如果你是双系统,需要从windows系统下磁盘压缩分配一部分未使用的空间给ubuntu,注意压缩的空间要邻接ubuntu所在盘的位置。 …

力扣刷MySQL-第七弹(详细讲解)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出…

【Flink-1.17-教程】-【五】Flink 中的时间和窗口(2)时间语义

【Flink-1.17-教程】-【五】Flink 中的时间和窗口(2)时间语义 1)Flink 中的时间语义2)时间语义的分类2.1.处理时间(process time)2.2.摄取时间(ingestion time)2.3.事件时间&#xf…

大创项目推荐 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 🔥 优…

Webpack5 基本使用 - 3(完结)

环境区分 可以定义多个配置文件,通过 webpack-merge 合并配置文件。 安装 webpack-merge yarn add webpack-merge公共配置 // webpack.common.js const path require(path) const HtmlWebpackPlugin require(html-webpack-plugin)module.exports {entry: path…

外呼机器人有什么优势?

外呼机器人有什么优势?值得受到大多数电销企业的追捧! 1、电话外呼效率高: 每天可拨打的电话数量是人工的5-10倍,人工一天只能拨打200-300通电话,机器人每天能打3000通电话以上,无须休息,按照…

Java-NIO篇章(4)——Reactor反应器模式

前面已经讲过了Java-NIO中的三大核心组件Selector、Channel、Buffer,现在组件我们回了,但是如何实现一个超级高并发的socket网络通信程序呢?假设,我们只有一台内存为32G的Intel-i710八核的机器,如何实现同时2万个客户端…

openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案例-too many clients already

文章目录 openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案例-too many clients already206.1 高并发报错“too many clients already”或无法创建线程206.1.1 问题现象206.1.2 原因分析206.1.3 处理办法 openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析,可以改变材料参数,输出平面结构外形,各桁架应力,位移及作用力。可查看节点力,程序已调通,可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)

element-ui 树形控件 通过点击某个节点,遍历获取上级的所有父节点和本身节点

1、需求&#xff1a;点击树形控件的某个节点&#xff0c;需要拿到它上级的所有父节点进行操作 2、代码&#xff1a; 树形控件代码 <el-tree:data"deptOptions"node-click"getVisitCheckedNodes"ref"target_tree_Speech"node-key"id&qu…

prometheus监控RabbitMQ策略

一般用官方的rabbitmq_exporter采取数据即可&#xff0c;然后在普米配置。但如果rabbitmq节点的队列数超过了5000&#xff0c;往往rabbitmq_exporter就会瘫痪&#xff0c;因为rabbitmq_exporter采集的信息太多&#xff0c;尤其是那些队列的细节&#xff0c;所以队列多了&#x…

ubuntu下docker卸载和重新安装

卸载&#xff1a;步骤一&#xff1a;停止Docker服务 首先&#xff0c;我们需要停止正在运行的Docker服务。打开终端&#xff0c;执行以下命令&#xff1a; sudo systemctl stop docker 步骤二&#xff1a;删除Docker安装包 接下来&#xff0c;我们需要删除已经安装的Docker软件…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

[云访谈]熊娟:要把钟煲煲打造成万店级连锁品牌

导读 众所周知&#xff0c;疫情后期餐饮行业的挑战加剧&#xff0c;市场上流传着这样一句话&#xff1a;“餐饮倒闭率达到百分百”。这意味着&#xff0c;在一条街上&#xff0c;可能每个店铺每年都要更换一次老板。 从宏观角度来看&#xff0c;疫情确实对餐饮业造成了重创。…

【服务器GPT+MJ+GPTs】创建部署GPT+MJ+GPTs程序网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建GPT+MJ+GPTs】 🌼1. 给服务器添加端口 🌼2. 安装宝塔 🌼3. 安装Docker 🌼4. 安装ChatGPT程序 🌼5. 程序更新 🌼6. 修改端口 | 密码 🌼7. 绑定域名+申请SSL证书 🌺【前言】 相信大家都对openai的产品ch…

JSON-handle工具安装及使用

目录 介绍下载安装简单操作 介绍 JSON-Handle 是一款非常好用的用于操作json的浏览器插件&#xff0c;对于开发人员和测试人员来说是一款很好用的工具&#xff0c;如果你还没有用过&#xff0c;请赶紧下载安装吧&#xff0c;下面是安装过程和具体使用。 下载安装 点击下载JSON…

Flink:快速掌握批处理数据源的创建方法

Flink 社区最近 “基于FLIP-27” 设计了新的 Source 框架 。一些连接器&#xff08;API&#xff09;已迁移到这个新框架。本文介绍了如何使用这个新框架创建批处理源。 它是在为Cassandra实现Flink 批处理源时构建的。如果您有兴趣贡献或迁移连接器&#xff0c;这篇文章非常适合…