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

相关推荐
攻城狮7号7 分钟前
Python爬虫第7节-requests库的高级用法
python·python爬虫
闭月之泪舞17 分钟前
OpenCv高阶(二)——图像的掩膜
人工智能·opencv·计算机视觉
阿里云云原生19 分钟前
Python3 AI 通义灵码 VSCode插件安装与功能详解
后端·python·visual studio code
快乐的木子李26 分钟前
Java spring mybatis面试题(200道),八股文
java·开发语言·spring·mybatis
q5673152326 分钟前
使用Pholcus编写Go爬虫示例
开发语言·爬虫·golang
martian66541 分钟前
Spring Boot开发三板斧:高效构建企业级应用的核心技法
java·开发语言
winnower-sliff1 小时前
Django学习记录-1
python·学习·django
bjxiaxueliang1 小时前
一文详解OpenCV环境搭建:Windows使用CLion配置OpenCV开发环境
人工智能·windows·opencv
cherry52301 小时前
【Java设计模式】第1章 课程导学
java·开发语言·设计模式
wuxiguala1 小时前
【java图形化界面编程】
java·开发语言·python