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