《包含背景更新的背景差分法》由会员分享,可在线阅读,更多相关《包含背景更新的背景差分法(6页珍藏版)》请在金锄头文库上搜索。
1、/-/ 概要 :包含背景更新的背景差分法/ File Name : bbs3.cpp/ Library : OpenCV for MS-Windows 1.0/-#include #include #include #include #define MASK_THRESHOLD 1 / 生成 backgroundMaskImage 和 stillObjectMaskImage 的 threshold #define THRESHOLD_MAX_VALUE 255 / threshold 在 2 值化时使用的最大值#define BACKGROUND_ALPHA 0.01 / 背景更新时的混合比
2、#define BACKGROUND_INITIAL_THRESHOLD 20 / 背景的初期 threshold#define STILL_OBJECT_ALPHA 0.1 / 静止物体更新时的混合比#define STILL_OBJECT_INITIAL_THRESHOLD 255 / 静止物体的初期 threshold#define THRESHOLD_COEFFICIENT 5.0 / threshold 的使用次数#define NOT_STILL_DEC_STEP 10 / 移动时计数器的减少量#define STILL_OBJECT_TO_BACKGROUND 100 / 作为背
3、景使用的基准/ 图像上下反转表示/ 参数:/ windowName : 表示画像的窗口的名字/ image : 上下反转表示图像用 IplImage/void showFlipImage( char *windowName, IplImage *image ) if ( image-origin = 0 ) cvFlip( image, image, 0 );cvShowImage( windowName, image );cvFlip( image, image, 0 );int main( int argc, char *argv ) int key; / 输入用参数 keyCvCaptu
4、re *capture = NULL; / 摄像头捕捉用结构char *windowNameCapture = “Capture“; / 表示捕获的图像的窗口的名字char *windowNameForeground = “Foreground Mask“; / 表示前景 mask 图像的窗口的名字char *windowNameStillObjectMask = “Still Object Mask“; / 表示静止物体 mask 图像的窗口的名字char *windowNameBackground = “Background“; / 表示背景图像的窗口的名字char *windowName
5、StillObject = “Still Object“; / 表示静止物体的窗口的名字char *windowNameCounter = “Counter“; / 表示 counter 的窗口的名字/ camera 初始化if ( ( capture = cvCreateCameraCapture( -1 ) ) = NULL ) / 没有发现 camera 的时候printf( “Not found cameran“ );return -1;/ create windowscvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE );cvNa
6、medWindow( windowNameForeground, CV_WINDOW_AUTOSIZE );cvNamedWindow( windowNameStillObjectMask, CV_WINDOW_AUTOSIZE );cvNamedWindow( windowNameBackground, CV_WINDOW_AUTOSIZE );cvNamedWindow( windowNameStillObject, CV_WINDOW_AUTOSIZE );cvNamedWindow( windowNameCounter, CV_WINDOW_AUTOSIZE );IplImage *f
7、rameImage = cvQueryFrame( capture );/ 保存图像的大小CvSize imageSize = cvGetSize( frameImage );/ 生成图像IplImage *backgroundAverageImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 背景的平均值保存用IplImageIplImage *backgroundThresholdImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 背景的 threshold 保存用IplI
8、mageIplImage *stillObjectAverageImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 静止物体的平均值保存用IplImageIplImage *stillObjectThresholdImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 静止物体的 threshold 保存用 IplImageIplImage *stillObjectCounterImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 )
9、; / 静止物体的 counter 用IplImageIplImage *backgroundDifferenceImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 背景差分图像用IplImageIplImage *stillObjectDifferenceImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 静止物体差分图像用IplIMageIplImage *thresholdImage32 = cvCreateImage( imageSize, IPL_DEPTH_32F
10、, 3 ); / 32bit threshold 图像用IplImageIplImage *thresholdImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); / threshold 图像用 IplImageIplImage *resultImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 结果图像用 IplImageIplImage *backgroundMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 背景 M
11、ask 图像用 IplImageIplImage *foregroundMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 前景 Mask 用 IplImageIplImage *stillObjectMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 静止物体 Mask 用 IplImageIplImage *movingObjectMask = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 动物体 Mask 用
12、IplImageIplImage *backgroundCopyMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / 往背景里复制时使用的Mask 用 IplImageIplImage *tmpMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / temp 用 IplImageIplImage *tmp2MaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); / temp2 用 IplImageIplImage
13、 *frameImage32 = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); / 32bit 的被捕获的图像用 IplImageIplImage *backgroundImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); / 背景图像用 IplImageIplImage *stillObjectImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); / 静止物体图像用 IplImage/ 初始化cvConvert( frameImage, bac
14、kgroundAverageImage );cvSet( backgroundThresholdImage, cvScalarAll( BACKGROUND_INITIAL_THRESHOLD ) );cvSetZero( stillObjectAverageImage );cvSetZero( stillObjectThresholdImage );cvSetZero( stillObjectCounterImage );while ( 1 ) frameImage = cvQueryFrame( capture );/ 变换为 float 32bitcvConvert( frameImag
15、e, frameImage32 );/ 和背景的差 / 计算和現在的背景的差的绝对值cvAbsDiff( frameImage32, backgroundAverageImage, backgroundDifferenceImage );cvAddWeighted( backgroundDifferenceImage, 1.0, backgroundThresholdImage, -THRESHOLD_COEFFICIENT, 0.0, thresholdImage32 );/ thresholdImage 中即使存在一个元素也不是背景cvConvert( thresholdImage32, thresholdImage );cvCvtColor( thresholdImage, resultImage, CV_BGR2GRAY );cvThreshold( resultImage, backgroundMaskImage, MASK_THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY_INV );/ 同背景候補的差/ 计算和現在的背景候補