IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG并利用它实现对道路监控视频前景/背景的提取 -> 正文阅读

[人工智能]详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG并利用它实现对道路监控视频前景/背景的提取

cv::bgsegm::BackgroundSubtractorMOG是基于高斯混合模型的背景与前景分割算法。

具体的算法原理可以参考下面这篇论文:
Pakorn KaewTraKulPong and Richard Bowden. An improved adaptive background mixture model for real-time tracking with shadow detection. In Video-Based Surveillance Systems, pages 135–144. Springer, 2002.
下面这篇博文是对上面这篇论文的理解:
https://blog.csdn.net/zinnc/article/details/52090501

MOG名称的来历:Mixture of Gaussian,它又称为GMM(Gaussian Mixed Model),百度百科对其有详细解释,链接 https://baike.baidu.com/item/GMM/4258031?fr=aladdin

GMM,高斯混合模型,也可以简写为MOG。高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
GMMs已经在数值逼近、语音识别、图像分类、图像去噪、图像重构、故障诊断、视频分析、邮件过滤、密度估计、目标识别与跟踪等领域取得了良好的效果 。

混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定,对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性 。
由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。
高斯分布的形状同绝大多数数据的分布形状相似,能够很好地刻画参数空间中数据的空间分布及其特性,而且高斯密度函数具有易于进行参数估计等优点,因此高斯混合模型广泛应用于模式识别和数据分析等领域 [2] 。

下面介绍其成员函数。

继承于基类cv::BackgroundSubtractor的成员函数apply()和getBackgroundImage()的详细介绍见博文:https://blog.csdn.net/wenhao_ir/article/details/125007017

其特有的成员函数如下:

 virtual double cv::bgsegm::BackgroundSubtractorMOG::getBackgroundRatio( )	const

成员函数getBackgroundRatio()用于返回算法的“背景比率”参数,它对应于论文中的TB参数。如果前景像素在大约【backgroundRatio×历史帧(即参数nframes)】中保持半常量值,则将其视为背景并作为新组件的中心添加到背景模型中。提问:什么叫半常量值(semi-constant value),这个博主也不太清楚,这个算法的论文中应该有相关介绍,感兴趣的同学可以去看一看。

virtual int cv::bgsegm::BackgroundSubtractorMOG::getHistory() const

成员函数getHistory()用于返回影响背景模型的历史帧数。

virtual int cv::bgsegm::BackgroundSubtractorMOG::getNMixtures( ) const

成员函数getNMixtures()用于返回高斯混合模型中高斯分量的个数。

virtual double cv::bgsegm::BackgroundSubtractorMOG::getNoiseSigma( ) const

成员函数getNoiseSigma()用于返回每个高斯分量的初始方差。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setBackgroundRatio(double backgroundRatio)	

成员函数setBackgroundRatio用于设置算法的“背景比率”参数,这个参数的意义在上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setHistory(int nframes)	

成员函数setHistory()用于设置影响背景模型的历史帧数。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setNMixtures(int 	nmix)	

成员函数setNMixtures()用于设置高斯混合模型中高斯分量的个数。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setNoiseSigma	(double noiseSigma)

成员函数setNoiseSigma()用于设置每个高斯分量的初始方差。

下面上示例代码:

上示例代码被迫中止,原因是OpenCV3的开发文档中虽然还有这个类,但是在OpneCV3官方发布的编译好的配置环境下却不能使用了,截图如下:
在这里插入图片描述
我们换成BackgroundSubtractorMOG2,就有定义,截图如下:
在这里插入图片描述
可能的解决方法是自己Cmake OpenCV3的源码,并且在编译时把模块bgsegm加入。这里博主就不去尝试了,如果要使用这个算法进行背景建模/前景提取,用BackgroundSubtractorMOG2替代就行了。

博主就给大家使用这个类的Python示例代码给大家吧!

在上示例代码前,还需要介绍下函数createBackgroundSubtractorMOG(),
函数createBackgroundSubtractorMOG()用于构建类createBackgroundSubtractorMOG的实例化对象,并返回对象指针。
函数createBackgroundSubtractorMOG()的原型如下:
C++原型:

Ptr<BackgroundSubtractorMOG> cv::bgsegm::createBackgroundSubtractorMOG
							(int history = 200,
							int 	nmixtures = 5,
							double 	backgroundRatio = 0.7,
							double 	noiseSigma = 0 )

Python原型如下:

retval = cv.bgsegm.createBackgroundSubtractorMOG([, history[, nmixtures[, backgroundRatio[, noiseSigma]]]])

参数意义如下:
history—影响背景模型的历史帧数。
nmixtures—高斯混合模型中高斯分量的个数。
backgroundRatio—上面介绍过了,这里就不再介绍了。
noiseSigma—每个高斯分量的初始方差。

Python示例代码如下:

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也可联系博主
# 图像处理技术交流QQ群 271891601

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.1

import cv2 as cv

# 构造VideoCapture对象
cap = cv.VideoCapture('F:/material/videos/car1.avi')

# 创建一个背景分割器
pBackgroundMOG = cv.bgsegm.createBackgroundSubtractorMOG()

while True:
    ret, frame = cap.read()  # 读取视频
    # 当所有帧读取完毕后退出循环
    if ret is False:
        print('视频读取失败或者视频已读取完毕')
        break
    else:
        frame = cv.resize(frame, (0, 0), fx=0.3, fy=0.3)
        FGMask = pBackgroundMOG.apply(frame)  # 背景分割,并得到前景图像

        current_frame = int(cap.get(cv.CAP_PROP_POS_FRAMES))
        cv.putText(frame, "Current frame:" + str(current_frame), (20, 40), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255))

        cv.imshow('frame', frame)  # 显示原始帧
        cv.imshow('FGMask', FGMask)  # 显示得到的前景图像

    if cv.waitKey(10) & 0xff == 27:  # 按ESC键退出
        break

cap.release()
cv.destroyAllWindows()

代码中用到的视频下载链接:https://pan.baidu.com/s/1X08cwwSE4DUvzT0XvHvpvw?pwd=9yyq

运行结果如下:
在这里插入图片描述
为了方便大家观察这种算法的效果,博主录了个视频供大家查看,视频在线观看和下载链接如下:
https://pan.baidu.com/s/1LBcadRG2gDX9yGR-xS9jQQ?pwd=9ued

补充说明一点:这个类没有阴影检测的功能,所以不能去除汽车的影子。

延伸阅读:
OpenCV3.0中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:13:42  更:2022-06-01 15:14:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:32:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码