跳至主要内容

OpenCV 教程:释放视觉数据处理的力量

本文为在 Python 环境中使用 OpenCV 库进行图像与视频处理提供了全面指南。我们将深入探讨 OpenCV 提供的广泛图像处理功能,从基础技术到更高级的应用。
· 13分钟 阅读

使用 AI 探索

OpenCV(Open Source Computer Vision Library,开源计算机视觉库)是一款功能强大的开源库,广泛应用于计算机视觉项目。OpenCV 旨在为实时计算机视觉提供一套集成框架,并作为一个平台,支持众多图像与视频分析应用。

OpenCV 库在帮助开发者和研究人员充分利用视觉数据处理方面发挥着关键作用。它的能力覆盖多种应用场景,从基础的图像处理到更复杂的任务,如物体识别与人脸识别。通过提供大量算法、方法和图像数据处理操作,OpenCV 促进了能够识别与分类视觉内容的智能系统的开发。

OpenCV 的一个典型应用是目标识别,其算法可帮助在图像或视频流中识别与定位目标。该能力也扩展至其他计算机视觉任务,比如人脸识别、运动跟踪以及对增强现实技术的支持。

本文将探讨以下内容:

  • OpenCV 库支持的图像处理功能
  • 如何在 Python 环境中安装 OpenCV 库
  • 图像处理技术概览及其在 OpenCV 中的实现
  • 使用 OpenCV 进行视频处理的技术

OpenCV 安装

先决条件

要顺利完成本教程,您需要具备中级水平的 Python 知识和对计算机视觉的基本理解。熟悉图像处理原理将有助于加深学习体验,虽然文中会在出现关键概念时给予定义。

安装步骤

  1. 安装 Python:请确保系统已安装 Python。可从官方Python 网站下载最新版本。
  2. 环境与包管理器(可选):您可以使用如 Anaconda 之类的包管理器以简化库管理。通过其官方网站下载并安装 Anaconda。
  3. 安装 OpenCV:打开命令提示符或终端,使用以下命令通过 pip(Python 的包安装器)安装 OpenCV:
!pip install opencv-python

如果您使用的是 Anaconda,可以使用以下命令:

!conda install -c conda-forge opencv

验证

为确认是否安装成功,请在 Python 解释器或 Jupyter Notebook 中运行以下代码:

import cv2
print(cv2.__version__)

如果安装成功,应当会打印已安装 OpenCV 库的版本号。若终端或控制台未打印版本号,则说明安装过程未成功。

在使用 Google Colab 时的重要提示:若要在 Google Colab 笔记本中显示图像,需要将传统的 cv2.imshow 替换为 Google Colab 特定库提供的 cv2_imshow。Colab 环境不支持 cv2.imshow,此调整可确保兼容性。要实现此更改,请按如下方式从 Google Colab 的 patches 中导入 cv2_imshow 函数:

from google.colab.patches import cv2_imshow

# Displaying an image in a window
cv2_imshow(image)

OpenCV 功能简介

在 OpenCV 中加载与显示图像

下面的代码片段介绍了使用 OpenCV 库进行图像处理的基本入门方法。将图像加载到开发环境在诸多场景中都会用到,从简单的计算机视觉项目到生产中的复杂实时目标检测应用。显示图像同样至关重要,便于查看图像内容或处理结果。以下代码中,我们从文件读取一张 JPG,并使用 OpenCV 显示它。

以下代码片段可用于在 OpenCV 中加载并显示图像:

import cv2

# Loading image from a file
image = cv2.imread('your/image/path.jpg')

# Displaying an image in a window
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

image1.png

围坐在笔记本电脑旁的办公室员工。来源:Canva

在这段代码中,使用“cv2.imread”从文件中读取图像,然后借助“imshow”在窗口中显示。函数“cv2.waitKey(0)”确保窗口在用户按下按键关闭前一直保持打开。

图像处理是以一种能够改变原始图像视觉外观的方式来操作图像中的像素数据,目的可能是特征提取、图像分析或其他与计算机视觉相关的任务。 常见的图像处理技术包括色彩处理、滤波、分割、边缘检测等。

下面的代码片段演示了对上一段代码所加载图像进行的一个简单图像处理技术:颜色空间转换,具体为灰度化。灰度转换是图像处理中的基础技术,将图像降为单通道的强度值。

# Converting an image to grayscale form
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Displaying the grayscale image
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里,cv2.cvtColor() 将已加载的图像转换为灰度图。

围坐在笔记本电脑旁的办公室员工(灰度)。来源:Canva

围坐在笔记本电脑旁的办公室员工(灰度)。来源:Canva

边缘检测

边缘检测是图像处理与计算机视觉中的基础技术。它用于识别图像中亮度急剧变化或存在不连续性的点。 在计算机视觉中,尤其是在从图像数据中检测特征时,边缘检测至关重要。边缘检测通常通过检测像素强度的剧烈变化来实现。将这些亮度急变的点连接起来,就形成了勾勒图像中物体的线条与边缘。

借助边缘检测算法,可以检测到图像中物体的细微纹理与结构特征。

多种边缘检测算法(如 Canny 边缘检测器、Sobel 方法与模糊逻辑方法)被用于目标识别、图像分割与特征提取。以下代码片段展示了使用 OpenCV 进行基础边缘检测:

# Applying Canny edge detection (a simple edge detection method)
edges = cv2.Canny(gray_image, 50, 150)

# Displaying the edge-detected image
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 库中提供了现成的 Canny 边缘检测算法,通过底层函数“cv2.Canny()”对灰度图执行边缘检测。

围坐在笔记本电脑旁的办公室员工(灰度)。来源:Canva

围坐在笔记本电脑旁的办公室员工(灰度)。来源:Canva

调整尺寸与旋转图像

调整尺寸与旋转图像是图像处理中的基本需求,有助于适配与变换视觉内容。调整尺寸指改变图像的宽高(放大或缩小),这对在特定环境中缩放与摆放图像非常关键。

旋转是一种改变图像观测角度的操作,通过指定旋转角度进行调整。这两类操作通常作为多种目的的预处理步骤被广泛采用,包括计算机视觉、机器学习与图形学。例如,在训练深度神经网络时,旋转与缩放图像属于数据增强技术,用于提升训练数据的多样性。数据增强的目标是让网络在训练时见到足够的变化性,从而使训练后的网络能够更好地泛化到未见过的数据。

要使用 OpenCV 调整尺寸并旋转图像,您可以参考以下代码:

# Resizing the image
resized_image = cv2.resize(image, (width, height))

# Rotating the image by 45 degrees
rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), 45, 1)
rotated_image = cv2.warpAffine(resized_image, rotation_matrix, (width, height))

# Displaying the resized and rotated images
cv2.imshow('Resized Image', resized_image)
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,“cv2.resize”用于调整图像尺寸,而 “cv2.getRotationMatrix2D”与“cv2.warpAffine”配合用于旋转图像。

围坐在笔记本电脑旁的办公室员工(旋转)。来源:Canva

围坐在笔记本电脑旁的办公室员工(旋转)。来源:Canva

加载与处理视频

视频是按序呈现的一系列图像。在计算机视觉中,视频处理能力对于开发处理实时与录制数据的应用至关重要。与静态图像不同,视频处理面向图像的时间序列,使得对运动、随时间的变化以及时间模式的提取成为可能。

视频数据内容的动态特性要求视频处理技术具有效率,尤其是在关键系统中,例如监控、自动驾驶、行为识别等应用场景中,对运动与变化的理解至关重要。

使用 OpenCV 进行视频处理的一大优势在于其提供了一整套高效处理视频流的功能。与处理图像类似,OpenCV 也提供了视频的采集、处理与分析工具。

以下代码片段可用于加载并处理本地视频:

import cv2

# Open a video capture object
cap = cv2.VideoCapture("Your video's path.mp4")

# To check if the video has opened successfully of not
if not cap.isOpened():
    print("Error: Couldnot open the video.")
    exit()

# Loop through the video frames
while True:
    # Reading a frame from the video
    ret, frame = cap.read()

    # Break the loop if the video has ended
    if not ret:
        break

    # Display the original frame
    cv2.imshow('Original Video', frame)

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Black and White Video', gray_frame)

    # Perform edge detection on the video
    edges_frame = cv2.Canny(gray_frame, 50, 150)
    cv2.imshow('Edges Video', edges_frame)

    # Break the loop if 'q' key is pressed
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

# Release the video capture object and close all windows
cap.release()
cv2.destroyAllWindows()

在这段代码中,通过“cv2.VideoCapture”类访问视频文件,并使用其方法“cap.read”逐帧读取。程序先显示原始视频,再将其转换为黑白,最后对每帧进行边缘检测。循环将一直运行,直到视频读取完毕或接收到键盘退出指令。“cv2.waitKey(25)”在帧之间引入短暂延时以进行显示,从而确保播放流畅。

使用 OpenCV 与 Yolo 进行行人检测

目标检测与行人检测

目标检测是计算机视觉中的基础任务,旨在检测并定位图像或视频中的目标,并给出识别结果——即检测到的类别标签列表及其对应的边界框。行人检测作为目标识别的一个变体,专注于在视觉信息中识别与定位人。

行人检测的应用

行人检测的应用包括安防监控、人群管理、人数统计、跟踪、人机交互与智能环境。在监控中,该技术有助于发现可疑活动;在人群管理中,它支持手势识别与跟踪。行人检测在人机交互中发挥重要作用,也被用于智能环境中的资源优化与安全增强。

YOLO 目标检测模型

YOLO 是“You Only Look Once”的缩写,是一种高效实现实时目标识别的常用系统。不同于传统目标检测方法,YOLO 将图像划分为网格单元,并同时为每个单元预测边界框与类别概率。

您可以在我们的综合指南中进一步阅读YOLO 目标检测相关内容。

静态图像中的行人检测

下面是使用 OpenCV 与 Yolo 在图像中进行行人检测的代码片段:

import cv2

net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
layer_names = net.getUnconnectedOutLayersNames()

image = cv2.imread('image path.jpg')
height, width = image.shape[:2]

blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
outs = net.forward(layer_names)

for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        
        if confidence > 0.5 and class_id == 0:  # Class ID for person
            box = detection[:4] * np.array([width, height, width, height])
            (x, y, w, h) = box.astype(int)
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('Person Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

视频中的行人检测

类似地,用于视频中行人检测的代码结构遵循相同的原理。不同之处在于,脚本或应用会连续处理视频的每一帧,而非处理一张静态图像。

在图像与视频中识别人的基本原理相同,主要差异在于时间维度。对于图像,任务是在单帧静态图像中识别并定位行人。

这更适用于监控截图或其它不重叠的照片。相较之下,在视频中,目标是当个体在后续帧中移动时进行识别与跟踪,这有时被称为视频中的目标跟踪。时间因素在分析人的运动与交互时尤为关键,使基于视频的行人检测成为安防监控、人群监测与行为分析等实时应用的重要工具。

现实应用与伦理考量

其他一些行人检测的实际用例包括智慧城市、零售分析与公共安全。然而,也存在与隐私、同意及技术滥用相关的伦理考量。通过在不同领域中平衡收益与伦理关切,方可实现负责任的部署。

结语

本教程展示了使用 OpenCV 库开展各类计算机视觉任务的基础要点。从基本入手,介绍了如何在 Python 环境中安装 OpenCV,演示了加载与显示图像的操作,并展示了图像处理技术,如将图像转换为灰度与应用边缘检测。总体而言,OpenCV 能够执行复杂的图像变换与分析,包括将图像处理技术应用到视频帧上。

值得注意的是,OpenCV 在应用型计算机视觉中发挥着重要作用,它具备多样性与强大的能力,使计算机视觉工程师与机器学习从业者能够应对诸多与视觉数据处理相关的挑战。使用 OpenCV 库的关键优势在于,它简化了应用计算机视觉算法的流程,并高效地将应用构想转化为切实可行的实现。

通过精心策划的课程,进一步深入学习Python 中的图像处理,加深您对本文所述概念的理解。该课程还将借助 Sci-kit Image 与 Numpy 等额外库拓展您在图像处理与计算机视觉方面的工具箱。

Richmond Alake

作者

Richmond Alake

机器学习内容创作者,累积浏览量超百万——计算机视觉工程师。热衷于获取并分享有关科技与金融的知识

主题