背景建模

想要获得一段视频中运动的区域,首先要得到它静态的区域,这个过程叫做背景建模,接下来将背景模型和当前的图像进行比较,减去这些已知的背景就可以得前景了。
opencv中有这样的函数,他能够很容易对任意直线上的像素进行采样。线采样函数时cvInitLineIterator()CV_NEXT_LINE_POINT()

int cvInitLineIterator(
  const CvArr* image, 
  CvPoint pt1,
  CvPoint pt2,
  CvLineIterator * line_iterator, 
  int connectivity = 8, 
  int left_to_right = 0);

该函数返回的是直线上迭代的点的个数。

  • CV_NEXT_LINE_POINT(CvLineIterator * line_iterator)使迭代器从一个像素到另一个像素。
背景建模_第1张图片
Image1.png

背景建模_第2张图片
Image2.png

也可以用下面的函数来对直线采样:

int cvSampleLine(
  const CvArr * image,
  CvPoint pt1,
  CvPoint pt2,
  void* buffer,
int connectivity = 8);

该函数是cvInitLineIterator() CV_NEXT_LINE_POINT()的封装帧差法获取背景可以用当前帧间去上一帧,这是最简单的办法。

cvAbsDiff(
          image1,
          image2,
          frameForeground
     );

我们可以设置一个阀值,低于该阀值的点设为0,大于该阀值的设为255

cvThreshold(
          src,
          dst,
          15,
          255,
          CV_THRESH_BINARY
     );

平均背景法基本思路 :计算每个像素的平均值和标准差(或相似的)作为背景它使用了四个函数:

  • cvAcc(),累计图像;
  • cvAbsDiff(),计算一定时间内的每帧图像之差;
  • cvInRange(),将图像分割成前景区域和背景区域(背景模型已经学习的情况下)
  • cvOr():将不同的彩色通道图像中合成一个掩模图像

你可能感兴趣的:(背景建模)