最近看书效率低下啊。。
看了《学习opencv》的codebook这一段。其实这个代码倒是蛮容易看懂的,大致思想可能如下(有可能自己理解有误,有点出入的地方):
1.对每一个像素构建一个codebook,每个codebook由一个codebox的序列和一些其他的信息所构成。codebox里面包含的信息由:{学习阈值的上界learnHigh,学习阈值的下届learnLow,box的实际上界Max,box的实际下界Min,最近一次更新时间t_last_update,用于判断是否negative run(有点没懂)的界限stale}。
2.接着就是背景学习过程,大致步骤如下:
1)对于一个像素,遍历它的codebook的每一个codebox,若存在一个codebox使得该像素各个通道的值都在学习阈值内,则转(2);否则(4)
2)更新该box的t_last_update,并且更新各个通道的实际box上下界:cb->max=(cb->max<p)?p:cb->max;cb->min=(cb->min>p)?p:cb->min;
3)若该像素值+/- 一个学习界值cbBounds(通常为10)超过或低于该box的学习阈值上下界,那就学习阈值上下界分别加减1;转(5)
4)添加一个新的box,box的上下界都为该像素各个通道的值,而学习阈值的上下界为像素值+/-cbBounds;
5)更新全体codebox的stale值。
通过一段时间的背景学习之后,就可以做背景差分了,即对于每一个像素,在它的codebook中搜索,看是否有codebox满足该像素点像素值都在[Max+MaxMod,Min-MinMod]区间内,若有,则说明该像素为背景,若不存在,则该像素为前景。
大致思想叙述完毕,书上代码也很好看懂,不过有个问题困扰了我一阵了,codebook中的box会不会有重叠的部分,比如:有一个box的上下界为[10,30],他的学习阈值为[0,40],先来了像素值为41,按照规则会产生一个新的box在后面,上下界为[41,41],学习阈值为[31,51],而再来了40,41,由于box的先后关系,前一个box会被更新,上下界为[10,41],学习阈值为[0,42],这样就构成了box的重叠。后来想了想,这样的情况,在单通道的情况下出现几率较大,而再多通道的情况下,由于满足条件更为苛刻,也许重叠的情况出现的可能性就不太大了,而且若是真的有重叠,或许在更新stale的时候被重叠的box就会被删掉了。
也许是我自己想太多,如果大家有什么见解也希望不吝赐教。