opencv背景提取

 

关于模型测试的简短注释和cv::Mahalanobis()

之前没有讨论如何测试新图像中的特定像素是否位于背景模型的预测域中

只使用方差时,由于各维度间的方差未必相同,因此对每个维度计算z值(数据和均值的偏差除以标准差),多维数据的z值是各个维度z值平方和的开方

欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待				

马氏距离(Mahalanobis distance)表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是,它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为Σ的多变量向量,其马氏距离为sqrt( (x-μ)'Σ^(-1)(x-μ) )。			

opencv提供计算马氏距离的函数:cv::Mahalanobis()

更复杂的背景提取方法

复杂的移动物体,比如挥舞的树枝,转动的风扇,飘动的窗帘等

一个处理方法是对每个像素或魅族像素使用一个时间序列的模型(可以很好处理时间上的波动,缺点是大量内存)

从视频压缩的技巧中取得灵感,使用YUV码书codebook来表达背景中的关键状态

···将新像素值和先前观察到的值比较,如果和某个值接近,就认为它是先前值加上微扰

···如果不接近,就认为新值是该像素处背景的一类新颜色

使用RGB不是最好的选择,选择那些颜色空间坐标有亮度的空间总会获得很好的效果,例如YUV颜色空间(HSV也不错,V是指亮度),因为根据经验,背景中大多数的颜色变化都发生在亮度轴上而不是其他颜色轴

接下来考虑如何对”团“建模,比如建模为带有均值和协方差的Gaussian类簇

码书法,是对每个像素建立一个记录背景范围的码书,一个码书上包含多个表示背景范围的盒子,类似于颜色空间YUV(背景颜色变化多发生在亮度轴V上)上漂浮着的气团。如果新像素和先前建立的盒子足够近,则扩展盒子。否则,新建新的盒子。

结构

码书继承自STL中的vector,如果新元素不在min-learnLow和max+learnHigh之间,就生成一个新的码书单元,最后一次更新的时间是在学习时用来对几乎没用过的码书单元进行删除

进行背景学习

对每个像素而言,有伴随一个由码单元组成的码书,需要一个能容纳个数和图像中需要学习的像素相同的码书的数组

调用足够次数的updateCodebook()进行模型的学习

为了能够在图片中存在移动的前景同时避免学习到杂乱的噪声,需要一种方法去学习过程中很少被命中的码书

存在移动的前景物体时进行背景学习

clearStaleEntries() 允许在存在移动前景物体时进行背景学习

staleThresh这个参数硬编为(凭经验)为当前总共运行次数的一半,意味着在背景学习时,如果一个码书在总共学习一半时间内没有被命中,那么会被标记被待删除

背景差分:检测前景物体

考虑backgroundDiff() 根据学习到的模型对图片进行前景分割

使用码书法的背景模型


1.在几秒或几分钟的视频上使用updateCodebook() 学习基本的背景模型			

2.使用clearStaleEntries() 进行陈旧实体清除			

3.调整minMod和maxMod 使其已知的前景分割良好			

4.维护一个高层场景模型			

5.通过backgroundDiff() 和学习到的模型来对前景物体进行分割			

6.周期性更新学习到的背景像素		

7.以更低的频率使用clearStaleEntries()周期性清理陈旧实体			

关于码书法的其他想法

一般码书法在很多时候可以取得较好成果,也可以较快训练运行;但是它无法处理光线模式的变化,例如早上,中午和晚上的日照,或是突然开关灯,可以使用多个不同的码书法处理这种全局的变化,视情况而定该使用哪种