在计算机视觉和图像处理领域,透视变换是一个强大的工具。它允许我们改变图像的视角以获得新的视点,通常用于校正扭曲或模拟不同的相机角度。本文将探讨一个 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 在处理图像方面的强大功能。通过理解和使用透视变换,您可以显着增强图像处理能力,无论是校正扭曲、提高视觉美感还是为机器学习任务准备图像。