想要获得一段视频中运动的区域,首先要得到它静态的区域,这个过程叫做背景建模,接下来将背景模型和当前的图像进行比较,减去这些已知的背景就可以得前景了。
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)使迭代器从一个像素到另一个像素。
也可以用下面的函数来对直线采样:
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():将不同的彩色通道图像中合成一个掩模图像