杰瑞科技汇

pythonopencv教程

Python OpenCV 完整教程

OpenCV (Open Source Computer Vision Library) 是一个开源的、跨平台的计算机视觉和机器学习软件库,它包含超过 2500 个优化的算法,涵盖了从图像处理到物体识别的方方面面,结合 Python 的简洁语法,OpenCV 成为了进行计算机视觉项目最流行的工具之一。

pythonopencv教程-图1
(图片来源网络,侵删)

第一部分:环境准备

在开始之前,你需要确保你的电脑上已经安装了 Python 和 OpenCV。

安装 Python

如果你还没有安装 Python,请从 Python 官网 下载并安装,安装时,请务必勾选 "Add Python to PATH" 选项。

安装 OpenCV

打开你的终端或命令提示符,使用 pip(Python 的包管理器)来安装 OpenCV。

# 安装 OpenCV
pip install opencv-python
# (可选但推荐)安装额外的模块,如 SIFT、SURF 等
pip install opencv-contrib-python

安装完成后,你可以在 Python 中导入 OpenCV 来验证安装是否成功:

pythonopencv教程-图2
(图片来源网络,侵删)
import cv2
print("OpenCV 版本:", cv2.__version__)

如果输出了 OpenCV 的版本号,说明安装成功。


第二部分:基础操作

读取、显示和保存图像

这是 OpenCV 最基本的操作。

import cv2
import numpy as np
# 1. 读取图像
# cv2.imread() 用于读取图像
# 参数:
#   - 'path/to/your/image.jpg': 图像文件的路径
#   - cv2.IMREAD_COLOR: 默认参数,以彩色模式读取图像(忽略 alpha 通道)
#   - cv2.IMREAD_GRAYSCALE: 以灰度模式读取图像
#   - cv2.IMREAD_UNCHANGED: 读取包含 alpha 通道的图像
image = cv2.imread('resources/cat.jpg', cv2.IMREAD_COLOR)
# 检查图像是否成功加载
if image is None:
    print("错误:无法加载图像,请检查路径是否正确。")
else:
    # 2. 显示图像
    # cv2.imshow() 用于在窗口中显示图像
    # 参数:
    #   - 'Window Title': 窗口的标题
    #   - image: 要显示的图像对象
    cv2.imshow('Cat Image', image)
    # 3. 保存图像
    # cv2.imwrite() 用于将图像保存到文件
    # 参数:
    #   - 'output/cat_saved.jpg': 保存的路径和文件名
    #   - image: 要保存的图像对象
    cv2.imwrite('output/cat_saved.jpg', image)
    # 4. 等待按键
    # cv2.waitKey() 是一个关键的函数,它等待指定的毫秒数看是否有按键输入。
    # 如果参数是 0,它会无限期地等待,直到有任意按键被按下。
    cv2.waitKey(0)
    # 5. 关闭所有 OpenCV 窗口
    # 这是一个好习惯,可以防止程序结束后窗口还留在后台。
    cv2.destroyAllWindows()

获取图像信息

图像在 OpenCV 中被表示为 NumPy 数组,了解其属性非常重要。

import cv2
image = cv2.imread('resources/cat.jpg', cv2.IMREAD_COLOR)
if image is not None:
    # 图像的尺寸 (高度, 宽度)
    print("图像尺寸:", image.shape)
    # 图像的总像素数
    print("像素总数:", image.size)
    # 图像的数据类型
    print("数据类型:", image.dtype)

输出解释:

pythonopencv教程-图3
(图片来源网络,侵删)
  • (高度, 宽度, 通道数): 对于彩色图像,通道数通常是 3 (B, G, R)。
  • 高度 * 宽度 * 通道数: 图像中像素的总数。
  • uint8: 无符号8位整数,是图像像素最常见的类型,取值范围是 0 到 255。

第三部分:核心图像处理

颜色空间转换

最常见的转换是从 BGR(OpenCV 默认)到灰度或 HSV。

import cv2
image = cv2.imread('resources/cat.jpg')
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 转换为 HSV (Hue, Saturation, Value) 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Gray Image', gray_image)
cv2.imshow('HSV Image', hsv_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

几何变换

a. 调整大小

import cv2
image = cv2.imread('resources/cat.jpg')
# 缩放到 50% 的尺寸
# (0, 0) 表示基于原始图像的尺寸
# 0.5 是缩放因子
resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)
# 缩放到固定尺寸 (300x300)
fixed_resized_image = cv2.resize(image, (300, 300))
cv2.imshow('Resized to 50%', resized_image)
cv2.imshow('Resized to 300x300', fixed_resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

b. 图像旋转

import cv2
import numpy as np
image = cv2.imread('resources/cat.jpg')
# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
# 定义旋转矩阵
# cv2.getRotationMatrix2D(center, angle, scale)
# angle: 旋转角度(正值为逆时针)
# scale: 缩放因子
M = cv2.getRotationMatrix2D(center, 45, 1.0)
# 应用旋转
rotated_image = cv2.warpAffine(image, M, (w, h))
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像阈值

阈值是一种将灰度图像转换为二值图像(黑白)的简单方法。

import cv2
# 读取为灰度图像
gray_image = cv2.imread('resources/cat.jpg', cv2.IMREAD_GRAYSCALE)
# 应用阈值
# cv2.threshold(src, thresh, maxval, type)
# src: 输入图像
# thresh: 阈值
# maxval: 超过阈值后赋予的值
# type: 阈值类型
# cv2.THRESH_BINARY: 大于阈值的设为 maxval,其余设为 0
ret, thresh_binary = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
# cv2.THRESH_BINARY_INV: 反转
ret, thresh_binary_inv = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('Original Gray', gray_image)
cv2.imshow('THRESH_BINARY', thresh_binary)
cv2.imshow('THRESH_BINARY_INV', thresh_binary_inv)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测

Canny 边缘检测是一种非常流行的边缘检测算法。

import cv2
gray_image = cv2.imread('resources/cat.jpg', cv2.IMREAD_GRAYSCALE)
# 高斯模糊,以减少噪声
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# Canny 边缘检测
# cv2.Canny(image, threshold1, threshold2)
# threshold1: 第一个滞后阈值
# threshold2: 第二个滞后阈值
edges = cv2.Canny(blurred_image, 50, 150)
cv2.imshow('Original Gray', gray_image)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

第四部分:高级功能

图像滤波

滤波器用于图像平滑、锐化等。

import cv2
import numpy as np
image = cv2.imread('resources/cat.jpg')
# a. 均值滤波
# 用周围像素的平均值代替中心像素
mean_blur = cv2.blur(image, (5, 5))
# b. 高斯滤波
# 使用高斯函数进行加权平均,效果更好
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)
# c. 中值滤波
# 用周围像素的中值代替中心像素,对椒盐噪声效果很好
median_blur = cv2.medianBlur(image, 5)
cv2.imshow('Original', image)
cv2.imshow('Mean Blur', mean_blur)
cv2.imshow('Gaussian Blur', gaussian_blur)
cv2.imshow('Median Blur', median_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学操作

基于图像形状的操作,常用于处理二值图像。

import cv2
import numpy as np
# 创建一个二值图像
image = np.zeros((300, 600), dtype="uint8")
cv2.rectangle(image, (150, 50), (250, 250), 255, -1)
cv2.rectangle(image, (350, 50), (450, 250), 255, -1)
cv2.imshow('Original', image)
# 创建一个结构元素(核)
kernel = np.ones((5, 5), np.uint8)
# a. 腐蚀
# 去除小的白色噪声,使白色区域变小
eroded = cv2.erode(image, kernel, iterations=1)
cv2.imshow('Eroded', eroded)
# b. 膨胀
# 填充黑色区域中的小孔,使白色区域变大
dilated = cv2.dilate(image, kernel, iterations=1)
cv2.imshow('Dilated', dilated)
# c. 开运算
# 先腐蚀后膨胀,用于去除噪声
opened = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow('Opened', opened)
# d. 闭运算
# 先膨胀后腐蚀,用于填充小孔
closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Closed', closed)
cv2.waitKey(0)
cv2.destroyAllWindows()

第五部分:视频处理

OpenCV 不仅可以处理图像,还可以处理视频流(来自摄像头或文件)。

从摄像头读取视频

import cv2
# 打开默认摄像头 (索引为 0)
# 如果你有多个摄像头,可以尝试 1, 2, ...
cap = cv2.VideoCapture(0)
while True:
    # cap.read() 读取一帧
    # ret 是一个布尔值,如果成功读取到帧,则为 True
    # frame 是读取到的图像帧
    ret, frame = cap.read()
    if not ret:
        print("无法获取帧,退出...")
        break
    # 对帧进行处理,例如转换为灰度
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 显示原始帧和灰度帧
    cv2.imshow('Original Frame', frame)
    cv2.imshow('Gray Frame', gray_frame)
    # 按 'q' 键退出循环
    # cv2.waitKey(1) 等待 1 毫秒
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头资源
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()

播放视频文件

与从摄像头读取类似,只需要将 VideoCapture(0) 替换为视频文件的路径。

import cv2
cap = cv2.VideoCapture('resources/sample_video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("视频播放完毕或无法读取文件。")
        break
    cv2.imshow('Video Playback', frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

第六部分:实战项目

项目:人脸检测

这是一个非常经典且有趣的应用,它使用了 OpenCV 内置的 Haar 级联分类器。

步骤:

  1. 准备一张包含人脸的图片。
  2. 加载 OpenCV 提供的人脸检测器 XML 文件。
  3. 加载并预处理图像。
  4. 在图像上检测人脸。
  5. 在检测到的人脸周围绘制矩形。
import cv2
# 1. 加载人脸检测器
# OpenCV 提供了预训练的分类器,位于 'haarcascades' 目录下
# 你可以在你的 OpenCV 安装目录中找到它,或者从网上下载
#  C:\Users\YourUser\AppData\Local\Programs\Python\Python39\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 2. 加载图像
image = cv2.imread('resources/people.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 3. 检测人脸
# faces = face_cascade.detectMultiScale(gray_image, scaleFactor, minNeighbors)
# scaleFactor: 图像缩放因子,用于构建图像金字塔
# minNeighbors: 每个候选矩形应保留的邻近数,值越大,检测越严格,误检越少
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5)
# 4. 绘制矩形
# 遍历检测到的每一个人脸
for (x, y, w, h) in faces:
    # cv2.rectangle(image, (x1, y1), (x2, y2), color, thickness)
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 5. 显示结果
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

学习资源推荐

  1. 官方文档: OpenCV 官方文档 是最权威的资料,虽然有些内容是 C++ 版本的,但 Python API 的命名和用法非常相似。
  2. PyImageSearch: 由 Adrian Rosebrock 创建的博客,提供了大量高质量的 Python OpenCV 教程和项目实战,强烈推荐。
  3. GitHub: 在 GitHub 上搜索 "Python OpenCV projects",可以找到很多开源项目供你学习和参考。
  4. 视频教程: YouTube 上有大量免费的 OpenCV 教程,例如由 Sentdex、freeCodeCamp.org 等频道制作的。

这份教程为你提供了一个学习 Python OpenCV 的路线图,从最基础的读写图像开始,逐步深入到图像处理、视频分析和实际项目。最重要的学习方法是“动手实践”,尝试修改代码中的参数,看看结果有什么不同,并尝试自己实现一些小功能,比如检测眼睛、识别车牌等。

祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇