www.pudn.com > backmode824.rar > BGModel.cpp


// BGModel.cpp: implementation of the CBGModel class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "backmodel.h" 
#include "BGModel.h" 
#include "DIBAPI.h" 
#include "cv.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
unsigned char WINAPI GetMedianNum(unsigned char * bArray, int iFilterLen); 
BOOL WINAPI MedianFilter(LPBYTE lpDIBBits, LONG lWidth, LONG lHeight,  
						 int iFilterH, int iFilterW,  
						 int iFilterMX, int iFilterMY); 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
#define DeleteClean(x) if (x){ delete x; x = NULL; } 
#define DeleteCleanA(x) if (x){ delete[] x; x = NULL; } 
 
CBGModel::CBGModel(int w, int h) 
{ 
   vw = w; 
   vh = h; 
   nPixels = vw  * vh; 
   pixels = new PixelProcess[nPixels]; 
   //pM=new BYTE[nPixels]; 
} 
/*CBGModel::CBGModel() 
{ 
 
} 
*/ 
 
CBGModel::~CBGModel() 
{ 
   DeleteCleanA(pixels); 
	//delete [] pixels; 
   //DeleteCleanA(pM); 
} 
/////////////////////////////////////////////////////// /////////////// 
 
/* 
 "Process" every pixel in the image. 
   
 This entails classifying the current pixel according to the 
  background model, labelling each pixel in the FgMask image, 
  and updating the background model. 
 */ 
//pFrame 的大小是像素的多少 
////////////////////////////////////////////////////////////////////// 
bool CBGModel::Process(LPBYTE pFrame,LPBYTE pFgMask,int frame_num) 
{ 
   if (!pFrame || !pFgMask) return false; 
   //对当前图像进行局部的对比度增强 
   //ContrastEnhance(pFrame); 
    
   BYTE *p =pFrame;// (BYTE*)pFrame->imageData; 
   //BYTE *pF=pFFrame;// (BYTE*)pFFrame->imageData;  
   BYTE *fg =pFgMask;// (BYTE*)pFgMask->imageData;  
   PixelCategory cat;  
   
 
   int i; 
   for(i=0; iwidth*3); 
 	//rgbtogray 
 	cvCvtColor(image, image1, CV_RGB2GRAY); 
  
 }*/ 
 
////////////////////////////////////////////////////////////////////// 
	/************************************************************************* 
 * 
 * 函数名称: 
 *   DivideSmallArea() 
 * 
 * 参数: 
 *   LPBYTE pMask 
 * 
 * 返回值: 
 *   BOOL               - 成功返回True,否则返回False。 
 * 
 * 说明: 
 *   该函数将消去图象中面积小于阈值的小区域 
 * 
 *************************************************************************/ 
bool CBGModel::DivideSmallArea(LPBYTE pMask, LPBYTE m_lpGrayMask) 
{ 
 
	// 循环变量 
	int i, s, n,nlable; 
 
	// 空穴的数目以及面积阈值 
	int nHoleNum, nMinArea; 
 
	// 正向和反向传播标志 
	int nDir1,nDir2; 
 
	//图像指针 
	BYTE *pm=pMask;//检测图像数据指针 
	BYTE *pM;//标记图像数据指针 
 
	//最大目标标记数 
	int MaxObj=50; 
	 
 
 
 
 
	// 小区域的阈值面积为20个象素点 
	nMinArea = 20; 
	// 空穴数赋初值 
	nHoleNum = 1; 
 
	//BYTE *pm=rgb2Gray(pMask); 
	//MedianFilter(pm,vw,vh,3,1,0,1); 
 
	//pM=(BYTE*)malloc(nPixels*3*sizeof(BYTE)); 
    pM=new BYTE[nPixels]; 
	//pM=new BYTE[nPixels*3+vw*6+6]; 
	if(pM==NULL) 
	{ 
		printf("bad space"); 
		exit(0); 
	} 
 
 
 
 
	for(i=0;i=0;i--) 
				//for(i=nPixels-1;i>0;i--) 
				{					 
					// 如果象素已经被扫描,或者是背景色,进行下一个循环 
					if((*(pM+i*3)==255)&&(*(pM+i*3+1)==255)&&(*(pM+i*3+2)==255)) 
					//if((*(pM+i)==255)) 
					{ 
						// 如果下侧或者右侧的象素值已经被扫描,且属于当前的空穴,当前的象素值 
						// 改成空穴的数值 
						if((*(pM+i*3+vw*3)!=NULL)&&(*(pM+i*3+vw*3)==nHoleNum)) 
						//if((*(pM+i+vw)!=NULL)&&(*(pM+i+vw)== nHoleNum)) 
						{ 
							//*(pM+i)= nHoleNum; 
 
							*(pM+i*3)= nHoleNum; 
							*(pM+i*3+1)=nHoleNum; 
							*(pM+i*3+2)=nHoleNum; 
							nDir2 = 1; 
						} 
			 
						if((*(pM+i*3+3)!=NULL)&&(*(pM+i*3+3)==nHoleNum)) 
						//if((*(pM+i+1)!=NULL)&&(*(pM+i+1) == nHoleNum)) 
						{ 
							//*(pM+i)= nHoleNum; 
 
							*(pM+i*3)= nHoleNum; 
							*(pM+i*3+1)=nHoleNum; 
							*(pM+i*3+2)=nHoleNum; 
							nDir2 = 1; 
						} 
					} 
				} 
				if(nDir2 == 0) 
					break;*/ 
			} 
			while(1); 
		}//else 
		// 空穴数增加 
 
		nHoleNum++; 
	} 
	while(1); 
 
	nHoleNum -- ; 
 
	// 寻找面积小于阈值的空穴区域 
	for(n=1; n<=nHoleNum; n++) 
	{ 
		s=0; 
		for(i=0;inMinArea) 
			{ 
				if(s>MaxObj) MaxObj=s; 
				break; 
			} 
		} 
		// 小于阈值的区域,赋以与背景一样的颜色,进行消去 
		if(s<=nMinArea) 
		{			 
			for (i=0;i