详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取
Posted 昊虹图像算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解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中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
以上是关于详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取的主要内容,如果未能解决你的问题,请参考以下文章
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::BackgroundSubtractorKNN,并利用它实现对道路监控视频前景/背景的提取
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取
OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。
OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。
OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorLSBP的使用示例代码及运行效果
OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGSOC的使用示例代码及运行效果