opencv学习:利用帧差法实现对视频移动物体的识别、帧差法的优缺点及完整代码实现

news2024/12/23 14:22:07

基本概念

        帧差法是视频处理和计算机视觉领域中用于移动检测的一种简单而有效的方法。它主要依赖于连续视频帧之间的像素差异来识别场景中的移动对象。

帧差法

  • 定义:帧差法通过比较连续的视频帧之间的差异来检测移动对象。基本思想是移动对象会在连续的帧之间产生显著的位置变化,而静止背景则变化不大。

代码步骤

  1. 读取视频:使用cv2.VideoCapture函数读取视频文件test.avi
    cap=cv2.VideoCapture('test.avi')
    kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
  2. 创建背景减除器:使用cv2.createBackgroundSubtractorMOG2创建一个MOG2背景减除器对象。
    # 创建一个背景减除器对象
    fgbg=cv2.createBackgroundSubtractorMOG2()
  3. 逐帧处理视频:通过无限循环读取视频的每一帧,并使用背景减除器处理当前帧,得到前景掩码。
    # 开始一个无限循环,用于逐帧处理视频。
    while (True):
        # ret是一个布尔值,表示是否成功读取帧,frame是读取的帧图像。
        ret,frame=cap.read()
        cv2.imshow('1',frame)
        # 使用背景减除器处理当前帧,得到前景掩码。
        fgmask=fgbg.apply(frame)
  4. 形态学开运算:对前景掩码应用形态学开运算,以去除小的噪点和分离粘连的物体。
    # 对前景掩码应用形态学开运算,以去除小的噪点和分离粘连的物体。
        fgmask_new=cv2.morphologyEx(fgmask,cv2.MORPH_OPEN,kernel)
        cv2.imshow('3',fgmask_new)
  5. 查找轮廓:在处理后的前景掩码中查找轮廓。
    # 在处理后的前景掩码中查找轮廓。_是用于忽略返回值的占位符,contours是找到的轮廓列表,h是轮廓的层次结构。
        _,contours,h=cv2.findContours(fgmask_new,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
  6. 轮廓筛选:遍历所有找到的轮廓,计算轮廓的周长,如果周长大于188,则认为是一个移动对象,并计算其边界矩形,在原始帧上绘制一个绿色矩形框以标识移动对象。
        for c in contours:#遍历所有找到的轮廓。
            perimeter=cv2.arcLength(c,True)#计算当前轮廓的周长
            if perimeter>188:
                x,y,w,h=cv2.boundingRect(c)
                #在原始帧上绘制一个绿色矩形框
                fgmask_new_rect=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.imshow('4',fgmask_new_rect)
        k=cv2.waitKey(60)
  7. 退出条件:按下ESC键(ASCII码为27)跳出循环。
    # 按下ESC键(ASCII码为27),则跳出循环
        if k==27:
            break

运行结果

帧差法优缺点

优点

  1. 简单高效:算法简单,易于实现,计算量小,适合实时处理。
  2. 实时性能:由于计算量小,帧差法可以快速处理视频帧,适用于实时视频监控系统。
  3. 无需背景模型:不需要预先学习或建模背景,直接比较连续帧的差异。
  4. 适应性:对于视频中的动态变化,如移动对象的出现和消失,帧差法能够快速响应。
  5. 易于调整:通过调整阈值,可以控制检测的灵敏度,以适应不同的监控环境和需求。

缺点

  1. 光照敏感:光照变化(如由于天气或时间变化导致的光照变化)可能会影响帧差法的性能,导致错误的移动检测。
  2. 阴影问题:移动对象的阴影可能被错误地检测为移动物体,引起误报。
  3. 背景变化:如果背景发生变化(如植物的生长、人流的变化),帧差法可能无法正确区分背景和移动对象。
  4. 摄像头抖动:摄像头的微小移动可能导致帧差法检测到错误的移动。
  5. 动态背景:在有动态背景(如水面、旗帜)的场景中,帧差法可能难以区分背景的自然运动和真正的移动对象。
  6. 相似颜色:如果移动对象的颜色与背景颜色相似,帧差法可能无法检测到。
  7. 快速移动对象:对于快速移动的对象,由于帧率的限制,可能会发生漏检。
  8. 遮挡问题:当一个移动对象被另一个对象遮挡时,帧差法可能无法检测到被遮挡的部分。
  9. 分辨率限制:在分辨率较低的视频中,重要的细节可能会丢失,导致帧差法的性能下降。
  10. 噪声敏感:图像噪声可能会增加帧差图像中的假阳性,尤其是在低对比度区域。

完整代码

cap=cv2.VideoCapture('test.avi')
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))

# 创建一个背景减除器对象
fgbg=cv2.createBackgroundSubtractorMOG2()
# 开始一个无限循环,用于逐帧处理视频。
while (True):
    # ret是一个布尔值,表示是否成功读取帧,frame是读取的帧图像。
    ret,frame=cap.read()
    cv2.imshow('1',frame)
    # 使用背景减除器处理当前帧,得到前景掩码。
    fgmask=fgbg.apply(frame)
    # 对前景掩码应用形态学开运算,以去除小的噪点和分离粘连的物体。
    fgmask_new=cv2.morphologyEx(fgmask,cv2.MORPH_OPEN,kernel)
    cv2.imshow('3',fgmask_new)

    # 在处理后的前景掩码中查找轮廓。_是用于忽略返回值的占位符,contours是找到的轮廓列表,h是轮廓的层次结构。
    _,contours,h=cv2.findContours(fgmask_new,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:#遍历所有找到的轮廓。
        perimeter=cv2.arcLength(c,True)#计算当前轮廓的周长
        if perimeter>188:
            x,y,w,h=cv2.boundingRect(c)
            #在原始帧上绘制一个绿色矩形框
            fgmask_new_rect=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.imshow('4',fgmask_new_rect)
    k=cv2.waitKey(60)
    # 按下ESC键(ASCII码为27),则跳出循环
    if k==27:
        break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于unbantu操作系统下的docker安装全教程

目录 检查docker安装环境 1.检查服务器的CPU和操作系统版本是否为docker支持的版本。 2.卸载已有的docker 安装docker 1.创建目录 2.下载GPG秘钥 3.添加Docker的APT源 4.更新APT包索引并安装Docker 5.运行docker并配置镜像加速器 安装docker-compose 使用apt命令下载…

MAC中滚轮方向和Windows相反的解决方案

MACOS外接鼠标滚轮方向与Windows相反 MAC中滚轮方向和Windows相反,很难受 在使用MACOS操作系统时,滚轮的方向和Windows系统中的相反,这一点常常让人感到不适应和困惑。当第一次切换到MAC电脑时,许多用户会发现他们的习惯滚动操作…

LORD-GX5-45 ROS安装

1、驱动安装 https://github.com/LORD-MicroStrain/MSCL 上述下载 x64:C&#xff0c;在下载完的deb文件下执行 sudo dpkg -i <PACKAGE_NAME>.deb #install MSCL sudo apt install -f #install dependencies2、源码安装 #新建工作空间 mkdir -p ~…

Windows系统编程(三)线程并发

进程与线程 进程&#xff1a;直观的说就是任务管理器中各种正在运行的程序。对于操作系统来说&#xff0c;进程仅仅是一个数据结构&#xff0c;并不会真实的执行代码 线程&#xff1a;通常被称作但并不真的是轻量级进程或实际工作中的进程&#xff0c;它会真实的执行代码。每…

环形链表(c语言)

1.//环形链表 //输入&#xff1a;head [3,2,0,-4], pos 1 //输出&#xff1a;true //解释&#xff1a;链表中有一个环&#xff0c;其尾部连接到第二个节点。 //输入&#xff1a;head [1, 2], pos 0 //输出&#xff1a;true //解释&#xff1a;链表中有一个环&#xff0c;其…

保留字作为数据表字段导致的问题!!!

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

考拉悠然携手中国系统打造城市智能中枢,让城市更聪明更智慧

在21世纪的科技浪潮中&#xff0c;智慧城市建设已成为推动城市现代化进程的重要引擎。随着人工智能技术的飞速发展&#xff0c;AI正以前所未有的速度融入智慧城市管理的每一个角落&#xff0c;从交通出行到公共安全&#xff0c;从环境保护到城市管理&#xff0c;无一不彰显着智…

SCRM呼叫中心高保真Axure原型 源文件分享

在数字化时代&#xff0c;客户关系管理&#xff08;CRM&#xff09;对于企业的成功至关重要。SCRM呼叫中心后台作为一款专为CRM设计的软件原型&#xff0c;致力于为企业提供高效、智能的客户沟通解决方案。本文将详细介绍该产品的核心功能及其对企业提升客户满意度和销售业绩的…

《Linux从小白到高手》理论篇:Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识&#xff0c;并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如Oracle DB&#xff0c;启动Oracle实例服务后&#xff0c;就会有多个进程。 Linux进程分类 在 Linux…

如何下载和安装CLion,图文详解

一、下载 登录JetBrains官网&#xff0c;下载最新版本的Clion&#xff0c;Clion目前没有社区版&#xff0c;都是专业版。 二、安装 1、启动Clion安装程序&#xff0c;下一步。 2、修改安装目录&#xff0c;下一步。 3、创建桌面快捷方式&#xff0c;更新PATH变量&#xff0…

Transforms(一)

一、概念 transforms就像是一个工具箱&#xff0c;里面装有很多类 &#xff08;比如&#xff1a;totensor、resize等&#xff0c;可以在结构里查看到一个列表&#xff09;&#xff0c;类就是工具。 但是类不能直接使用&#xff0c;要创建其实例对象之后才能调用&#xff08;to…

国庆假期互联网产品故障事件(神州租车、国航、公邮)盘点

一晃七天假期已经过去了&#xff0c;节后第一天大家股市都赚了盆满钵满吧&#xff0c;盘点一下国庆期间互联网产品故障吧。 一、神州租车&#xff1a; 10 月 2 日&#xff0c;有网友反馈神州租车今日出现服务问题&#xff0c;“App 小程序都崩了”。 对此&#xff0c;神州租车…

【自然语言处理】(2) --Word2Vec实现

文章目录 Word2Vec实现一、训练模型1. 数据预处理2. 构建训练数据3. 搭建word2vec网络&#xff08;CBOW&#xff09;4. 装配设备5. 构建训练模型6. 优化器7. 损失函数8. 迭代模型 二、测试模型1. 预测单词2. 生成词嵌入词典3. 保存训练后的词向量 总结 Word2Vec实现 Word2Vec …

『网络游戏』业务系统基类【08】

创建脚本&#xff1a;SystemRoot.cs 编写脚本&#xff1a;SystemRoot.cs 修改脚本&#xff1a;LoginSys.cs 修改脚本&#xff1a;WindowRoot.cs 运行项目 - 效果相同 本章结束

付费计量系统实体和接口(5)

13.7.2 Sub-classification of the Accounting functions 收费功能的子分级 The Accounting function maintains a current balance of all credit and charge transactions performed in the payment meter. These activities together constitute the Meter Accounting Proce…

小蒋聊技术——DevOps 是什么“玩意”?

时间&#xff1a;2024年 10月 08日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术”&#xff0c;我是小蒋&#xff01;今天我们来聊聊一个时下特别火的概念—…

渐开线起始圆和基圆之间有约束关系吗?

最近看到了一个问题&#xff1a;“渐开线起始圆和基圆之间有约束关系吗&#xff1f;有起始圆要比基圆大某个固定数值这么一说吗&#xff1f;”&#xff0c;这期咱们就来说说这个话题&#xff1a; 如上图所示&#xff1a;一对圆柱齿轮副中&#xff0c;一个齿轮的渐开线起始圆是…

什么是数据编织

What Is Data Fabric? 【dataCamp】 What Is Data Fabric? Data fabric is a unified data architecture that connects disparate data sources, simplifying access and management while ensuring consistency and security across the entire data landscape. Data Fa…

cs61b学习 part3

如果你有许多list&#xff0c;这里将会是大量的时间&#xff0c;我指的是对于单向链表查找时间复杂度O(N)相对于数组O(1)的时间复杂度会慢一些 所以这究竟是顺序表的编写还是链表的改进? IntList public class IntList {public int first;public IntList rest;public IntLis…

webGL进阶(二)物体运动

效果&#xff1a; 模拟时钟效果。 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpo…