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实现用户登录界面的实现代码。 1. 创建登录页面 首先,需要确定登录页面需要包含哪些信息,比如用户名和密码。可以使用HTML和CSS来创建具有美观效果的登录页面。以下是一个简单的示例代码: <!DOCTYPE html> <html> <head> <title>Logi…

    python 2023年6月13日
    00
  • 如何在Python中删除SQLite数据库中的数据?

    以下是在Python中删除SQLite数据库中的数据的完整使用攻略。 删除SQLite数据库中的数据简介 在Python中,可以使用sqlite3模块连接SQLite数据库,并使用DELETE FROM语句删除数据。删除数据时,需要指定要删除的表和删除条件。删除结果可以使用游标对象的rowcount属性获取。 步骤1:导入模块 在Python中,使用sqli…

    python 2023年5月12日
    00
  • python实现图像随机裁剪的示例代码

    接下来我将为您详细讲解 “Python实现图像随机裁剪的示例代码” 的完整攻略。 1. 引入必要的库 首先,需要引入 Pillow 库来读取和处理图像,以及 random 库来生成随机数。可以使用 pip 安装 Pillow 库: pip install Pillow 在 Python 代码中引入相关库: from PIL import Image impo…

    python 2023年6月3日
    00
  • 当 Python 3.5.2 调用 gsutil rsync 时返回错误,但从命令行可以

    【问题标题】:gsutil rsync returns error when called by Python 3.5.2, but okay from command line当 Python 3.5.2 调用 gsutil rsync 时返回错误,但从命令行可以 【发布时间】:2023-04-02 18:33:02 【问题描述】: 我有一个 gsutil…

    Python开发 2023年4月8日
    00
  • Python实现ElGamal加密算法的示例代码

    Python实现ElGamal加密算法的完整攻略 ElGamal加密算法是一种公钥加密算法,用于加密和解密数据。本文将详细讲Python实现ElGamal加密算法的整个攻略,包括算法原理实现过程和示例。 算法原理 ElGamal加密算法是一种基于离散对数问题的公钥加密算,其基本思想是使用一个公钥和一个私钥来加密和解密数据。在Python中,可以使用pycry…

    python 2023年5月14日
    00
  • Python 开发工具PyCharm安装教程图文详解(新手必看)

    Python 开发工具PyCharm安装教程图文详解(新手必看) PyCharm是 JetBrains公司开发的Python开发工具,是Python官方推荐的开发工具之一,具有可视化调试,代码自动补全,智能提示等功能。本文将会详细介绍PyCharm的安装步骤,以及使用PyCharm创建项目和运行Python文件的方法。 第一步:下载并安装PyCharm 首先…

    python 2023年5月30日
    00
  • Python如何测试stdout输出

    测试stdout输出是Python测试中一个非常重要的部分,因为很多Python代码都依赖于stdout来输出结果。在Python中测试stdout输出可以使用unittest和pytest两个常用的测试框架。 使用unittest进行stdout输出测试 在unittest框架中,可以使用io.StringIO模块来捕获stdout输出。下面是一个示例代码…

    python 2023年6月3日
    00
  • python查找指定依赖包简介信息实现

    要查找指定的Python依赖包的简介信息,可以使用pip show命令。下面是实现该功能的完整攻略: 1. 确认已安装pip 首先需要确认已经安装了pip包管理器。可以在终端中输入以下命令确认: pip –version 如果已经安装了pip,会显示pip的版本信息。如果未安装,则需要先安装pip。 2. 使用pip show命令查找依赖包信息 使用pip…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部