详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取

关于类cv::bgsegm::BackgroundSubtractorGMG的大概算法原理,我已在博文https://blog.csdn.net/wenhao_ir/article/details/124991529进行了介绍,这里就不多说了。

下面介绍其成员函数。

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

其特有的成员函数如下:

virtual double cv::bgsegm::BackgroundSubtractorGMG::getBackgroundPrior( ) const

成员函数getBackgroundPrior()用于返回每个像素是背景像素的先验概率。

virtual double cv::bgsegm::BackgroundSubtractorGMG::getDecisionThreshold( ) const

成员函数getDecisionThreshold()用于返回判断阈值。该值用于判断像素是否属于前景。

virtual double cv::bgsegm::BackgroundSubtractorGMG::getDefaultLearningRate(	) const

成员函数getDefaultLearningRate()用于返回算法的学习率,即背景的更新速率。这个值在博文https://blog.csdn.net/wenhao_ir/article/details/125007017中对函数apply()介绍时已经介绍过了,这里就不多说了。

virtual int cv::bgsegm::BackgroundSubtractorGMG::getMaxFeatures( ) const

成员函数getMaxFeatures() 用于返回要在直方图中保持的不同颜色的总数,要更进一步了解这个值的作用,只有去啃这个算法的论文。

virtual double cv::bgsegm::BackgroundSubtractorGMG::getMaxVal( ) const

成员函数getMaxVal()用于返回算法认为的图像序列中像素的最大值,比如0~1范围内的1或0~255范围的255.要更进一步了解这个值的作用,也只有去啃这个算法的论文。博主认为如果像素的值高于这个值,那么它会被置为这个最大值或者抛弃处理,到底是什么,只有去啃这个算法的论文。

virtual double cv::bgsegm::BackgroundSubtractorGMG::getMinVal(	) const

成员函数getMinVal()用于返回算法认为的图像序列中像素的最小值,通常这个值为0。博主认为如果像素的值低于这个值,那么它会被置为这个最小值或者抛弃处理,到底是什么,只有去啃这个算法的论文。

virtual int cv::bgsegm::BackgroundSubtractorGMG::getNumFrames( ) const

成员函数getNumFrames()用于返回用于初始化背景模型的帧数。由此可见这个类的前几帧背景窗口将是黑色窗口。

virtual int cv::bgsegm::BackgroundSubtractorGMG::getQuantizationLevels(	) const

成员函数getQuantizationLevels()用于返回用于颜色空间量化的参数。它相当于是每个通道直方图的hist值。

virtual int cv::bgsegm::BackgroundSubtractorGMG::getSmoothingRadius( ) const

成员函数getSmoothingRadius()用于返回用于形态学操作的核半径。

virtual bool cv::bgsegm::BackgroundSubtractorGMG::getUpdateBackgroundModel( ) const

成员函数getUpdateBackgroundModel()用于返回背景模型更新的状态。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setBackgroundPrior(double bgprior)	

成员函数setBackgroundPrior()用于设置BackgroundPrior的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setDecisionThreshold(double thresh)	

成员函数setDecisionThreshold()用于设置DecisionThreshold的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setDefaultLearningRate(double lr)	

成员函数setDefaultLearningRate()用于设置DefaultLearningRate的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setMaxFeatures(int maxFeatures)	

成员函数setMaxFeatures()用于设置MaxFeatures的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setMaxVal(double val)	

成员函数setMaxVal()用于设置MaxVal的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setMinVal(double val)	

成员函数setMinVal()用于设置MinVal的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setNumFrames(int nframes)	

成员函数setNumFrames()用于设置NumFrames的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setQuantizationLevels(int nlevels)	

成员函数setQuantizationLevels()用于设置QuantizationLevels的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setSmoothingRadius(int radius)	

成员函数setSmoothingRadius()用于设置SmoothingRadius的值,该值的意义上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorGMG::setUpdateBackgroundModel(bool update)	

成员函数setUpdateBackgroundModel()用于设置UpdateBackgroundModel的值,该值的意义上面已经介绍了。

在给出示例代码前,还需介绍下函数,它的原型如下:

Ptr<BackgroundSubtractorGMG> cv::bgsegm::createBackgroundSubtractorGMG(
									     int initializationFrames = 120,
									     double decisionThreshold = 0.8)		

两个参数的意义上面已经介绍了。

这个类的C++使用示例代码暂时不能提供给大家,原因是OpneCV3官方发布的编译好的配置环境下并没有bgsegm命名空间及其下类和方法的定义,截图如下:
在这里插入图片描述
可能的解决方法是自己Cmake OpenCV3的源码,并且在编译时把模块bgsegm加入。

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

# 博主微信/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')

# 创建一个背景分割器
initializationFrames = 50
pBackgroundGMG = cv.bgsegm.createBackgroundSubtractorGMG(initializationFrames)

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 = pBackgroundGMG.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()

运行结果如下图所示:
前50帧前景图像为黑窗。
在这里插入图片描述
在这里插入图片描述
为了方便大家观察这种算法的效果,博主录了个视频供大家查看,视频在线观看和下载链接如下:
https://pan.baidu.com/s/1x_DukLv6kWF5iUwxOyn3xQ?pwd=wdo8

从运行结果来看,这个算法对于道路场景的前景提取效果并不好。算法的作者也说了,他们的应用场景是“天际中庭中响应灵敏的音频艺术装置”。

补说说明两点:
①OpenCV的Python库对于类cv::bgsegm::BackgroundSubtractorGMG,没有成员函数getBackgroundImage(),所以我们只能看到得到前景,而看不到背景。
②从上面的成员函数可以看出,这个类没有阴影检测的功能,所以不能去除汽车的影子。

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

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/125069369
今日推荐