AI笔记: 运动估计之背景建模

背景建模概述
为了完成对图像和视频的运动估计,我们需要对图像进行采集和预处理,以及特征提取等操作,所以运动估计本身要依赖于这些基本的知识来完成,在之前的一些处理流程中,我们的输入或者我们的对象都是一张图片,我们要识别这个图片中的特征,这个图片中的边缘,以及这个图片中的静止目标等等内容,换句话来说,我们需要根据一张静止的图片来对图像进行分析和理解
在生物的自然视觉中,我们会发现,除了对静止场景的理解以外,运动的估计和感知,实际上是视觉中的另外一个很重要,也是相对独立的内容,比如说,很多的动物像青蛙,对运动的目标(昆虫)特别的敏感,其实人类也具有相似的特征,比如:我们从家走到学校,我们不会记得我们走过的路上有多少棵树,景物有什么变化,但是如果有一只鸽子从我面前飞过,我们就会印象特别深,也可以很迅速的感觉到,这说明我们对运动的估计,有的时候这个灵敏度往往还要高于对静止特征的一个分析
运动估计,实际上包括两类,一类是背景静止的运动,所谓背景静止,是指的是我们的视角或者是我们的摄像机本身的位置不发生变化,比如在室外和室内的各类的监控安防摄像头 。另外一类是,我们也在运动,换句话来说,我们的视角在动,目标也在动,比如我们坐在车里看目标或者是无人机上装相机,去看地面行驶的车辆,在这种情况下我们就需要用到光流估计的方法
相对运动的基本方式相机运动,目标静止 - 光流估计(全局运动)相机和目标均运动 - 光流估计 背景建模原理
1 ) 帧差法运动目标检测
比如一个视频中,一个人在一个房间里走动,人就是这个场景中的运动目标,我们现在想构建一个方法,能够把这个运动的人提取出来,一个最直观的想法是:相邻两帧一减就会显示出来,具体来说,我们需要计算相邻两帧的帧差,就是相邻两帧中对应的像素相减
D ( x , y ) = { 1 ; 如果I(x,y,t)-I(x,y,t-1)>T 0 ; 如果其他 D(x,y) = \begin{cases} 1; & \text{如果 I(x,y,t) - I(x,y,t-1) > T } \\ 0; & \text{如果其他} \end{cases} D(x,y)={1;0;?如果I(x,y,t)-I(x,y,t-1)>T如果其他?
提取前:
提取后:

AI笔记: 运动估计之背景建模

文章插图
对比可知:
2 ) 基于高斯模型的背景建模
P ( I ) = ∑ q = 1 Q w q N ( I ; u q , σ q 2 ) G ( I ; u q , σ q ) = 1 2 π σ q e ? ( I ? u q ) 2 2 σ q 2 p ( x ) = ∑ q = 1 Q p ( x ∣ w q ) P ( w q ) P(I) = \sum_{q=1}^Q w_q N(I; u_q, \^2) \\ G(I; u_q, \) = \frac{1}{\sqrt{2 \pi} \} e ^{-\frac{(I-u_q)^2}{2\^2}} \\ p(x) = \sum_{q=1}^Q p(x|w_q) P(w_q) P(I)=q=1∑Q?wq?N(I;uq?,σq2?)G(I;uq?,σq?)=2π?σq?1?e?2σq2?(I?uq?)2?p(x)=q=1∑Q?p(x∣wq?)P(wq?)
混合高斯背景建模步骤
第二步是模型学习,将当前帧的对应点象素的灰度值与已有的Q个高斯模型作比较,若满足 ∣ x k ? u q , k < 2.5 σ q , k ∣ |x_k - u_{q,k} < 2.5\{q,k}| ∣xk??uq,k? T) B=argb?min(∑q=1b?wq?>T)第五步是判断前景混合高斯模型具体的计算过程
混合高斯模型迭代计算原理
AI笔记: 运动估计之背景建模

文章插图
【AI笔记: 运动估计之背景建模】w q ( k + 1 ) = ( 1 ? α ) w q ( k ) + α M q ( k + 1 ) u q ( k + 1 ) = ( 1 ? ρ ) u q ( k ) + ρ I ( k + 1 ) σ q 2 ( k + 1 ) = ( 1 ? ρ ) σ q 2 ( k ) + ρ ( I ( k + 1 ) ? u q ( k + 1 ) ) 2 ρ = α G ( I ( k + 1 ) ; u q , σ q ) w_q(k+1) = (1 - \alpha) w_q(k) + \alpha M_q(k+1) \\ u_q(k+1) = (1 - \rho)u_q(k) + \rho I(k+1) \\ \^2(k+1) = (1 - \rho)\^2(k) + \rho(I(k+1) - u_q(k+1))^2 \\ \rho = \alpha G(I(k+1);u_q, \) wq?(k+1)=(1?α)wq?(k)+αMq?(k+1)uq?(k+1)=(1?ρ)uq?(k)+ρI(k+1)σq2?(k+1)=(1?ρ)σq2?(k)+ρ(I(k+1)?uq?(k+1))2ρ=αG(I(k+1);uq?,σq?)
u q ( k + 1 ) u_q(k+1) uq?(k+1) 和σ q 2 ( k + 1 ) \^2(k+1) σq2?(k+1) 也按照类似的方式来进行计算,那么 α \alpha α和 ρ \rho ρ是对应我们的学习速率,实际上是取大于0小于1之间的数类别数取值不大于5对混合高斯模型背景估计的实现
1 ) C++关键代码
resize(source, image, Size(source.cols/2, source.rows/2), INTER_LINEAR);if(foreGround.empty())foreGround.create(image.size(), image.type());pBgModel -> apply(image, fgMask);GaussianBlur(fgMask, fgMask, Size(5,5), 0);threshold(fgMask, fgMask, 10, 255, THRESH_BINARY);foreGround = Scalar::all(0);image.copyTo(foreGround, fgMask);pBgModel -> getBackgroundImage(backGround);// 显示原始图像及背景,前景imshow("Source", source);imshow("Background", backGround);imshow("ForeGround", foreGround);
2 ) 关键代码
cap = cv2.VideoCapture(videoFileName)fgbg = cv2.createBackgroundSubtractorMOG2()thresh = 200count = 0while True:ret, frame = cap.read()if not ret: # 没有读取到当前帧,结束breakfgmask = fgbg.apply(frame)bgImage = fgbg.getBackgroundImage()# OpenCV 4.x用法,3.x需要使用_, cnts, _ 这样cnts, _ = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
背景建模处理实例
使用我们前面说的这个混合高斯模型,对一个实际的视频进行处理
总结混合高斯模型可模拟任意概率密度函数,是背景建模的主流方法混合高斯模型参数采用迭代方式计算