目录

一、帧差法

二、代码

2.1 二帧差法

2.2 三帧差法

三、总结


一、帧差法

计算帧之间的差异,或考虑“背景帧”与其他帧之间的差异。

当视频中存在移动物体的时候,相邻帧(或相邻三帧)之间在灰度上会有差别,求取两帧图像灰度差的绝对值,则静止的物体在差值图像上表现出来全是0,而移动物体特别是移动物体的轮廓处由于存在灰度变化为非0,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

因此可分为二帧差法和三帧差法。

相邻帧间差分法直接对相邻的两帧图像做差分运算,并取差分运算的绝对值构成移动物体,优点是运算快速,实时性高,缺点是无法应对光照的突变,物体间一般具有空洞。

三帧差法是在相邻帧差法基础上改进的算法,在一定程度上优化了运动物体双边,粗轮廓的现象,相比之下,三帧差法比相邻帧差法更适用于物体移动速度较快的情况,比如道路上车辆的智能监控。三帧差法基本实现步骤如下:首先前两帧图像做灰度差,然后当前帧图像与前一帧图像做灰度差,最后1和2的结果图像按位做“与”操作,进行阈值判断和得出运动目标。

二、代码

2.1 二帧差法

'''
相邻帧间差分法直接对相邻的两帧图像做差分运算,并取差分运算的绝对值构成移动物体,优点是运算快速,实时性高,缺点是无法应对光照的突变,物体间一般具有空洞。
'''# 导入必要的软件包
import cv2# 视频文件输入初始化
filename = "E:\Python-Code/videodataset/enn.mp4"
camera = cv2.VideoCapture(filename)# 视频文件输出参数设置
# out_fps = 12.0  # 输出文件的帧率
# fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')
# out1 = cv2.VideoWriter('v1.avi', fourcc, out_fps, (500, 400))
# out2 = cv2.VideoWriter('v2.avi', fourcc, out_fps, (500, 400))# 初始化当前帧的前帧
lastFrame = None# 遍历视频的每一帧
while camera.isOpened():# 读取下一帧(ret, frame) = camera.read()# 如果不能抓取到一帧,说明我们到了视频的结尾if not ret:break# 调整该帧的大小# frame = cv2.resize(frame, (500, 400), interpolation=cv2.INTER_CUBIC)# 如果第一帧是None,对其进行初始化if lastFrame is None:lastFrame = framecontinue# 计算当前帧和前帧的不同frameDelta = cv2.absdiff(lastFrame, frame)# 当前帧设置为下一帧的前帧lastFrame = frame.copy()# 结果转为灰度图thresh = cv2.cvtColor(frameDelta, cv2.COLOR_BGR2GRAY)# 图像二值化thresh = cv2.threshold(thresh, 25, 255, cv2.THRESH_BINARY)[1]''' #去除图像噪声,先腐蚀再膨胀(形态学开运算) thresh=cv2.erode(thresh,None,iterations=1) thresh = cv2.dilate(thresh, None, iterations=2) '''# 阀值图像上的轮廓位置# binary, cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历轮廓for c in cnts:# 忽略小轮廓,排除误差if cv2.contourArea(c) < 300:continue# 计算轮廓的边界框,在当前帧中画出该框(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示当前帧cv2.imshow("frame", frame)cv2.imshow("frameDelta", frameDelta)cv2.imshow("thresh", thresh)# 保存视频# out1.write(frame)# out2.write(frameDelta)# 如果q键被按下,跳出循环if cv2.waitKey(200) & 0xFF == ord('q'):break# 清理资源并关闭打开的窗口
# out1.release()
# out2.release()
camera.release()
cv2.destroyAllWindows()

2.2 三帧差法

'''
三帧差法是在相邻帧差法基础上改进的算法,在一定程度上优化了运动物体双边,粗轮廓的现象,相比之下,三帧差法比相邻帧差法更适用于物体移动速度较快的情况,比如道路上车辆的智能监控。
三帧差法基本实现步骤如下:首先前两帧图像做灰度差,然后当前帧图像与前一帧图像做灰度差,最后1和2的结果图像按位做“与”操作,进行阙值判断和得出运动目标。
'''# 导入必要的软件包
import cv2# 视频文件输入初始化
filename = "E:\Python-Code/videodataset/enn.mp4"
camera = cv2.VideoCapture(filename)# 视频文件输出参数设置
# out_fps = 12.0  # 输出文件的帧率
# fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')
# out1 = cv2.VideoWriter('v3.avi', fourcc, out_fps, (500, 400))
# out2 = cv2.VideoWriter('v4.avi', fourcc, out_fps, (500, 400))# 初始化当前帧的前两帧
lastFrame1 = None
lastFrame2 = None# 遍历视频的每一帧
while camera.isOpened():# 读取下一帧(ret, frame) = camera.read()# 如果不能抓取到一帧,说明我们到了视频的结尾if not ret:break# 调整该帧的大小# frame = cv2.resize(frame, (500, 400), interpolation=cv2.INTER_CUBIC)# 如果第一二帧是None,对其进行初始化,计算第一二帧的不同if lastFrame2 is None:if lastFrame1 is None:lastFrame1 = frameelse:lastFrame2 = frameglobal frameDelta1  # 全局变量frameDelta1 = cv2.absdiff(lastFrame1, lastFrame2)  # 帧差一continue# 计算当前帧和前帧的不同,计算三帧差分frameDelta2 = cv2.absdiff(lastFrame2, frame)  # 帧差二thresh = cv2.bitwise_and(frameDelta1, frameDelta2)  # 图像与运算thresh2 = thresh.copy()# 当前帧设为下一帧的前帧,前帧设为下一帧的前前帧,帧差二设为帧差一lastFrame1 = lastFrame2lastFrame2 = frame.copy()frameDelta1 = frameDelta2# 结果转为灰度图thresh = cv2.cvtColor(thresh, cv2.COLOR_BGR2GRAY)# 图像二值化thresh = cv2.threshold(thresh, 25, 255, cv2.THRESH_BINARY)[1]# 去除图像噪声,先腐蚀再膨胀(形态学开运算)thresh = cv2.dilate(thresh, None, iterations=3)thresh = cv2.erode(thresh, None, iterations=1)# 阀值图像上的轮廓位置# binary, cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历轮廓for c in cnts:# 忽略小轮廓,排除误差if cv2.contourArea(c) < 300:continue# 计算轮廓的边界框,在当前帧中画出该框(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示当前帧cv2.imshow("frame", frame)cv2.imshow("thresh", thresh)cv2.imshow("threst2", thresh2)# 保存视频# out1.write(frame)# out2.write(thresh2)# 如果q键被按下,跳出循环if cv2.waitKey(200) & 0xFF == ord('q'):break# 清理资源并关闭打开的窗口
# out1.release()
# out2.release()
camera.release()
cv2.destroyAllWindows()

三、总结

        优点是算法实现简单,程序设计复杂度低;对光线等场景变化不太敏感,能够适应各种动态环境,有着比较强的鲁棒性。

        缺点是不能提取出对象的完整区域,对象内部有“空洞”,只能提取出边界,边界轮廓比较粗,往往比实际物体要大。对快速运动的物体,容易出现鬼影的现象,甚至会被检测为两个不同的运动物体,对慢速运动的物体,当物体在前后两帧中几乎完全重叠时,则检测不到物体。

故该方法一般适用于简单的实时运动检测的情况。

这种方法也不用提前用鼠标画出一个框来,也是自动识别的,对于背景复杂的,识别效果不好,这种会把所有的运动对象都识别出来,比如风吹的树叶抖动等。

传统目标跟踪——帧差法相关推荐

  1. 基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真

    目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 目标检测:混合高斯模型与帧差法结合的算法,与单独的混合高斯模型算法作对比,体现前者的优越性 3.要求和结果:对比改进前后的算法,可以非 ...

  2. 视频目标跟踪算法matlab仿真,对比二帧差法,三帧差法,混合高斯法以及Vibe算法

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 1.1二帧差法 帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法.当监控场景中出现异常目标运动 ...

  3. 目标检测、追踪梳理:帧差法、光流法、背景减除法

    (0)总览 运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像(背景层)中提取出来.通常情况下,目标分类.跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域(前景层),因此 ...

  4. 数字图像处理拓展题目——利用Matlab实现动态目标检测 二帧差法、ViBe法、高斯混合模型法,可应用于学生递东西行为检测

    1.二帧差法实现动态目标检测 先上效果图: 利用GUI界面显示出来效果图为: 实现流程 1.利用matlab中的VideoReader函数读取视频流. 2.帧差法:获得视频帧数,用for循环对图像每相 ...

  5. 【目标追踪】三帧差法原理及实现

    三帧差法原理及实现 (一)帧差法原理及实现: (二)帧差法存在的问题: (三)三帧差法的原理: (四)三帧差法的实现代码: (五)视频中的目标追踪效果: 关注我的公众号: (一)帧差法原理及实现: 这 ...

  6. 目标检测:采用卡尔曼滤波、 帧差法 、三帧差法、 背景差分法、 meansift算法

    本程序主要包含五个算法 卡尔曼滤波. 帧差法 .三帧差法. 背景差分法. meansift算法的目标追踪跟进 并用Gui进行了系统的设计和更新 Mansift主要根据第一个数据的设计 得到目标框,然后 ...

  7. 结合帧差法与窗口搜索的车道线跟踪方法——第一篇处女座

    还好昨天舍友的提醒,抓紧时间转投别的正规杂志. 目前已经投到正规杂志社. 代码在文章发表成功之后才会公布. 之前matlab的篇,等忙过这阵子,会发百度云链接. 然鹅!可能因为投到了假的<电子器 ...

  8. ​基于matlab的目标检测 背景差分法和帧差法

    本程序实现了图像传感器的叶子抖动研究系统,利用背景差分.帧差法实现了此系统. 结果如下: 点击帧差法,显示如下: 部分程序见: gui_Singleton = 1; gui_State = struc ...

  9. Python与OpenCV(一)——基于帧差法的运动目标检测程序分析

    OpenCV提供了强大的图像处理功能,与Python的结合堪称完美... 这一次,我们试一下用帧差法来完成对运动目标的检测与跟踪. 帧差法的原理是这样的:由于摄像机采集的视频序列具有连续性的特点,所以 ...

最新文章

  1. html用户注册信息,首页-用户注册-填写注册信息
  2. vue判断a是否可点击_判断 a 和 b 里面元素是否一致:一致输出True,否则输出False...
  3. razor 怎样使用session变量_Nginx负载均衡解决session一致性问题
  4. Redis源码剖析(十一)跳表
  5. 单目相机提高标定精度的经验(转载)
  6. Codeforces Round #280 (Div. 2)
  7. jmeter之JDBC类组件
  8. 深入了解C++与C语言的区别
  9. AI2(App Inventor 2)离线版服务器单机版
  10. 聊聊汽车智能化时代的ASIL
  11. 关于opencv在vs201x中的设置 2020-02-04
  12. OpenG的特点及功能
  13. 随笔---为什么一到选课时教务系统就卡顿甚至登不上去
  14. PHP笔记——开发工具VS Code
  15. MySQL数据库基础详解
  16. 取模、乘法和除法运算在CPU和GPU上的效率
  17. 即插即涨2-3%!AC-FPN:用于目标检测的注意力引导上下文的特征金字塔网络
  18. oracle多表关联多字段update
  19. 云南大学计算机值得调剂吗,这4所211报名无人问,调剂人爆满!今年是不是你的菜?...
  20. 短期学习就能月薪过万?IT培训套路揭秘,教育机构宣传是真是假

热门文章

  1. PCB线宽与电流计算器--在线计算
  2. 计算机组成原理课程设计源码
  3. 用turtle库做游戏 笔记
  4. 期货反跟单-盘手交易规则分享
  5. postman的RestClient引用库RestSharp
  6. 5个可以称之为宝藏的学习网站,不可错过
  7. 【BZOJ3270】【高斯消元】博物馆
  8. 全球与中国血液和腹膜透析市场深度研究分析报告
  9. 【学习日记04】高数复习+学习周报
  10. IBM ServerGuide9.40 for IBM X3950 X5 安装2008 R2操作系统