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

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

理解脚本

加载图像:

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

设置源点和目标点:

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

**计算透视变换矩阵:cv2.getPerspectiveTransform**脚本

使用该函数计算变换矩阵。该矩阵就像一组指令,用于将每个像素从其原始位置移动到新位置。

应用变换:

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

调整图像大小:

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

显示和保存图像:

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

详细代码:

python 复制代码
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 在处理图像方面的强大功能。通过理解和使用透视变换,您可以显着增强图像处理能力,无论是校正扭曲、提高视觉美感还是为机器学习任务准备图像。

相关推荐
花酒锄作田10 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪14 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽14 小时前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战15 小时前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋20 小时前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者2 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者2 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh2 天前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅2 天前
Python函数入门详解(定义+调用+参数)
python
曲幽2 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama