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

相关推荐
&岁月不待人&1 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove4 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道12 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒16 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
撞南墙者22 分钟前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
binishuaio25 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE27 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻31 分钟前
WPF中的依赖属性
开发语言·wpf
洋24039 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙41 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel