📄 gmmoriginalgraphcuts.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"
#include "GMMOriginalGraphCuts.h"
#include "postProcess.h"
GMMOriginalGraphCuts::GMMOriginalGraphCuts(CvCapture* pCapture)
{
ASSERT(pCapture!=NULL);
pImage=NULL;
pResultImage=NULL;
gmm=NULL;
PV=NULL;
bgV=NULL;
b=NULL;
w=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];
PV=new int*[height*width];
w=new double*[height*width];
bgV=new int[width*height];
b=new bool[width*height];
for(int i=0;i<height*width;i++)
{
PV[i]=new int[2];
w[i]=new double[2];
}
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];
}
}
}
GMMOriginalGraphCuts::~GMMOriginalGraphCuts()
{
if(pImage!=NULL)
{
cvReleaseImage(&pImage);
}
if(pResultImage!=NULL)
{
cvReleaseImage(&pResultImage);
}
if(gmm!=NULL)
{
delete [] gmm;
}
if(PV!=NULL)
{
for(int i=0;i<width*height;i++)
{
delete [] PV[i];
}
delete [] PV;
}
if(w!=NULL)
{
for(int i=0;i<width*height;i++)
{
delete [] w[i];
}
delete [] w;
}
if(bgV!=NULL)
{
delete [] bgV;
}
if(b!=NULL)
{
delete [] b;
}
/*if(originalImgMat!=NULL)
{
delete [] originalImgMat;
}
if(resultImgMat!=NULL)
{
delete [] resultImgMat;
}*/
}
int GMMOriginalGraphCuts::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 GMMOriginalGraphCuts::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 GMMOriginalGraphCuts:: createNewGM(int* xt)
{
ASSERT(xt!=NULL);
GMOriginal g(xt);
return g;
}
void GMMOriginalGraphCuts::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))
{
//meanFilter(pImage);
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);
gmm[y*width+x].gm[location].update_wf(false);
PV[y*width+x][0]=0;
PV[y*width+x][1]=iplGetPixelColor(pImage,x,y);
}
else
{
gmm[y*width+x].gm[location].update_wf(true);
PV[y*width+x][0]=1;
PV[y*width+x][1]=iplGetPixelColor(pImage,x,y);
/* 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);
}*/
}
double wf_all=0;//normalize the wf
for(i=0;i<K;i++)
{
wf_all+=gmm[y*width+x].gm[i].wf;
}
for(i=0;i<K;i++)
{
gmm[y*width+x].gm[i].wf/=wf_all;
}
w[y*width+x][0]=gmm[y*width+x].gm[location].w;
w[y*width+x][1]=gmm[y*width+x].gm[location].wf;
double bgPixel[]={0,0,0};//stand for a background pixel
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];
}
bgV[y*width+x]=getRGB((int)bgPixel[0],(int)bgPixel[1],(int)bgPixel[2]);
}
graphCuts(height, width, PV,w,bgV, b);
for(x=0;x<width;x++)
for(int y=0;y<height;y++)
{
if(b[y*width+x])
{
iplSetPixelColor(pResultImage,x,y,0xff000000);
}
else
{
int red1=getRedFromRGB(bgV[y*width+x]);
int green1=getGreenFromRGB(bgV[y*width+x]);
int blue1=getBlueFromRGB(bgV[y*width+x]);
int red2=iplGetPixelRed(pImage,x,y);
int green2=iplGetPixelGreen(pImage,x,y);
int blue2=iplGetPixelBlue(pImage,x,y);
if(abs(red1-red2)/(double)(red1)<ALPHA_RGB &&
abs(green1-green2)/(double)(green1)<ALPHA_RGB &&
abs(blue1-blue2)/(double)(blue1)<ALPHA_RGB)
{
iplSetPixelColor(pResultImage,x,y,0xff000000);
}
else
{
iplSetPixelColor(pResultImage,x,y,0xffffffff);
}
//{
/*double bc1=Math.atan(((double)red1)/Math.max(green1,blue1));
double bc2=Math.atan(((double)green1)/Math.max(red1,blue1));
double bc3=Math.atan(((double)blue1)/Math.max(green1,red1));
double fc1=Math.atan(((double)red2)/Math.max(green2,blue2));
double fc2=Math.atan(((double)green2)/Math.max(red2,blue2));
double fc3=Math.atan(((double)blue2)/Math.max(green2,red2));
if(Math.abs(fc1-bc1)<0.05*bc1 && Math.abs(fc2-bc2)<0.05*bc2
&& Math.abs(fc3-bc3)<0.05*bc3)
{
jipimage.setPixel(x,y,0xff000000);
}
else
{
jipimage.setPixel(x,y,0xff000000);
}
}*/
}
}
/*for(int num=0;num<K;num++)
{
output<<gmm[100*width+100].gm[num].gama<<",";
}
output<<endl;*/
SmoothFilter(pResultImage);
/*ofstream output("pp.txt",ios::ate);
for( x=0;x<width;x++)
for(int y=0;y<height;y++)
{
output<<iplGetPixelColor(pResultImage,x,y)<<endl;
}*/
IplImage* pResultImage1=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
pResultImage1->origin=1;
cvDilate(pResultImage,pResultImage1,NULL,1);
//cvShowImage("pImage",pImage);
cvShowImage("pResultImage",pResultImage1);
//cvWriteFrame(writer,pResultImage1);//写一帧
cvReleaseImage(&pResultImage1);
//如果有按键事件,则跳出循环
//此等待也为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 + -