使用OpenCV实现图像的透视变换功能

 更新时间:2024年11月01日 10:25:50   作者:燕鹏01  
在计算机视觉领域,经常需要对图像进行各种几何变换,如旋转、缩放和平移等,本文主要介绍了如何使用OpenCV实现图像的透视变换,需要的可以参考下

概述

在计算机视觉领域,经常需要对图像进行各种几何变换,如旋转、缩放和平移等。其中,透视变换(Perspective Transformation)是一种非常重要的变换方式,它能够模拟三维空间中的视角变化,例如从不同角度观察同一个物体时所看到的不同效果。本文将详细介绍如何使用 OpenCV 库在 Python 中实现图像的透视变换。

环境准备

在开始之前,请确保已经安装了 OpenCV 库。如果没有安装,可以通过以下命令进行安装:

pip install opencv-python

运行效果

示例代码详解

import cv2
import numpy as np

def func():
    """
    读取图像并进行透视变换。
    :return:
    """
    # 读取图像
    img = cv2.imread('./resources/card.jpeg')
    print(type(img))  # 输出图像数据类型
    print(img.shape)  # 输出图像尺寸信息
    
    # 定义目标宽度和高度
    width, height = 300, 200

    # 原始图像上的四个点坐标
    pts1 = np.float32([
        [94, 302],
        [205, 243],
        [152, 369],
        [265, 300]
    ])

    # 目标图像上的四个点坐标
    pts2 = np.float32([
        [0, 0],
        [width, 0],
        [0, height],
        [width, height]
    ])

    # 计算透视变换矩阵
    matrix = cv2.getPerspectiveTransform(pts1, pts2)

    # 应用透视变换
    img_output = cv2.warpPerspective(img, matrix, (width, height))

    # 展示原始图像和变换后的图像
    cv2.imshow('Original Image', img)
    cv2.imshow('Transformed Image', img_output)

    # 等待用户按键后退出
    cv2.waitKey(0)

if __name__ == '__main__':
    func()

代码解析

导入必要的库:

import cv2
import numpy as np

cv2:OpenCV 的 Python 接口。

numpy:用于处理图像数据的数组。

定义函数 func:

def func():
    """
    读取图像并进行透视变换。
    :return:
    """

读取图像:

img = cv2.imread('./resources/card.jpeg')
print(type(img))  # 输出图像数据类型
print(img.shape)  # 输出图像尺寸信息

使用 cv2.imread() 读取图像文件。

print(type(img)) 和 print(img.shape) 分别用于检查图像数据类型和图像尺寸。

定义目标宽度和高度:

width, height = 300, 200

定义图像上的四个点坐标:

pts1 = np.float32([
    [94, 302],
    [205, 243],
    [152, 369],
    [265, 300]
])

pts1 表示在原始图像上的四个点坐标,这些坐标通常代表图像中的某个矩形区域。

定义目标图像上的四个点坐标:

pts2 = np.float32([
    [0, 0],
    [width, 0],
    [0, height],
    [width, height]
])

pts2 表示变换后目标图像上的四个点坐标,这里我们把原来的矩形区域拉伸成了一个矩形。

计算透视变换矩阵:

matrix = cv2.getPerspectiveTransform(pts1, pts2)

使用 cv2.getPerspectiveTransform() 获取从原始图像到目标图像的变换矩阵。

应用透视变换:

img_output = cv2.warpPerspective(img, matrix, (width, height))

使用 cv2.warpPerspective() 应用透视变换,得到变换后的图像。

展示图像:

cv2.imshow('Original Image', img)
cv2.imshow('Transformed Image', img_output)

使用 cv2.imshow() 分别展示原始图像和变换后的图像。

等待用户按键后退出:

cv2.waitKey(0)

cv2.waitKey(0) 使得程序等待用户按键后退出。

获取pts1数据的方式:

手动选取:可以使用图像查看工具(例如Photoshop,GIMP等)打开图像,然后手动测量并记录感兴趣区域的四个角的像素坐标。选取坐标时,确保它们形成一个闭合四边形。

编程自动识别:如果目标区域的边缘特征明显,也可以使用图像处理技术(如边缘检测、角点检测等)自动识别这些角点,以便复用或动态生成pts1的值。

实验和调整:在实际使用中,可能需要经过几次实验和调整,以获取最佳的透视变换效果。

在这段代码中,pts1的具体值:

pts1 = np.float32([
    [94, 302],
    [205, 243],
    [152, 369],
    [265, 300]
])

这些坐标值为示例数据,意味着选择了原图中具体的一块区域的四个点,具体点的位置需要基于图像的内容而定。在实际应用中,你会根据你希望进行变换的区域选择具体的坐标。

总结

本文通过一个具体的代码示例,详细介绍了如何使用 OpenCV 在 Python 中实现图像的透视变换。透视变换是一种强大的工具,可以帮助我们处理图像中的非平行投影,从而在不同的视角下获取一致的图像。希望本文能帮助你在实际项目中更好地应用这一技术。

以上就是使用OpenCV实现图像的透视变换功能的详细内容,更多关于OpenCV图像透视变换的资料请关注脚本之家其它相关文章!

相关文章

  • python 元组的使用方法

    python 元组的使用方法

    这篇文章主要介绍了python 元组的使用方法,文中讲解非常细致,代码帮助大家更好的参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Python预测2020高考分数和录取情况

    Python预测2020高考分数和录取情况

    这篇文章主要介绍了Python预测2020高考分数和录取情况可能是这样,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Django如何实现上传图片功能

    Django如何实现上传图片功能

    这篇文章主要介绍了Django如何实现上传图片功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 详解Python中Pandas read_csv参数使用

    详解Python中Pandas read_csv参数使用

    在使用 Pandas 进行数据分析和处理时,read_csv 是一个非常常用的函数,本文将详细介绍 read_csv 函数的各个参数及其用法,希望对大家有所帮助
    2022-10-10
  • 详解Python解决抓取内容乱码问题(decode和encode解码)

    详解Python解决抓取内容乱码问题(decode和encode解码)

    这篇文章主要介绍了Python解决抓取内容乱码问题(decode和encode解码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Python Numpy中ndarray的常见操作

    Python Numpy中ndarray的常见操作

    这篇文章主要介绍了Python Numpy中ndarray的常见操作,NumPy是Python的一种开源的数值计算扩展,更多详细内容需要的朋友可以参考一下
    2022-07-07
  • Python标准库之itertools库的使用方法

    Python标准库之itertools库的使用方法

    Python提供了一个非常棒的模块用于创建自定义的迭代器,这个模块就是 itertools。itertools 提供的工具相当高效且节省内存,下面这篇文章主要给大家介绍了关于Python标准库之itertools库使用的相关资料,需要的朋友可以参考下。
    2017-09-09
  • python 使用递归的方式实现语义图片分割功能

    python 使用递归的方式实现语义图片分割功能

    这篇文章主要介绍了python 使用递归的方式实现语义图片分割,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • python 实现将list转成字符串,中间用空格隔开

    python 实现将list转成字符串,中间用空格隔开

    今天小编就为大家分享一篇python 实现将list转成字符串,中间用空格隔开,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python身份运算符is与is not区别用法基础教程

    Python身份运算符is与is not区别用法基础教程

    这篇文章主要为大家介绍了Python身份运算符is与is not区别用法基础教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论