导航

混合高斯模型检测运动目标及OpenCv详细代码

Posted on 2016-08-06 21:22  Owen18  阅读(526)  评论(0)    收藏  举报

混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景,然后使用统计差分(如3σ原则)进行目标像素判断,可以对复杂动态背景进行建模,计算量较大。

在混合高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的。对于视频图像中的每一个像素点,其值在序列图像中的变化可看作是不断产生像素值的随机过程,即用高斯分布来描述每个像素点的颜色呈现规律【单模态(单峰),多模态(多峰)】。

对于多峰高斯分布模型,图像的每一个像素点按不同权值的多个高斯分布的叠加来建模,每种高斯分布对应一个可能产生像素点所呈现颜色的状态,各个高斯分布的权值和分布参数随时间更新。当处理彩色图像时,假定图像像素点R、G、B三色通道相互独立并具有相同的方差。对于随机变量X的观测数据集{x1,x2,…,xN},xt=(rt,gt,bt)为t时刻像素的样本,则单个采样点xt其服从的混合高斯分布概率密度函数:

 

其中k为分布模式总数,η(xt,μi,tτi,t)为t时刻第i个高斯分布,μi,t为其均值,τi,t为其协方差矩阵,δi,t为方差,I为三维单位矩阵,ωi,tt时刻第i个高斯分布的权重。

 

详细算法流程:

 

#include <iostream>
#include <string>

#include <opencv2/opencv.hpp>


int main(int argc, char** argv)
{
 std::string videoFile = "../test.avi";

 cv::VideoCapture capture;
 capture.open(videoFile);

 if (!capture.isOpened())
 {
  std::cout<<"read video failure"<<std::endl;
  return -1;
 }


 cv::BackgroundSubtractorMOG2 mog;

 cv::Mat foreground;
 cv::Mat background;

 cv::Mat frame;
 long frameNo = 0;
 while (capture.read(frame))
 {
  ++frameNo;

  std::cout<<frameNo<<std::endl;

  // 运动前景检测,并更新背景
  mog(frame, foreground, 0.001);      
  
  // 腐蚀
  cv::erode(foreground, foreground, cv::Mat());
  
  // 膨胀
  cv::dilate(foreground, foreground, cv::Mat());

  mog.getBackgroundImage(background);  // 返回当前背景图像

  cv::imshow("video", foreground);
  cv::imshow("background", background);


  if (cv::waitKey(25) > 0)
  {
   break;
  }
 }
 


 return 0;
}

实验结果:

当前帧图像

当前背景图像

前景图像

经过腐蚀和膨胀处理后的前景图像

(白色为运动目标区域;灰色为阴影区域;黑色为背景)