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

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

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

目录

1 方案

2 实践

① 代码

② 效果图



1 方案

具体的步骤如下:

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

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

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

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

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

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

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

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

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

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

四帧差法通过增加参考帧的数量,可以更准确地检测运动物体,尤其在复杂背景下表现更佳。与三帧差法相比,这种方法也会增加一些计算量。

2 实践

① 代码

import cv2
import numpy as npdef 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:breakframe4_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_grayframe2_gray = frame3_grayframe3_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.lryc.cn/news/526391.html

相关文章:

  • JVM学习指南(48)-JVM即时编译
  • office 2019 关闭word窗口后卡死未响应
  • [操作系统] 深入进程地址空间
  • CVE-2025-0411 7-zip 漏洞复现
  • leetcode151-反转字符串中的单词
  • 若依 v-hasPermi 自定义指令失效场景
  • vue3中自定一个组件并且能够用v-model对自定义组件进行数据的双向绑定
  • 使用 Python 和 Tesseract 实现验证码识别
  • 谈一谈前端构建工具的本地代理配置(Webpack与Vite)
  • CentOS7非root用户离线安装Docker及常见问题总结、各种操作系统docker桌面程序下载地址
  • Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
  • +-*/运算符优先级计算模板
  • GPT 结束语设计 以nanogpt为例
  • FastDFS的安装及使用
  • C++ lambda表达式
  • react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求
  • Python的泛型(Generic)与协变(Covariant)
  • Python Typing: 实战应用指南
  • OpenEuler学习笔记(六):OpenEuler与其他Linux服务器的区别是什么?
  • 如何使用CRM数据分析和洞察来支持业务决策和市场营销?
  • MyBatis和JPA区别详解
  • SVN客户端使用手册
  • VsCode安装文档
  • 豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”
  • 【动态规划】--- 斐波那契数模型
  • 生信软件管家——conda vs pip
  • 代码随想录——串
  • 詳細講一下RN(React Native)中的列表組件FlatList和SectionList
  • TDengine 与上海电气工业互联网平台完成兼容性认证
  • 随机矩阵投影长度保持引理及其证明