包含背景更新的背景差分法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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