赞
踩
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
熟悉OpenCV的小伙伴们都知道一点就是视频是由一帧一帧的图像组合而成,那么当我们传进来一个摄像头录制的图像的时候(因为摄像头录制的较为稳定),我们是不是也可以做这样的一件事:检测到那些物体或者说那些人在运动,那些物体没有在运动。也就是我们所谓的哪些是前景,那些是背景。那么我们就来具体看看背景建模都有那些方法。
首先我们来讲一下什么是帧差法:由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续两帧或者三帧图像进行像素值差分运算,不同帧对应的像素值进行相减,判断灰度值的绝对值。当绝对值超过了一定的阈值之后,既可以判断成运动目标,从而实现运动的目标检测功能。
侦差法非常简单,但是会引入噪音,和一些空洞问题。很明显两帧图像背景的部分,不可能像素值一点不变,变一点计算机都是可以识别的,所以他一定会出现一些噪音点,比如上方的图像就是出现了人的周围也出现了很多的噪音点。还有一个就是空洞问题,那么什么是一个空洞问题呢,就是上方图像中整个人都是在运动的,但是由于两帧图像中人移动的很小,把自己身体部分一部分一直处于一个黑色的状态,导致人体内部都是黑色的。没有识别出来。
流程总览:在进行前景检测前,先对背景进行训练,对图像的每一个背景都进行一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应。对于新来的像素值进行GMM匹配,如果该像素数值能够匹配其中一个高斯模型,那么就可以认为是背景,否则认为是前景,由于整个过程GMM都在不断更新学习的过程,所以对于动态背景该算法也具有一定的鲁棒性,最后通过一个有树枝摇摆的动态背景进行前景检测,会取得较好的结果。
首先我们先来看一下什么是高斯模型:
对于像素值中的一个点的展示是这样:
背景的实际分布应当是多个高斯分布混合在一起,每个高斯模型也可以带有权重。
这里我们来具体说一下为什么说是混合高斯模型,为什么要混合呢?因为当你拿到一帧图像的时候,不可能在这个图像当中就一个背景的,可能有天空,可能有绿地,可能有具体的事物。那么这些背景的对应的高斯模型都是不相同的,那么就需要混合高斯模型来做这一件事。天空这个背景对应第一个高斯模型,草地这个背景对应第三个高斯模型。都被匹配上了,那么我们就认为他是一个背景,如果都没有被高斯模型匹配上,那么我们就认为他是一个运动的。
这里面就描述了两个高斯模型。
混合高斯模型学习方法:
一般来说,我们创建的分布设定在3-5个就OK!
对于混合高斯模型来说,他有一个学习更新的过程。所以他要比帧差法要强很多。
在测试阶段,对于新来的像素点的数值,混合高斯模型中的每一个均值比较,如果差值在二倍的方差之间的话就可以认为他是一个背景,否则认为是前景。将前景赋值为255,背景赋值为0。这样就形成了一副前景二值图。
首先我们来看了一下官方标准案例。他是做了一个摄像头下的人物走动的视频,然后使用混合高斯模型进行背景建模。我们来看一下代码。
这里导入第三方库。
import numpy as np
import cv2
然后将视频导入,建立一个卷积核,并且创建混合高斯模型用于背景建模。
cap = cv2.VideoCapture('test.avi')
#形态学操作需要使用
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
#创建混合高斯模型用于背景建模
fgbg = cv2.createBackgroundSubtractorMOG2()
cv2.getStructuringElement
这个函数的第一个参数表示内核的形状。共有三种。
mog = cv2.createBackgroundSubtractorMOG2(history,varThreshold,false);
这个函数来说。
然后mog->apply(src_YCrCb, foreGround, 0.005);
然后进入循环
while(True):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
#形态学开运算去噪点
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
#寻找视频中的轮廓
contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
首先我们先来ret, frame = cap.read()
用于摄像头或视频文件中,捕获帧信息。返回的两个值分别是:
然后利用cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel
开运算。
在进行膨胀操作的时候我们介绍到了这个:
1.图像被腐蚀后,去除了噪声,但是会压缩图像。
2.对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原有形状。
*开运算(image)=膨胀(腐蚀(image))* |
开运算就是先把图像进行腐蚀操作,然后进行膨胀操作的一个过程!
如果我们对于有噪声的图像单独的进行腐蚀操作,就会对图像进行压缩,如果我们想要恢复到原始图像就要进行相同程度上的膨胀,这个操作我们就成为开运算。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。