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

相关推荐
弱冠少年16 分钟前
websockets库使用(基于Python)
开发语言·python·numpy
长天一色16 分钟前
C语言日志类库 zlog 使用指南(第五章 配置文件)
c语言·开发语言
一般清意味……28 分钟前
快速上手C语言【上】(非常详细!!!)
c语言·开发语言
卑微求AC29 分钟前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
技术无疆39 分钟前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
羊小猪~~1 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
qq_273900231 小时前
解析TMalign文本文件中的转换矩阵
python·生物信息学
Манго нектар1 小时前
JavaScript for循环语句
开发语言·前端·javascript