包含背景更新的背景差分法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//---------------------------------------------------------

// 概要:包含背景更新的背景差分法

// 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 // 背景更新时的混合比

#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 // 作为背景使用的基准

//

// 图像上下反转表示

//

// 参数:

// 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; // 输入用参数key

CvCapture *capture = NULL; // 摄像头捕捉用结构

char *windowNameCapture = "Capture"; // 表示捕获的图像的窗口的名字

char *windowNameForeground = "Foreground Mask"; // 表示前景mask图像的窗口的名字

char *windowNameStillObjectMask = "Still Object Mask"; // 表示静止物体mask图像的窗口的名字char *windowNameBackground = "Background"; // 表示背景图像的窗口的名字

char *windowNameStillObject = "Still Object"; // 表示静止物体的窗口的名字

char *windowNameCounter = "Counter"; // 表示counter的窗口的名字

// camera初始化

if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) {

// 没有发现camera的时候

printf( "Not found camera\n" );

return -1;

}

// create windows

cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE );

cvNamedWindow( 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 *frameImage = cvQueryFrame( capture );

// 保存图像的大小

CvSize imageSize = cvGetSize( frameImage );

// 生成图像

IplImage *backgroundAverageImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 背景的平均值保存用IplImage

IplImage *backgroundThresholdImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 背景的threshold 保存用IplImage

IplImage *stillObjectAverageImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 静止物体的平均值保存用IplImage

IplImage *stillObjectThresholdImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 静止物体的threshold 保存用IplImage

IplImage *stillObjectCounterImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 静止物体的counter用IplImage

IplImage *backgroundDifferenceImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 背景差分图像用IplImage IplImage *stillObjectDifferenceImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 静止物体差分图像用IplIMage

IplImage *thresholdImage32 = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 32bitのthreshold 图像用IplImage IplImage *thresholdImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); // threshold 图像用IplImage

IplImage *resultImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 结果图像用IplImage

IplImage *backgroundMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 背景Mask图像用IplImage IplImage *foregroundMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 前景Mask用IplImage IplImage *stillObjectMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 静止物体Mask用IplImage IplImage *movingObjectMask = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 动物体Mask用IplImage IplImage *backgroundCopyMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // 往背景里复制时使用的Mask用IplImage

IplImage *tmpMaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // temp用IplImage

IplImage *tmp2MaskImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 1 ); // temp2用IplImage

IplImage *frameImage32 = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 ); // 32bit的被捕获的图像用IplImage IplImage *backgroundImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); // 背景图像用IplImage

IplImage *stillObjectImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); // 静止物体图像用IplImage

相关文档
最新文档