传统视觉项目 | ​使用 OpenCV 进行运动检测

在技术不断重塑我们与世界互动方式的时代,计算机视觉已成为最令人兴奋的创新领域之一。 从自动驾驶汽车到家庭安防系统,检测和解释运动的能力已成为现代应用的重要组成部分。 在这些进步的背后,OpenCV(开源计算机视觉库)扮演了核心角色,它使开发者能够构建强大而高效的图像和视频处理系统。

在技术不断重塑我们与世界互动方式的时代,计算机视觉已成为最令人兴奋的创新领域之一。从自动驾驶汽车到家庭安防系统,检测和解释运动的能力已成为现代应用的重要组成部分。在这些进步的背后,OpenCV(开源计算机视觉库)扮演了核心角色,它使开发者能够构建强大而高效的图像和视频处理系统。

在本文中,我们将引导你了解检测视频流或实时画面中运动的基本概念、工具和技术。通过本文的学习,你不仅将拥有一个可运行的原型,还会对运动检测背后的原理有更深入的理解。

传统视觉项目 | ​使用 OpenCV 进行运动检测

运动检测的工作原理是什么?

运动检测,也称为动作检测,涉及识别视频流中连续帧之间的变化。其基本思想很简单:如果帧的某一部分随时间发生显著变化,我们假设该区域发生了运动。以下是运动检测的基本流程:

  • 帧差分:通过比较视频的连续帧,我们可以识别像素值发生变化的区域。这些差异通常表示运动。
  • 阈值处理:在识别出差异后,应用阈值以将显著变化与噪声分离。这确保忽略微小变化(如光照变化)。
  • 轮廓检测:为了定位和勾勒移动物体,分析处理后的图像以检测轮廓。这些轮廓代表移动物体的形状。
  • 背景减除(可选):在更高级的情况下,维护一个背景模型,任何与背景的偏差都被视为运动。这种方法在固定摄像头的场景中特别有效。
  • 后处理:可以使用其他技术(如过滤小范围运动或稳定检测)来优化结果,提高准确性。

为什么选择OpenCV?

OpenCV(开源计算机视觉)是一个强大的开源库,专为实时计算机视觉和图像处理而设计。它提供了广泛的工具和功能,使运动检测、人脸识别、目标跟踪等任务变得简单高效。OpenCV的主要特点包括:

  • 广泛的算法:预建的图像处理、特征提取和目标检测算法。
  • 多语言支持:与Python、C++、Java等语言无缝协作。
  • 实时性能:针对速度进行了优化,非常适合实时应用。
  • 丰富的文档:庞大的社区和优秀的文档使OpenCV对初学者友好且高度可定制。

在本文中,我们将使用OpenCV的视频处理功能构建一个运动检测系统。通过将OpenCV的工具与Python的简洁性结合,你会发现实现一个能够有效检测和突出运动的解决方案非常容易。

开始使用

步骤1:安装必要的库

复制
pip install opencv-python numpy

步骤2:导入库

复制
import cv2
import numpy as np

步骤3:定义运动检测逻辑

  • 使用函数calculate_motion_regions检测运动。
  • 比较连续帧以发现差异。
  • 使用轮廓突出显示运动区域。
  • 通过阈值过滤小范围运动。
复制
def calculate_motion_regions(prev_frame, curr_frame, mask, threshold=900):
    # Apply the mask to both frames
    prev_roi = cv2.bitwise_and(prev_frame, prev_frame, mask=mask)
    curr_roi = cv2.bitwise_and(curr_frame, curr_frame, mask=mask)

    # Convert to grayscale for simplicity
    prev_gray = cv2.cvtColor(prev_roi, cv2.COLOR_BGR2GRAY)
    curr_gray = cv2.cvtColor(curr_roi, cv2.COLOR_BGR2GRAY)

    # Calculate absolute difference
    diff = cv2.absdiff(prev_gray, curr_gray)

    # Threshold the difference to binarize
    _, diff_thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # Find contours of the motion regions
    contours, _ = cv2.findContours(diff_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    motion_regions = []
    for contour in contours:
        if cv2.contourArea(contour) > threshold:  # Filter small motion areas
            motion_regions.append([contour])

    return motion_regions, diff_thresh

步骤4:初始化视频捕获和掩码

打开视频文件。

复制
cap = cv2.VideoCapture(r"YourVideoPath") # or use 0 for webcam
if not cap.isOpened():
    print("Error: Cannot open video file.")
    exit()

读取第一帧并创建覆盖整个帧的掩码。

复制
ret, prev_frame = cap.read()
if not ret:
    print("Error: Cannot read the first frame.")
    cap.release()
    exit()

mask = np.ones(prev_frame.shape[:2], dtype=np.uint8) * 255

步骤5:逐帧处理视频

循环遍历视频帧,计算运动区域并显示结果。

复制
while cap.isOpened():
    ret, curr_frame = cap.read()
    if not ret:
        break

    motion_regions, motion_mask = calculate_motion_regions(prev_frame, curr_frame, mask)

    # Draw bounding boxes around motion regions

    for motion_region in motion_regions:
        cv2.polylines(curr_frame, motion_region, isClosed=True, color=(0, 255, 0), thickness=1)

    # Update the previous frame
    prev_frame = curr_frame.copy()

    # Convert motion mask to 3 channels for concatenation
    motion_mask_colored = cv2.cvtColor(motion_mask, cv2.COLOR_GRAY2BGR)

    curr_frame = cv2.resize(curr_frame, (490, 640))
    motion_mask_colored = cv2.resize(motion_mask_colored, (490, 640))

    # Concatenate the current frame and the motion mask side-by-side
    combined_frame = cv2.hconcat([curr_frame, motion_mask_colored])

    # Show the combined frame
    cv2.imshow('Motion Detection', combined_frame)

    # Break the loop with 'q'
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

步骤6:回收

复制
cap.release()
cv2.destroyAllWindows()

传统视觉项目 | ​使用 OpenCV 进行运动检测

工作原理

(1) 帧比较:

  • 每一帧都与前一帧进行比较,以识别差异(运动)。
  • 使用每帧的灰度版本以简化处理。

(2) 运动阈值处理:

通过阈值过滤掉微小差异,以分离出显著的运动区域。

(3) 运动区域边界:

在检测到的运动区域周围绘制轮廓以突出显示。

(4) 可视化:

将处理后的帧和运动掩码并排显示,以便更好地理解。

运行代码

  • 将完整脚本保存为.py文件。
  • 运行脚本
  • 按q键退出视频显示。

相关资讯

基于 OpenCV 和 Matplotlib 的物体移动可视化

在计算机视觉中,一个基本目标是从静态图像或视频序列中提取有意义的信息。 为了理解这些信号,通常有助于对其进行可视化。 例如,在跟踪高速公路上行驶的单个汽车时,我们可以围绕它们绘制边界框,或者在检测传送带上产品线中的问题时,我们可以使用不同的颜色来标记异常。

摩尔线程开源 OpenCV-MUSA:支持绝大部分 cv::cuda 命名空间下数据结构及 API

感谢摩尔线程宣布其自研统一系统架构 MUSA 已完成与开源计算机视觉库 OpenCV 的适配,并正式发布 OpenCV-MUSA 开源项目。OpenCV 作为计算机视觉领域最重要的开源库之一,为图像和视频处理的开发者和研究人员提供了强大且灵活的工具。OpenCV 在自动驾驶、医疗影像、安防监控、机器人视觉、增强现实和图像识别等多个领域得到广泛应用。在现有 OpenCV 代码的基础上,摩尔线程新增了 MUSA 设备后端,并为多个算法模块提供了 MUSA 加速支持,同时对编译脚本也进行了适配。目前 OpenCV-MUS

用 OpenCV 实现 FAST 算法目标跟踪

主要工作提取特征(角点)并使用FAST算法跟踪对象:OpenCV,PythonOpenCV中有多种特征提取算法可供使用,但其中一种名为FAST算法的,对于实时计算机视觉应用来说非常有用。 大多数特征提取和角点检测方法在提取特征方面表现良好,但它们大多数并不适合实时应用。 FAST算法非常适合实时计算机视觉任务。