当前位置: 首页 > article >正文

【python】三帧差法实现运动目标检测

三帧差法是一种常用的运动目标检测方法,它通过比较连续三帧图像之间的差异来检测运动物体。这种方法尤其适用于背景变化较小的场景。

目录

1 方案

2 实践

① 代码

② 效果图



1 方案

具体步骤如下:

① 读取视频流:使用cv2.VideoCapture()读取视频文件。

② 灰度:将彩色图像转换为灰度图,简化后续计算。

③ 帧间差分:计算连续三帧之间的差分,absdiff函数计算两个灰度图像的绝对差值。然后,将两帧差相加。

④ 阈值处理:使用threshold函数将差分图像转换为二值图像,突出运动区域。

⑤ 形态学操作:应用闭运算(morphologyEx)去除小的噪声点。

⑥ 显示结果:使用imshow显示检测到的运动区域和当前帧。

⑦ 更新帧:将当前帧更新为下一帧,以便在循环中持续检测运动目标。

⑧ 退出循环:按’q’键退出程序。

需要注意的是,三帧差法仅适用于背景相对静止的场景。如果背景的变化较大,则需要更复杂的方法(背景减除或自适应阈值技术)。

2 实践

① 代码

import cv2
import numpy as np


def OD(video_path):
    # 初始化摄像头
    cap = cv2.VideoCapture(video_path)
    # 读取第一帧作为初始帧
    ret, frame1 = cap.read()
    frame1_gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    # 读取第二帧
    ret, frame2 = cap.read()
    frame2_gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    while True:
        # 读取第三帧
        ret, frame3 = cap.read()
        if not ret:
            break
        frame3_gray = cv2.cvtColor(frame3, cv2.COLOR_BGR2GRAY)
        # 计算帧间差
        diff1 = cv2.absdiff(frame1_gray, frame2_gray)
        diff2 = cv2.absdiff(frame2_gray, frame3_gray)
        # 将两帧差相加
        diff = cv2.add(diff1, diff2)
        # 应用阈值来提取运动区域
        _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
        # 使用形态学操作去除噪声
        kernel = np.ones((5, 5), np.uint8)
        closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
        # 显示结果
        cv2.imshow("video", frame3)
        cv2.imshow('Motion Detection', closing)
        # 更新帧
        frame1_gray = frame2_gray
        frame2_gray = frame3_gray
        # 按'q'退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    OD("test.mp4")
    pass

② 效果图

至此,本文分享的内容就结束啦。


http://www.kler.cn/a/519680.html

相关文章:

  • Docker 国内镜像源
  • 图漾相机搭配VisionPro使用简易教程
  • python 统计相同像素值个数
  • 单片机基础模块学习——按键
  • nacos(基于docker最详细安装)
  • 【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124
  • postman生成前端测试接口时,是在本地还是在线上?
  • 从零开始构建一个JAVA项目
  • Linux学习笔记——网络管理命令
  • 旅游风景的代码项目
  • 数据结构基础之《(15)—排序算法小结》
  • MATLAB 如何避免复杂shp文件对inpolygon的影响
  • 3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
  • 不建模,无代码,如何构建一个3D虚拟展厅?
  • 【前端】CSS实战之音乐播放器
  • InceptionV1_V2
  • 贝尔科技液氮罐确保每一份样本的保存达标
  • 【Rust自学】14.3. 使用pub use导出方便使用的API
  • 算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)
  • 使用 MySQL JSON 查询筛选嵌套字段的值
  • IMX6ull项目环境配置
  • [ACTF2020 新生赛]Include1
  • 服务器中热备份和冷备份的区别
  • Debian或Ubuntu系统中重置MySQL的root密码
  • 【2024年华为OD机试】 (C卷,200分)- 贪吃的猴子(JavaScriptJava PythonC/C++)
  • Solon Cloud Gateway 开发:熟悉 Completable 响应式接口