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

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

四帧差法是一种运动目标检测技术,它通过比较连续四帧图像之间的差异来检测运动物体。这种方法可以在一定的程度上提高检测的准确性。

目录

1 方案

2 实践

① 代码

② 效果图



1 方案

具体的步骤如下:

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

② 读取初始的三帧图像:连续读取三帧图像并将其转换为灰度图。

③ 读取新帧:循环中,读取新的第四帧并将其转换为灰度图,保持队列中有四帧。

④ 计算帧间差:使用cv2.absdiff计算连续帧之间的差值。

⑤ 差值叠加:将三个帧间差值相加,以增强运动区域的对比度。

⑥ 阈值处理:使用cv2.threshold将叠加后的差值图像转换为二值图像。

⑦ 形态学闭运算:使用cv2.morphologyEx进行闭运算,去除噪声,填充运动物体的轮廓。

⑧ 显示结果:使用cv2.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)
    ret, frame3 = cap.read()
    frame3_gray = cv2.cvtColor(frame3, cv2.COLOR_BGR2GRAY)
    while True:
        # 读取下一帧
        ret, frame4 = cap.read()
        if not ret:
            break
        frame4_gray = cv2.cvtColor(frame4, cv2.COLOR_BGR2GRAY)
        # 计算帧间差
        diff1 = cv2.absdiff(frame1_gray, frame2_gray)
        diff2 = cv2.absdiff(frame2_gray, frame3_gray)
        diff3 = cv2.absdiff(frame3_gray, frame4_gray)
        # 将三帧差相加
        diff_total = cv2.add(diff1, diff2)
        diff_total = cv2.add(diff_total, diff3)
        # 应用阈值处理
        _, thresh = cv2.threshold(diff_total, 30, 255, cv2.THRESH_BINARY)
        # 形态学闭运算,去除噪声
        kernel = np.ones((5, 5), np.uint8)
        closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
        # 显示结果
        cv2.imshow('Video', frame4)
        cv2.imshow('Motion Detection', closing)
        # 更新帧
        frame1_gray = frame2_gray
        frame2_gray = frame3_gray
        frame3_gray = frame4_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/518273.html

相关文章:

  • 【Leetcode 每日一题】40. 组合总和 II
  • Excel分区间统计分析(等步长、不等步长、多维度)
  • 跟我学C++中级篇——64位的处理
  • 如何建设一个企业级的数据湖
  • xxl-job分布式定时任务
  • 从零到全栈开发
  • 如何做一个C#仿Halcon Calibration插件
  • 大模型学习计划
  • python判断字符串是否存在空白、字母或数字
  • 单链表算法实战:解锁数据结构核心谜题——移除链表元素
  • 计算机网络 (54)系统安全:防火墙与入侵检测
  • 论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24
  • 机器学习11-学习路径推荐
  • Solon Cloud Gateway 开发:导引
  • 99.15 金融难点通俗解释:毛利率vs营业利润率vs净利率
  • AI画笔,绘就古今艺术星河(5/10)
  • 【Docker】私有Docker仓库的搭建
  • K8S中Service详解(三)
  • 食堂订餐小程序ssm+论文源码调试讲解
  • pytorch2.5实例教程
  • poi在word中打开本地文件
  • Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
  • C语言数据结构:链表、栈与队列、排序算法与查找算法深度解析
  • 【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试
  • Redis(5,jedis和spring)
  • QModbusTCPClient 服务器断开引起的程序崩溃