python+opencv实现移动侦测(帧差法)

下面是详细讲解“Python+OpenCV实现移动侦测(帧差法)”的完整攻略。

1. 什么是移动侦测

移动侦测是指通过对视频或图像序列进行分析,检测出其中的运动目标。在视频监控、智能交通等领域中,移动侦测是一项重要的技术。

2. 帧差法原理

帧差法是一种简单有效的移动侦测算法,其原理是通过比较相邻帧之间的像素值差异,来检测出运动目标。具体实现过程如下:

  1. 读取视频帧。
  2. 将当前帧与前一帧进行差分,得到差分图像。
  3. 对差分图像进行二值化处理,得到前景掩模。
  4. 对前景掩模进行形态学操作,去除噪声和小的区域。
  5. 在前景掩模中检测出运动目标的轮廓。

3. 实现移动侦测

以下是用Python+OpenCV实现移动侦测的步骤。

3.1 导入库

import cv2
import numpy as np

3.2 读取视频

cap = cv2.VideoCapture('test.mp4')

3.3 初始化变量

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
background = gray

3.4 实现帧差法

while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    diff = cv2.absdiff(background, gray)
    thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
    thresh = cv2.dilate(thresh, None, iterations=2)
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) < 1000:
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    if key == ord('r'):
        background = gray
cap.release()
cv2.destroyAllWindows()

4. 示例说明

以下是两个示例说明,分别是使用帧差法实现移动侦测和使用帧差法实现移动侦测保存检测结果。

4.1 使用帧差法实现移动侦测

以下是一个使用帧差法实现移动侦测的示例。

import cv2
import numpy as np

cap = cv2.VideoCapture('test.mp4')

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
background = gray

while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    diff = cv2.absdiff(background, gray)
    thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
    thresh = cv2.dilate(thresh, None, iterations=2)
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) < 1000:
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    if key == ord('r'):
        background = gray

cap.release()
cv2.destroyAllWindows()

4.2 使用帧差法实现移动侦测并保存检测结果

以下是一个使用帧差法实现移动侦测并保存检测结果的示例。

import cv2
import numpy as np

cap = cv2.VideoCapture('test.mp4')

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
background = gray

cc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    diff = cv2.absdiff(background, gray)
    thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
    thresh = cv2.dilate(thresh, None, iterations=2)
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) < 1000:
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    out.write(frame)
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    if key == ord('r'):
        background = gray

cap.release()
out.release()
cv2.destroyAllWindows()

5. 总结

帧差法是一种简单有效的移动侦测算法,可以用Python+OpenCV实现。本教程介绍了帧差法的原理和实现步骤,并提供了相应的示例。其中,示例一是使用帧差法实现移动侦测,示例二是使用帧差法实现移动侦测并保存检测结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python+opencv实现移动侦测(帧差法) - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python 组合重复元素

    【问题标题】:Python Combine Repeating ElementsPython 组合重复元素 【发布时间】:2023-04-02 21:48:02 【问题描述】: 我有一个包含一些重复元素的字符串列表,我想将这些元素组合成一个较短的列表。 原始列表内容如下所示: lst = [[‘0.1’, ‘0’, ‘RC’, ‘100’], [‘0.2’,…

    Python开发 2023年4月8日
    00
  • Anaconda多环境多版本python配置操作方法

    Anaconda多环境多版本Python配置操作方法 在本攻略中,我们将介绍如何使用Anaconda配置多环境多版本Python。Anaconda是一个流行的Python发行版,它包含了许多常用的Python库和工具,并且可以轻松地创建和管理多个Python环境。 步骤1:安装Anaconda 在使用Anaconda之前,我们需要先安装它。可以从Anacon…

    python 2023年5月15日
    00
  • Python retrying 重试机制详解

    以下是关于 Pythonretrying 重试机制的完整攻略: 问题描述 在 Python 中,有时候我们需要在某些操作失败时进行重试。retrying 是一个 Python,它提供了一种简单的方法来实现重试机制。本文将详介绍 Pythonretrying 的使用方法。 解决方法 使用以下步骤解决 Pythonretrying 重试机制问题: 安装 Pyth…

    python 2023年5月13日
    00
  • django model 条件过滤 queryset.filter(**condtions)用法详解

    下面我来详细讲解一下“django model 条件过滤 queryset.filter(**condtions)用法详解”的完整攻略。 一、什么是django model? Django是一个流行的Web框架,提供了一个称为ORM(对象关系映射)的工具。ORM可以让你用Python代码操作数据库,而不是写SQL语句。Django的ORM叫做Django m…

    python 2023年5月18日
    00
  • Python逐行读取文件中内容的简单方法

    当我们需要处理大量数据时,逐行读取文件中的内容是一件十分常见的任务。Python提供了许多逐行读取文件内容的方法,下面我们就来看一下其中一种简单方法。 1. 打开文件 要逐行读取文件内容,首先需要打开文件以获取文件对象。在Python中,使用open()函数来打开文件,并可以通过文件名和文件模式来指定打开文件的类型。 示例代码: file = open(&q…

    python 2023年6月5日
    00
  • Python统计分析模块statistics用法示例

    下面是一个完整的“Python统计分析模块statistics用法示例”的攻略。 1. 基本介绍 Python的statistics模块提供了一组统计分析函数,用于计算一些标准的统计方法,如均值、中位数、方差等。在数据分析和科学计算领域,这些统计函数经常被使用。 2. 导入statistics模块 要使用statistics模块,首先需要导入它。可以使用以下…

    python 2023年6月5日
    00
  • python实现的阳历转阴历(农历)算法

    下面是详细讲解“Python实现的阳历转阴历(农历)算法”的完整攻略,包含两个示例说明 阳历阴历 阳历是指以地球公转为基础的历法,也称为公历。阴历是指以月亮围地球运行基础的历法,也称为农历。 阳历转阴历算法 阳历转阴历算法是一种将阳历日期转换为阴历日期的算法。下面是一个示例代码,用于实现阳历转阴历算法: import datetime def lunar(y…

    python 2023年5月14日
    00
  • VLC – 通过 windows/python 上的命令行以交互方式终止流/转码/windows 上的编程视频捕获

    【问题标题】:VLC – terminate stream/transcoding interactively via command line on windows/ python / programmatic video capture on windowsVLC – 通过 windows/python 上的命令行以交互方式终止流/转码/windows …

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部