python加减法视频教程免费_一起学opencv-python三十八(视频分析:背景减法)

首先要纠正一下上一讲的一些地方。

这里的移动其实并不仅仅是一个点的移动,那个中心线其实是不动的,动的是那些亮度值。

左边图是在(x,y)附近的像素点亮度值分布和二次曲线拟合情况,这是一维情况,二维应该是一个抛物面了。右边图是在下一帧图像,同样是在(x,y)附近的点的二次曲线拟合情况,移动的不是虚线而是像素点的亮度值。这里两帧同一点系数的关系推导还是基于三条假设,1是亮度不变,2是小运动,3是空间连续。这个推导并不是很难,用上面的图来做例子,基于三条假设,我们可以认为a不变,因为a只是决定抛物线的开口方向和大小的,虽然严格来说按照离中心点越近,高斯权重越大的原则,第二帧再拟合的结果还真不一定保证a不变,但是因为是小运动,所以近似看做不变,然后就是b之间的关系,我们都知道抛物线的对称轴是

上图相当于是把抛物线右移了d,则有:

因为a1=a2,就可以得到b2=b1-2a1d了。至于求c的值,应该有移动前后对称轴的函数值不变,有:

不过其实不用求c,因为最后求d不需要c,基于上面的分析知识,我们用前后两帧同一点处拟合的二次函数的系数来得到d,上面都是一维的情形,二维的情形稍微复杂一些,不过原理一样。

回顾学过的目标跟踪的一些知识,camshift是根据直方图反向投影来的,对于跟踪特定目标还是很有用的,稀疏光流需要用到特征点,而且这些特征点的运动得一样或者差不多,不然求出来的[u,v]完全就没有意义了,也是用于特定目标定的跟踪。而稠密光流可以全面的得出图像中每一个点的运动情况,不过花费时间很长。这一讲的内容其实还是目标跟踪,不过应用场景是只跟踪前景中的移动物体,它既不是只针对某个物体,也不是像稠密光流那样无论前景背景都跟踪,也可以说这种方法是前景分割。另外,我还想再详细说一下pyrMeanShiftFiltering这个函数,这个函数最早见于:

可以作为一种边缘保留滤波方法。参考了https://blog.csdn.net/dcrmg/article/details/52705087

给定一个多维的数据集,维度信息分别是像素空间位置x,y和彩色信息B,G,R,meanshift可以通过在五维空间扫描找到找到最高密度的一个簇。注意到,空间变量(x,y)和色彩变量BGR的值在变化范围上会有很大的差别,因为颜色就是0-255(如果用uint8),而x,y就很灵活了,和图像大小有关系。因此,meanshift需要有不同的空间半径和色彩半径或者说范围。当meanshift扫描区域移动的时候,所有的满足空间和色菜范围的点的色彩值都会变成用meanshift算法收敛到的峰值色彩。

这样的话,其实整张图是会变亮的。

还是可以看出来图像变亮了。这个其实就是对满足空间和颜色条件的点进行滤波,让它们都取一个值,这个值的确定是用了meanshift,因为meanshift的特性,一般来说是会让图片变亮的,还有它会把符合条件的一块都变成一个颜色,所以看起来会有油画的感觉。

如果一个点附近的点色彩差别比较大,就不在五维的超球体内,也就不会被滤波。前面那个博主其实理解的不到位,因为这个是可以用来分割区域的,之所以要用金字塔,就是为了分割的效果好一些。下面是分割区域的一个例子:

说白了用这种方法分割就是根据空间位置和颜色相近度来分割的。

背景减法

背景减法是许多基于视觉的应用中的主要预处理步骤。例如,考虑像访客计数器这样的情况,其中静态摄像机获取进入或离开房间的访客的数量,或者交通摄像机提取关于车辆的信息等。在所有这些情况下,首先需要提取人或车辆。从技术上讲,您需要从静态背景中提取移动的前景。如果你有一个背景图像,如没有访客的房间图像,没有车辆的道路图像等,这是一个简单的工作。只需从背景中减去新图像即可,因为摄像头是静态的。您可以单独获取前景对象。但在大多数情况下,你可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当车辆有阴影时会变得更加复杂。由于阴影也在移动,简单的减法也会将其标记为前景。这使事情复杂化。为此,我们引入了几种算法。OpenCV已经实现了三种非常容易使用的算法。我们将逐一看到它们。参考https://www.jianshu.com/p/12533816eddf

https://max.book118.com/html/2013/0301/3394372.shtm

https://blog.csdn.net/App_12062011/article/details/51843036

关于GMM和EM,可以参考

MOG2的k是自适应的,我推测可能是这样做的,一开始先指定一个k,先进行混合高斯建模,EM算法迭代几次后,然后看看属于每一类的点的概率,如何这个概率太小,就需要取消这个的类,如果有同样的几个点属于不同类的概率都很大,就要考虑合并这几个类了。

GMG用的是贝叶斯概率模型,它也需要先建模学习,然后还是根据概率来分辨是前景还是背景。

中间我知道有一些公式挂掉了,这个我也不想打了,思路我们学习一下就行了。这种方式是动态学习的,和Grabcut不一样,背景减法都需要经过一定帧数的背景建模学习过程,至于怎么学习的,我的想法是,背景是不动的,而我们要的前景一般都是动的,所以根据这个我们可以对这个来进行背景高斯建模。然后应用到新一帧图像上。此外https://www.jianshu.com/p/12533816eddf中还提到一种KNN算法,即K-nearest neigbours - based Background/Foreground Segmentation Algorithm。2006年,由Zoran Zivkovic 和Ferdinand van der Heijden在论文"Efficient adaptive density estimation per image pixel for the task of background subtraction."中提出。我们先了解下什么叫做KNN,其实原理特别简单:https://www.cnblogs.com/ybjourney/p/4702562.html

KNN等于是通过投票的方式来确定一个新的点属于哪一个类的(有的时候加权投票更准确)。

那么其实opencv不止这几种方法:

不过我们目前也就试试上面介绍的几种了。

这个历史就是用于背景建模学习的帧数。默认是500帧,之所以要用这么多帧,我觉得主要是为了让所有前景物体都尽可能的有运动,因为如果一直不动,会被认为是背景的。背景建模就是要把背景区域的模型估计学习出来,然后在新一帧里面判断是否是背景点,不是,则标记为前景。

这个学习率我们就用默认的比较好。我用的视频是

因为这个视频的背景是固定的。

结果:

前面看到前景分割的效果很不好,这都没关系,它还在学习嘛。这个程序运行起来还是很吃CPU的,

其实到后面学习的就会很好了,第501帧效果已经很不错了

放大看里面是有灰色的东西,那个就是阴影。下面是不检测阴影的:

有些孤立的白点用形态学操作或者中值滤波很好滤掉。

加大history。

右边总是有一个区域被判定为背景。换一种方法,用MOG的函数在opencv_contrib里面。

默认有5个类。

给定几个高斯类,每个点都会对这个类有一个权重,就是这个点属于这个类的概率。但是有些点不必作为背景点,真正的背景点占被认为是背景点的比例就是这个ratio,默认值是0.7。如果有5个背景点属于背景类的概率分别为0.4,0.25,0.2,0.1,0.05,5*0.7=3.5,那么就取概率大的三个,0.4,0.25和0.2的作为背景点。

最后一个参数,噪声强度,设置了新的高斯类的不确定性。当新的不是预期的(或者说和原来的高斯类相差甚远)的像素点或者说离群点出现,就需要创建新的高斯类。实际应用中,加大噪声强度参数就是允许给定的高斯类解释更多的点。默认值是15(用在0-255亮度下,也就是uint8。)这么看MOG也有一定的自适应能力。

这个0就是默认值。

结果:

第10帧,效果还不是很好。

第100帧好一点了。

201帧,效果还是不够好。200帧已经学习完了,效果还这么差,再看501帧:

效果还是差。我们还是得把history调大。

感觉效果其实还是比较差的。下一种方法:

第二个参数设置了置信度,这个置信度指的是新的点可以被原来的混合高斯分布很好的解释的程度。这个用的是马氏距离。如果你像设置为在3σ范围内就认为可以解释,这个值设为9,默认是16。

https://en.wikipedia.org/wiki/Mahalanobis_distance#Definition_and_properties

效果不能说好。

再试试其它的:

我还是想试一试Grabcut:

并且第一次必须用RECT模式:

因为第一次的时候要用RECT模式来初始化GMM的参数,用RECT模式也不能用整个图片,

这是用Grabcut迭代一百次的结果。

第一次必须用RECT模式。

这个用Grabcut迭代其实是没有意义的,因为其实Grabcut不是越来越好,而是越来越差。因为如果一旦第一张图片区分错误,第一次的结果掩模会作为第二次的输入掩模,这样就会导致第一次出现的错误错上加错。

这个第一次的结果就比较差。

所以说Grabcut适用于静态图的前景提取,而这一讲的背景减法才适合用于视频,背景减法是要学习一定数量的帧数才可以的,而Grabcut其实也算是需要学习,需要画一个框来初始化GMM,要说这其实也不算是学习,只是一个初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值