-不管三七二十一,先上代码

-读取需要掌握的函数

# 相关函数
# cv.VideoCapture() 初始化摄像头,0开启第一个摄像头,1开启第2个摄像头,返回摄像头对象,一般会自动打开摄像头
# cap.read()    读取摄像头帧,返回值1表示是否成功读取帧,返回值2表示该帧
# cv.cvtColor(frame,mode)   转换图片的色彩空间
# cap.release() 关闭摄像头
# cap.isOpened()    检查摄像头是否打开
# cap.open()    打开摄像头
# cap.get(propld)   获得该帧的大小
# cap.set(propld,value) 设置该帧的大小
  • 基于混合高斯的原理图
    我们可以认为时域中的同一个点的像素值看做是一个像素的变化过程,由一组像素组成,如果这里只考虑灰度图的话,对于点 x 0 x_0 x0​ , y 0 y_0 y0​ 处于时间 t t t的像素历史值为

    其中 I I I代表着图像序列,在生活中,我们会遇到很多干扰因素,例如光照亮度,风吹动树叶,行走中的汽车。环境中的背景对于我们来说往往不是完全不变的。由于这种变化的产生,我们经常会发现,随着时间的推移,在图像中,也就是即随着帧数的增加,像素点的值的分布较为分散,尤其是前景与背景交叉的区域。由于像素点的变化是多个的,适应单个像素变化的高斯模型,针对二维图片来说,那将是一个多维的变化,一般高斯模型变化无法适应。那么我们将针对每一个模型进行高斯的建模,这样多个像素得到的概率密度函数为:

    K K K是该点对应的高斯模型的最大数目, w i w_i wi​是时间 t t t时的第 i i i个高斯模型的权重,即当前高斯模型对于该像素点对应的所有模型占得权重, u i , t u_{i,t} ui,t​是时间t时的第i个高斯模型的期望, ∑ i , t \sum{i,t} ∑i,t是时间 t时的第 i个高斯模型的协方差矩阵, η \eta η代表高斯概率密度方程:
  • 一般考虑到考虑到程序的空间与时间复杂度, K K K的取值一般为3-5.而且协方差矩阵被简化为

    判断一个像素点是否服从高斯分布条件:像素值是否位于高斯分布的2.5倍标准差内。对于每个像素点对应的高斯模型,如果该像素值匹配到了某个高斯模型,则更新公式如下:



    对于没有匹配到的高斯模型,其方差与期望不变,权重的更新按照上述公式。其中当像素点匹配了某个高斯模型的时候 a ( M k , t ) a(M{k,t}) a(Mk,t)设置值为1,否则值为0。
    每个像素值对应的各个高斯分布的参数会一直发生改变,当一个物体趋于静止的时候,对应的像素高斯分布的方差会趋于更小,其对应的权重会趋于变得更大,相对于一个运动的物体,他一般不会匹配到像素对应的高斯模型,运动的物体会让高斯模型的方差变得更大,权重变得更低。

我们按照高斯模型的权重与方差的比值进行降序排列,由阈值T(程序中取值为0.7)选出B个高斯分布作为当前像素判断是否属于背景的模型:
如果一个新的像素值服从该B 个高斯模型中的某一个,我们就认为该像素属于背景。但是如果该像素服从某个高斯分布,但是该高斯分布位于该B 个高斯模型之后,该像素仍然会被判定为前景。T的取值不宜过大,否则会产生一个多峰分布模型,背景模型如果是单峰值的话,会选出一个可能性最高的高斯分布。

效果图
-提取效果图

上代码

import cv2 as cv
import numpy as npvideo = cv.VideoCapture(0,cv.CAP_DSHOW)
# 设置编码格式
# MP4
fourcc = cv.VideoWriter_fourcc(*"mp4v")
# avi
fourcc_2 = cv.VideoWriter_fourcc(*'XVID')
out_video = cv.VideoWriter('output.mp4',fourcc, 20.0, (640,480))
out_video_2 = cv.VideoWriter('ori.avi',fourcc, 20.0, (640,480))# 背景减法器 基于自适应混合高斯背景建模的背景减除法
# history:用于训练背景的帧数,默认为500帧,如果不手动设置learningRate,history就被用于计算当前的learningRate,此时history越大,learningRate越小,背景更新越慢;
# varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般默认16,如果光照变化明显,如阳光下的水面,建议设为25,36,具体去试一下也不是很麻烦,值越大,灵敏度越低;
# detectShadows:是否检测影子,设为true为检测,false为不检测,检测影子会增加程序时间复杂度,如无特殊要求,建议设为false
backsub = cv.createBackgroundSubtractorMOG2(history=500,varThreshold=16,detectShadows=False)while True:# ret 读取状态,frame image dataret,frame = video.read()# 获取掩码if ret:mask = backsub.apply(frame)# print(frame.shape)# print(mask.shape)# 扩充维度mask = np.expand_dims(mask,axis=2).repeat(3,axis=2)out_video.write(mask)out_video_2.write(frame)cv.imshow("frame",mask)if cv.waitKey(30) & 0xFF ==ord('q'):break
#     释放资源
video.release()
out_video.release()
out_video_2.release()
cv.destroyAllWindows()
```

Opencv实战之混合高斯前景背景分割算法相关推荐

  1. 前景背景分割——ostu算法的原理及实现 OpenCV (八)

    OpenCV [八]--前景背景分割--ostu算法的原理及实现 实验结果 代码实现 实现原理 参考资料 实验结果 代码实现 #include<opencv2/opencv.hpp> #i ...

  2. OpenCV中的混合高斯算法原理

    申明:以下内容为笔者翻译自国际会议论文,鉴于本人水平有限,翻译难免有误,请大家多多包容. 原文为: An Improved Adaptive Background Mixture Model for  ...

  3. (OpenCV+Python)--目标跟踪,背景分割器:KNN、MOG2和GMG

    OpenCV提供了一个称为BackgroundSubtractor的类,在分割前景和背景时很方便. 在OpenCV3中有三种背景分割器:K-Nearest(KNN).Mixture of Gaussi ...

  4. 【笔记】opencv的python使用 腐蚀模糊背景分割等处理图像

    概括 从概念上讲,一个字节能表示0到255的整数.目前,对于所有的实时图像应用而言, 虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.array类型的二维或三维 ...

  5. 机器学习(八)——在线学习、K-Means算法、混合高斯模型和EM算法

    http://antkillerfarm.github.io/ 贝叶斯统计和规则化(续) p(θ|S)p(\theta\vert S)可由前面的公式得到. 假若我们要求期望值的话,那么套用求期望的公式 ...

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

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

  7. OpenCV中高斯混合背景建模算法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 引用地址:http://blog.csdn.net/chuhang_zhqr/article/details/51060745 ...

  8. 【opencv】(11) 背景建模,帧差法、混合高斯模型,实战:行人检测,附python完整代码和数据集

    各位同学好,今天和大家分享一下opencv背景建模相关操作.主要介绍两种背景建模方法,帧差法和混合高斯模型. 案例简介:现有一份路口摄像机拍摄的行人流视频,通过背景建模方法,区分背景和前景,完成行人识 ...

  9. OpenCV python GrabCut算法提取前景背景图片

    OpenCV python GrabCut算法提取前景背景图片 处理图片:[lena_color.jpg] 手动mask[mask.jpg] import numpy as np import cv2 ...

最新文章

  1. Best Time to Buy and Sell Stock II
  2. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
  3. Mybatis Plus为什么提供BaseMapper和IService两个相似CRUD操作的接口?
  4. k8s Service的类型和实现流程图解
  5. Gateway网关-全局过滤器
  6. 一个应用程序和另一个应用程序apk文件信息
  7. 谷歌AI算法 助力可控核聚变研究
  8. HDU 1576 A/B(数论简单题,求逆元)
  9. HTML inline 与block元素
  10. 数字图像处理技术与人脸识别
  11. PL/SQL中declare、begin关键字解释
  12. 下个时代的前端研发,效率还能提升。PxCook 3.0,最高效的设计研发利器
  13. Ps橡皮擦的使用说明
  14. element ui 表格头部内容不换行
  15. AMS5601开发 AB角度磁编码器
  16. Java学习笔记-多态的具体体现
  17. 霍尔开关在新型汽车尾门电动推杆中的应用
  18. 计算机主机的硬盘件,硬盘组件、硬盘减振装置以及计算机主机的制作方法
  19. 一个北京24岁女孩的征男友要求!
  20. 被动信息收集----指纹识别(CMS识别)

热门文章

  1. Flutter 游戏教程之使用 Flutter 和 Flame 重现著名的 T-Rex 游戏
  2. textarea的取值赋值
  3. neovim及coc.nvim自动补全初探
  4. linux alarm 多个,linux alarm定时设置
  5. 零售终端,新零售的未来
  6. iOS 15.4 更新比我们预期的要大得多还有 7 个有意思的变化
  7. 现代软件工程 第一周作业
  8. C#面向对象简单坦克大战(创意)
  9. 种子生长相关算法实现
  10. Visual Basic简介