📄 gmmoriginal.cpp
字号:
#include "stdafx.h"
#include "GMMOriginal.h"
#include "gmm.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "iplImageProcess.h"
#include <fstream.h>
#include <math.h>
//#include "GraphCut.h"
GMMOriginal::GMMOriginal(CvCapture* pCapture)
{
ASSERT(pCapture!=NULL);
pImage=NULL;
pResultImage=NULL;
gmm=NULL;
//originalImgMat=NULL;
//resultImgMat=NULL;
this->pCapture=pCapture;
pImage = cvQueryFrame(pCapture);
height=pImage->height;
width=pImage->width;
gmm=new GMSOriginal[height*width];
//originalImgMat=new char[height*width*3];
//resultImgMat=new char[height*width*3];
pResultImage=cvCreateImage(cvSize(width,height), IPL_DEPTH_8U,3);
pResultImage->origin=1;
for(int y=0;y<height;y++)
for(int x=0;x<width;x++)
{
iplGetPixelColor(pImage,x,y,xt);//得到当前像素值并放于xt中
//xt[0]=iplGetPixelRed(pImage,x,y);
//xt[1]=iplGetPixelGreen(pImage,x,y);
//xt[2]=iplGetPixelBlue(pImage,x,y);
for(int k=0;k<K;k++)
{
gmm[y*width+x].gm[k].u[0]=xt[0];
gmm[y*width+x].gm[k].u[1]=xt[1];
gmm[y*width+x].gm[k].u[2]=xt[2];
}
}
}
GMMOriginal::~GMMOriginal()
{
if(pImage!=NULL)
{
cvReleaseImage(&pImage);
}
if(pResultImage!=NULL)
{
cvReleaseImage(&pResultImage);
}
if(gmm!=NULL)
{
delete [] gmm;
}
/*if(originalImgMat!=NULL)
{
delete [] originalImgMat;
}
if(resultImgMat!=NULL)
{
delete [] resultImgMat;
}*/
}
int GMMOriginal::findMatch(int* xt,GMSOriginal& g)
{
ASSERT(xt!=NULL && g.gm!=NULL);
for(int i=0;i<K;i++)
{
double thre=2.5*sqrt(g.gm[i].gama);
if(fabs((double)xt[0]-g.gm[i].u[0])<thre &&
fabs((double)xt[1]-g.gm[i].u[1])<thre &&
fabs((double)xt[2]-g.gm[i].u[2])<thre)
{
return i;
}
}
return K+1;
}
void GMMOriginal::reorderGMM(GMSOriginal& g)
{
ASSERT(g.gm!=NULL);
GMOriginal g_max;
int loc_max;
for(int i=0;i<K;i++)
{
g_max=g.gm[i];
loc_max=i;
for(int j=i;j<K;j++)
{
if(g_max.w<g.gm[j].w)
{
g_max=g.gm[j];
loc_max=j;
}
}
g.gm[loc_max]=g.gm[i];
g.gm[i]=g_max;
}
}
/*
*用当前像素创建一个新的GM模型
*/
GMOriginal GMMOriginal:: createNewGM(int* xt)
{
ASSERT(xt!=NULL);
GMOriginal g(xt);
return g;
}
void GMMOriginal::processImage()
{
ASSERT(pImage);
cvNamedWindow("pImage", CV_WINDOW_AUTOSIZE);
cvNamedWindow("pResultImage",CV_WINDOW_AUTOSIZE);
cvMoveWindow("pImage", 120, 200);
cvMoveWindow("pResultImage",130+width, 200);
int location=0;
// CvVideoWriter* writer=cvCreateVideoWriter("c:\\tmp.avi",-1,
// cvGetCaptureProperty(pCapture,CV_CAP_PROP_FPS),cvSize(width,height),1);
// ofstream output("order.txt",ios::ate);
while(pImage = cvQueryFrame(pCapture))
{
for(int x=0;x<width;x++)
for(int y=0;y<height;y++)
{
iplGetPixelColor(pImage,x,y,xt);//得到一个像素的三个分量
//output<<xt[0]<<","<<xt[1]<<","<<xt[2]<<endl;
if((location=findMatch(xt,gmm[y*width+x]))<K)
{
for(int i=0;i<location;i++)
{
gmm[y*width+x].gm[i].updateData();
}
gmm[y*width+x].gm[location].updateData(xt);
gmm[y*width+x].gm[location].newGMM=true;
for(int j=location+1;j<K;j++)
{
gmm[y*width+x].gm[j].updateData();
}
}
else //no match found
{
for(int i=0;i<K-1;i++)
{
gmm[y*width+x].gm[i].updateData();
}
gmm[y*width+x].gm[K-1]=createNewGM(xt);
//output<<gmm[y*width+x].gm[K-1].w<<endl;
}
//reorder the GMM
reorderGMM(gmm[y*width+x]);
for(int i=0;i<K;i++)
{
if(gmm[y*width+x].gm[i].newGMM==true)
{
location=i;//location 的新位置
gmm[y*width+x].gm[i].newGMM=false;
break;
}
}
int B=0;
double w_tmp=0;
double w_all=0;
for(i=0;i<K;i++)
{
w_all+=gmm[y*width+x].gm[i].w;
}
for( i=0;i<K;i++)
{
gmm[y*width+x].gm[i].w/=w_all;
//gmm[y][x][i].get_ratio;
}
for(i=0;i<K;i++)
{
if(w_tmp<T)
{
w_tmp+=gmm[y*width+x].gm[i].w;
}
else
{
B=i;
break;
}
}
if(location<=B)
{
iplSetPixelColor(pResultImage,x,y,0xff000000);
}
else
{
double bgPixel[]={0,0,0};//stand for a background pixel
//double gamaBgPixel[]={0,0,0};//stand for a background pixel gama.
////////////////////////////////////shadow detection in RGB color space
for(int m=0;m<K;m++)
{
bgPixel[0]+=gmm[y*width+x].gm[m].w*gmm[y*width+x].gm[m].u[0];
bgPixel[1]+=gmm[y*width+x].gm[m].w*gmm[y*width+x].gm[m].u[1];
bgPixel[2]+=gmm[y*width+x].gm[m].w*gmm[y*width+x].gm[m].u[2];
}
if(fabs(xt[0]-bgPixel[0])/(double)(bgPixel[0])<ALPHA_RGB &&
fabs(xt[1]-bgPixel[1])/(double)(bgPixel[1])<ALPHA_RGB &&
fabs(xt[2]-bgPixel[2])/(double)(bgPixel[2])<ALPHA_RGB)
{
iplSetPixelColor(pResultImage,x,y,0xff000000);
}
else
{
iplSetPixelColor(pResultImage,x,y,0xffffffff);
}
}
}
/*for(int num=0;num<K;num++)
{
output<<gmm[100*width+100].gm[num].gama<<",";
}
output<<endl;*/
cvShowImage("pImage",pImage);
cvShowImage("pResultImage",pResultImage);
//cvWriteFrame(writer,pResultImage);
//如果有按键事件,则跳出循环
//此等待也为cvShowImage函数提供时间完成显示
//等待时间可以根据CPU速度调整
if(cvWaitKey(1) >= 0)
{
pImage=0;
break;
}
}
//cvReleaseVideoWriter(&writer);
cvReleaseImage(&pImage);
pImage=NULL;
cvReleaseImage(&pResultImage);
pResultImage=NULL;
cvDestroyWindow("pImage");
cvDestroyWindow("pResultImage");
//output.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -