⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmmoriginalgraphcuts.cpp

📁 动态场景中运动目标检测提取与跟踪 对新手很有用
💻 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 + -