当前位置: 首页 > news >正文

Python OpenCV精讲系列 - 入门指南(一)

在这里插入图片描述

💖💖⚡️⚡️ 专栏:Python OpenCV精讲 ⚡️⚡️💖💖
本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识别等多个领域。适合希望在计算机视觉方向上建立坚实基础的技术人员及研究者。每一课不仅包含理论讲解,更有实战代码示例,助力读者快速将所学应用于实际项目中,提升解决复杂视觉问题的能力。无论是入门者还是寻求技能进阶的开发者,都将在此收获满满的知识与实践经验。

1. OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它支持多种编程语言,包括Python、C++等,并且在图像处理、视频分析、模式识别等领域有着广泛的应用。

OpenCV最初由Intel开发,后来由Willow Garage接手维护,现在由Itseez公司负责。OpenCV拥有强大的社区支持和丰富的文档资源,是学习计算机视觉的理想选择。

2. 安装OpenCV

在开始使用OpenCV之前,您需要确保已经在您的系统上安装了Python和OpenCV库。以下是在不同操作系统上安装OpenCV的方法:

2.1 Windows
  1. 安装Python
    如果您还没有安装Python,请访问Python官方网站下载最新版本的Python安装包,并按照提示完成安装。在安装过程中,请确保勾选“Add Python to PATH”选项。

  2. 安装OpenCV
    打开命令提示符,运行以下命令来安装OpenCV:

    pip install opencv-python
    

    如果您还需要使用图形界面功能,可以安装opencv-python-headless

    pip install opencv-python-headless
    
  3. 验证安装
    打开Python解释器,尝试导入OpenCV模块:

    import cv2
    print(cv2.__version__)
    

    如果没有出现任何错误,并且打印出了OpenCV的版本号,那么恭喜您,OpenCV已经成功安装。

2.2 Linux (Ubuntu)
  1. 安装Python
    如果您还没有安装Python,请在终端中运行以下命令:

    sudo apt-get update
    sudo apt-get install python3
    
  2. 安装OpenCV
    打开终端,运行以下命令来安装OpenCV:

    pip3 install opencv-python
    

    如果您还需要使用图形界面功能,可以安装opencv-python-headless

    pip3 install opencv-python-headless
    
  3. 验证安装
    打开Python解释器,尝试导入OpenCV模块:

    import cv2
    print(cv2.__version__)
    

    如果没有出现任何错误,并且打印出了OpenCV的版本号,那么恭喜您,OpenCV已经成功安装。

2.3 macOS
  1. 安装Python
    如果您还没有安装Python,请在终端中运行以下命令:

    brew install python
    
  2. 安装OpenCV
    打开终端,运行以下命令来安装OpenCV:

    pip3 install opencv-python
    

    如果您还需要使用图形界面功能,可以安装opencv-python-headless

    pip3 install opencv-python-headless
    
  3. 验证安装
    打开Python解释器,尝试导入OpenCV模块:

    import cv2
    print(cv2.__version__)
    

    如果没有出现任何错误,并且打印出了OpenCV的版本号,那么恭喜您,OpenCV已经成功安装。

在这里插入图片描述

3. 第一个OpenCV程序

让我们通过一个简单的例子来展示如何使用OpenCV读取和显示一张图片。

3.1 创建Python脚本

打开文本编辑器,创建一个新的Python文件,例如命名为read_image.py

3.2 编写代码

将以下代码复制到您刚刚创建的Python文件中:

import cv2def main():# 加载图片img_path = 'path/to/your/image.jpg'img = cv2.imread(img_path)if img is None:print("Error: File not found!")return# 显示图片cv2.imshow('Image', img)# 等待按键按下cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()if __name__ == "__main__":main()
3.3 运行程序

确保您已经将一张图片放在了正确的路径下,并修改了img_path变量的值。然后,在命令行中运行以下命令:

python read_image.py

这将打开一个窗口,显示您选择的图片。按任意键关闭窗口。

在这里插入图片描述

4. 图像读取详解

在上面的例子中,我们使用了cv2.imread()函数来加载一张图片。现在,让我们更深入地了解一下这个函数。

img = cv2.imread(img_path)
  • 参数

    • img_path:图片的文件路径。
    • 可选参数flags:读取图片的方式。默认值为cv2.IMREAD_COLOR,表示读取彩色图片。其他选项包括:
      • cv2.IMREAD_GRAYSCALE:读取灰度图片。
      • cv2.IMREAD_UNCHANGED:读取原图,包括alpha通道(如果有)。
  • 返回值

    • 返回一个NumPy数组,表示图片数据。
    • 如果文件不存在或无法读取,返回None

注意事项

  • 如果图片路径不正确或者图片格式不被支持,cv2.imread()将会返回None。因此,在使用图片数据前,最好检查一下是否成功加载了图片。
  • OpenCV默认使用BGR颜色空间而不是RGB。这是因为早期的计算机视觉算法大多基于BGR颜色空间设计。如果您希望在其他颜色空间(如RGB)中处理图片,可以通过cv2.cvtColor()函数进行转换。

在这里插入图片描述

5. 图像显示详解

在上面的例子中,我们使用了cv2.imshow()cv2.waitKey()函数来显示图片和等待用户按键。现在,让我们更深入地了解一下这两个函数。

cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.imshow()

    • 参数
      • window_name:窗口的名字。
      • img:要显示的图片数据。
    • 功能
      • 创建一个名为window_name的窗口,并在其中显示图片img
  • cv2.waitKey()

    • 参数
      • delay:等待的毫秒数。如果为0,则表示等待用户按键。
    • 返回值
      • 返回用户按下的按键的ASCII码。
    • 功能
      • 等待用户按键,并返回按键的ASCII码。如果delay为非零值,则等待指定的毫秒数后返回。
  • cv2.destroyAllWindows()

    • 功能
      • 关闭所有创建的窗口。

注意事项

  • 在使用cv2.imshow()显示图片时,需要确保在显示图片之前已经加载了图片并且没有出错。否则,可能会导致程序崩溃。
  • 使用cv2.waitKey()等待用户按键时,可以根据按键的不同实现不同的功能。例如,您可以监听特定的按键来触发图片保存、关闭窗口等操作。

在这里插入图片描述

6. 实践练习

现在,让我们通过一些实践练习来加深对OpenCV的理解。

6.1 练习读取不同类型的图片

尝试使用不同的读取方式读取图片,并观察结果。

import cv2def main():# 加载图片img_path = 'path/to/your/image.jpg'img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)img_gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)img_unchanged = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)# 显示图片cv2.imshow('Color Image', img_color)cv2.imshow('Grayscale Image', img_gray)cv2.imshow('Unchanged Image', img_unchanged)# 等待按键按下cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()if __name__ == "__main__":main()
6.2 练习保存图片

尝试使用cv2.imwrite()函数保存图片。

import cv2def main():# 加载图片img_path = 'path/to/your/image.jpg'img = cv2.imread(img_path)if img is None:print("Error: File not found!")return# 显示图片cv2.imshow('Image', img)# 等待按键按下key = cv2.waitKey(0)if key == ord('s'):cv2.imwrite('output.jpg', img)print("Image saved as output.jpg")# 关闭所有窗口cv2.destroyAllWindows()if __name__ == "__main__":main()

在这个练习中,我们添加了一个按键监听,如果用户按下s键,则会将当前显示的图片保存为output.jpg

在这里插入图片描述

7. 高级实践

为了更好地理解OpenCV的使用,我们还可以进行一些更高级的实践,比如使用OpenCV来进行图像缩放、旋转、裁剪等操作。

7.1 图像缩放

使用cv2.resize()函数可以轻松地调整图像的大小。

import cv2def main():# 加载图片img_path = 'path/to/your/image.jpg'img = cv2.imread(img_path)if img is None:print("Error: File not found!")return# 缩放图片scale_percent = 50  # 缩放比例width = int(img.shape[1] * scale_percent / 100)height = int(img.shape[0] * scale_percent / 100)dim = (width, height)resized = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)# 显示原始图片和缩放后的图片cv2.imshow('Original Image', img)cv2.imshow('Resized Image', resized)# 等待按键按下cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()if __name__ == "__main__":main()
7.2 图像旋转

使用cv2.getRotationMatrix2D()cv2.warpAffine()函数可以实现图像的旋转。

import cv2
import numpy as npdef main():# 加载图片img_path = 'path/to/your/image.jpg'img = cv2.imread(img_path)if img is None:print("Error: File not found!")return# 获取图像中心center = (img.shape[1] // 2, img.shape[0] // 2)# 计算旋转矩阵angle = 45  # 旋转角度scale = 1.0  # 缩放比例rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)# 应用仿射变换rotated = cv2.warpAffine(img, rotation_matrix, (img.shape[1], img.shape[0]))# 显示原始图片和旋转后的图片cv2.imshow('Original Image', img)cv2.imshow('Rotated Image', rotated)# 等待按键按下cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()if __name__ == "__main__":main()
8. 小结

在本篇文章中,我们介绍了OpenCV的基本概念,并展示了如何安装OpenCV以及如何使用它来读取和显示图片。这是OpenCV最基础的功能之一,也是后续学习OpenCV更多高级特性的基石。


http://www.mrgr.cn/news/22603.html

相关文章:

  • 微信公众号获取 openid: 从零到一快速实现一个微信公众号授权项目
  • (11)(2.1.1) PWM、OneShot和OneShot125 ESC(一)
  • Spring入门案例创建流程
  • 0基础跟德姆(dom)一起学AI Python进阶09-算法和数据结构
  • 单例模式详解:实现方法、优缺点及应用场景
  • Vue的slot插槽(默认插槽、具名插槽、作用域插槽)
  • 提升工作效率的秘密武器:选择合适的编程工具
  • STM32 之 SDRAM 详解
  • Java语言程序设计基础篇_编程练习题*18.3 (使用递归求最大公约数)
  • stm32之SPI通信外设
  • 读软件设计的要素05概念的特性
  • NetApp ONTAP NFS qtree间移动文件,提示Permission denied
  • Ftrans无缝替代FTP方案:保障数据传输的安全性与合规性
  • AcWing119 袭击
  • ChatGPT3.5/4.0新手使用手册,国内中文版使用教程
  • 聊聊go语言channel中的一些小技巧
  • 数字电子技术-波形图
  • C语言-qosrt函数—秩序大师
  • Maven项目父模块POM中是否应该包含SpringBoot打包插件(spring-boot-maven-plugin)
  • [苍穹外卖]-06微信登录详解