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

📄 objectextractiondoc.cpp

📁 动态场景中运动目标检测提取与跟踪 对新手很有用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ObjectExtractionDoc.cpp : implementation of the CObjectExtractionDoc class
//

#include "stdafx.h"
#include "ObjectExtraction.h"

#include "ObjectExtractionDoc.h"
#include "cv.h"
#include "baseclass.h"
#include "gmm.h"
#include "GMMOriginal.h"
#include "GMMOriginalGraphCuts.h"
#include "sGMM.h"
#include "iplimageProcess.h"
#include "postProcess.h"
#include "PreProcess.h"
#include "sceneChangeDetection.h"
#include "DlgOnSaveAs.h"
#include "DlgImageProcess.h"
#include "tools.h"
#include "lgmm.h"
//#include "graphcut.h"
//#include "ximage.h"
//#include "ximagif.h"
//#include "ximatif.h"
//#include "xfile.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef RATIO
#define RATIO 2
#endif
CvCapture* pCapture1;

/////////////////////////////////////////////////////////////////////////////
// CObjectExtractionDoc

IMPLEMENT_DYNCREATE(CObjectExtractionDoc, CDocument)

BEGIN_MESSAGE_MAP(CObjectExtractionDoc, CDocument)
	//{{AFX_MSG_MAP(CObjectExtractionDoc)
	ON_COMMAND(ID_ALG_BASECLASS, OnAlgBaseclass)
	ON_COMMAND(ID_FILE_OPENFILE, OnFileOpenfile)
	ON_COMMAND(ID_FILE_OPENCAM, OnFileOpencam)
	ON_COMMAND(ID_FILE_STOP, OnFileStop)
	ON_COMMAND(ID_ALG_GMM, OnAlgGmm)
	ON_COMMAND(ID_ALG_GMMORIGINAL, OnAlgGmmoriginal)
	ON_COMMAND(ID_ALG_GMMORIGINALGRAPHCUTS, OnAlgGmmoriginalgraphcuts)
	ON_COMMAND(ID_ALG_SGMM, OnAlgSgmm)
	ON_COMMAND(ID_ALG_TEST, OnAlgTest)
	ON_COMMAND(ID_SEG_SCENECHANGE, OnSegScenechange)
	ON_COMMAND(ID_SEG_GETDCIMAGE, OnSegGetdcimage)
	ON_COMMAND(ID_ALG_SGMMDCIMAGE, OnAlgSgmmdcimage)
	ON_COMMAND(ID_ALG_SGMMNOUPDATE, OnAlgSgmmnoupdate)
	ON_COMMAND(ID_ALG_SGMMDCNOUPDATE, OnAlgSgmmdcnoupdate)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_PRO_PROCESS, OnProProcess)
	ON_COMMAND(ID_ALG_LGMMGRAPHCUT, OnAlgLgmmgraphcut)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CObjectExtractionDoc construction/destruction

CObjectExtractionDoc::CObjectExtractionDoc()
{
	// TODO: add one-time construction code here
	pCapture=NULL;
	pImage=NULL;
	pResultImage=NULL;
	


}

CObjectExtractionDoc::~CObjectExtractionDoc()
{
	if(pImage!=NULL)
	{
		cvReleaseImage(&pImage);
	}
	if(pResultImage!=NULL)
	{
		cvReleaseImage(&pResultImage);
	}
	
	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
	}
	if(cvGetWindowHandle("pImage")!=NULL)
	{
		cvDestroyWindow("pImage");
	}
}

BOOL CObjectExtractionDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CObjectExtractionDoc serialization

void CObjectExtractionDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CObjectExtractionDoc diagnostics

#ifdef _DEBUG
void CObjectExtractionDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CObjectExtractionDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CObjectExtractionDoc commands

void CObjectExtractionDoc::OnAlgBaseclass() 
{
	// TODO: Add your command handler code here
	CBaseClass cb(m_isCam);
	cb.processImage(pCapture);

	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
		pCapture=NULL;
	}
	
}

void CObjectExtractionDoc::OnFileOpenfile() 
{
	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
	}
	char* szFilters = "avi Files (*.avi)|*.avi|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE,_T("avi"), _T("*.avi"),OFN_FILEMUSTEXIST, szFilters, NULL);
	if (dlg.DoModal()==IDOK)
	{
		CString lpszPathName=dlg.GetPathName();
		m_path=lpszPathName;
		m_fileName=dlg.GetFileName();
		char* path=(LPTSTR)(LPCTSTR)(lpszPathName);
		
		if((pCapture=cvCreateFileCapture(path))==NULL)
		{
			AfxMessageBox("in OnFileOpenfile(),the pCapture is null");
		}
		ASSERT(pCapture);
		m_isCam=false;
// 		if(cvGetWindowHandle("pImage")==NULL)
// 		{
// 			cvNamedWindow("pImage",CV_WINDOW_AUTOSIZE);
// 		}
	}
	
	
}

void CObjectExtractionDoc::OnFileOpencam() 
{
	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
	}
	if((pCapture=cvCreateCameraCapture(-1))==NULL)
	{
		AfxMessageBox("in OnFileOpencam() ,the pCapture is null");
	
	}
	m_path="";
	m_fileName="";
	ASSERT(pCapture);
	m_isCam=true;
// 	if(cvGetWindowHandle("pImage")==NULL)
// 	{
// 		cvNamedWindow("pImage",CV_WINDOW_AUTOSIZE);
// 	}
}

void CObjectExtractionDoc::OnFileStop() 
{
	// TODO: Add your command handler code here
	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
		pCapture=NULL;
	}
	
}

void CObjectExtractionDoc::OnAlgGmm() 
{
	// TODO: Add your command handler code here
	GMM gmm(pCapture);
	gmm.processImage();
	
	
}

void CObjectExtractionDoc::OnAlgGmmoriginal() 
{
	// TODO: Add your command handler code here
	GMMOriginal gmm(pCapture);
	gmm.processImage();
	
}

void CObjectExtractionDoc::OnAlgGmmoriginalgraphcuts() 
{
	
	GMMOriginalGraphCuts gmm(pCapture);
	gmm.processImage();
	
}

void CObjectExtractionDoc::OnAlgSgmm() 
{
	ASSERT(pCapture!=NULL);
	double FramesCount;
	int FrameNum;
	if(!m_isCam)
	{
		cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_AVI_RATIO,0);
		FramesCount=cvGetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_COUNT);
 	    FrameNum=(int)cvGetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES);

	}
	
  //高斯模型的个数
// 	
	
	cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("pImage", CV_WINDOW_AUTOSIZE);  
	
	 
    //cvMoveWindow("pResultImage",130+width, 200);

	int i, j, k, width, height;
	float value[3];
	CvVideoWriter* cvWriter;

	sGMM *bgModel;
	IplImage* back=NULL;//重建的背景图像
//graph cut 的参数
// 	int** PV=NULL;
// 	int* bgV=NULL;
// 	bool* b=NULL;
// 	double** w=NULL;
	
	if (pImage = cvQueryFrame(pCapture))
	{
		//meanFilter(pImage);
		if(!m_isCam)
		{
			FrameNum=(int)cvGetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES);
		}
		

		width = pImage->width;
		height = pImage->height;

		pResultImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
		pResultImage->origin=1;
		//重建的背景图像
		back=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
		back->origin=1;

// 		PV=new int*[height*width];
// 		w=new double*[height*width];
// 		bgV=new int[width*height];
// 		b=new bool[width*height];
// 		for(i=0;i<height*width;i++)
// 		{
// 			PV[i]=new int[2];
// 			w[i]=new double[2];
// 		}
		CString str(m_path);

		if(m_isCam)
		{
			str="c:\\cam_tmp_foreground.avi";
		}
 		int pos=str.Find(".");
 		str.Insert(pos,"_bin");

		//CvVideoWriter* cvWriter;
		CString filepath=GetFilePath(str);

		if(filepath=="")
		{
			if(m_isCam)
			{
				cvWriter=cvCreateVideoWriter(str,CV_FOURCC('X','V','I','D'),
					 10,cvSize(width,height),1);
			}
			else
			{
				cvWriter=cvCreateVideoWriter(str,CV_FOURCC('X','V','I','D'),
					 cvGetCaptureProperty(pCapture,CV_CAP_PROP_FPS),cvSize(width,height),1);
			}
			
		}
		else
		{
			if(m_isCam)
			{
				cvWriter=cvCreateVideoWriter(filepath,CV_FOURCC('X','V','I','D'),
					 10,cvSize(width,height),1);
			}
			else
			{
				cvWriter=cvCreateVideoWriter(filepath,CV_FOURCC('X','V','I','D'),
					 cvGetCaptureProperty(pCapture,CV_CAP_PROP_FPS),cvSize(width,height),1);
			}
		}

		
		bgModel = new sGMM[width * height];
		ASSERT(bgModel != NULL);
		for(i=0; i<width; i++)
			for(j=0; j<height; j++)
			{
				value[0] = (float)(iplGetPixelRed(pImage,i,j));
				value[1] = (float)(iplGetPixelGreen(pImage,i,j));
				value[2] = (float)(iplGetPixelBlue(pImage,i,j));
				bgModel[j * width + i].Init(K, 3, value);
			}
			//模型初始化
			k = 0;
			while(k < 15)//30->15
			{
				//meanFilter(pImage);
				pImage = cvQueryFrame(pCapture);
				if(!m_isCam)
				{
					FrameNum=(int)cvGetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES);
				}
				ASSERT(pImage!=NULL);
				

				for(i=0; i<width; i++)
					for(j=0; j<height; j++)
					{
						value[0] = (float)(iplGetPixelRed(pImage,i,j));
						value[1] = (float)(iplGetPixelGreen(pImage,i,j));
						value[2] = (float)(iplGetPixelBlue(pImage,i,j));
						bgModel[j * width + i].Init_Process(value);
					}
					k++;
					if(((!m_isCam) && k>FramesCount) || ((!m_isCam) && FrameNum>=FramesCount))
					{
						break;
					}

			}			
			//频率归一化为权重
			for(i=0; i<width; i++)
				for(j=0; j<height; j++)
				{
					bgModel[j * width+i].Norm();
				}	
				
	}

// 	ofstream output("w.txt",ios::ate);
    if(!m_isCam)
	{
		cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_AVI_RATIO,0);
		//FramesCount=cvGetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_COUNT);
 	    

	}
    int frameNUM=0;   
	while(pImage = cvQueryFrame(pCapture))
	{
		//meanFilter(pImage);
		frameNUM++;
		FrameNum=(int)cvGetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES);

		for(int x=0;x<width;x++)
			for(int y=0;y<height;y++)
			{
				value[0] = (float)(iplGetPixelRed(pImage,x,y));
				value[1] = (float)(iplGetPixelGreen(pImage,x,y));
				value[2] = (float)(iplGetPixelBlue(pImage,x,y));

				if(bgModel[y*width+x].Process(value,frameNUM))
				{
					iplSetPixelColor(pResultImage,x,y,0xffffffff);
				}
			    else
				{
					iplSetPixelColor(pResultImage,x,y,0xff000000);
				}
				bgModel[y*width+x].Norm();
// 				for(int j=0;j<K;j++)
// 				{
// 					if(bgModel[y*width+x].m_ptr[j]->match)
// 					{
// // 						w[y*width+x][0]=bgModel[y*width+x].m_ptr[j]->m_weight;
// // 						w[y*width+x][1]=1-bgModel[y*width+x].m_ptr[j]->m_weight;
// 						bgModel[y*width+x].m_ptr[j]->match=false;
// 					//	output<<w[y*width+x][0]<<","<<w[y*width+x][1]<<endl;
// 						break;
// 
// 					}
// 				}
				float redV=0;
				float greenV=0;
				float blueV=0;
				for(int i=0;i<K;i++)
				{
					redV+=bgModel[y*width+x].m_ptr[i]->m_mean[0]*bgModel[y*width+x].m_ptr[i]->m_weight;
					greenV+=bgModel[y*width+x].m_ptr[i]->m_mean[1]*bgModel[y*width+x].m_ptr[i]->m_weight;
					blueV+=bgModel[y*width+x].m_ptr[i]->m_mean[2]*bgModel[y*width+x].m_ptr[i]->m_weight;
				}
				int pixel=getRGB((int)redV,(int)greenV,(int)blueV);
				iplSetPixelColor(back,x,y,pixel);

			}

			SmoothFilter(pResultImage);
			
			////////////////////////////////////////////////以下为graphcut
// 			for(x=0;x<width;x++)
// 				for(int y=0;y<height;y++)
// 				{
// 					PV[y*width+x][0]=(iplGetPixelColor(pResultImage,x,y)==0xff000000 ? 0 : 1);
//                     PV[y*width+x][1]=iplGetPixelColor(pImage,x,y);
// 					bgV[y*width+x]=iplGetPixelColor(back,x,y);
// 				}
// 				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,0xffffffff);
// 					}
// 					else
// 					{
// 						iplSetPixelColor(pResultImage,x,y,0xff000000);
// 					}
// 				}
// 			////////////////////////////////
			shadowElimination(pImage,back,pResultImage);
			IplImage* pResultImage1=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
		pResultImage1->origin=1;

		cvDilate(pResultImage,pResultImage1,NULL,1);
		cvErode(pResultImage1,pResultImage,NULL,1);

			cvShowImage("pImage",pImage);
			cvShowImage("result",pResultImage);

			cvWriteFrame(cvWriter,pResultImage);//写入一帧

			cvMoveWindow("result",250+width, 200);
			cvMoveWindow("pImage", 120, 200);
			cvReleaseImage(&pResultImage1); 

			if(cvWaitKey(1) >= 0 || ((!m_isCam) && FrameNum>=FramesCount))
			{
				break;
			} 
	}

	delete [] bgModel;
// 	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;
// 	}

	cvReleaseVideoWriter(&cvWriter);

	cvReleaseImage(&back);  
	back=NULL;
	cvReleaseImage(&pResultImage); 
	pResultImage=NULL;

	if(pCapture!=NULL)
	{
		cvReleaseCapture(&pCapture);
	}
	
	cvDestroyWindow("pImage");  
	cvDestroyWindow("result");
	
	
	
}

void CObjectExtractionDoc::OnAlgTest() 
{
	 CString str=GetFolderPath();
   

}

void CObjectExtractionDoc::OnSegGetdcimage() 
{

	ASSERT(pCapture!=NULL);
	double FramesCount;
	int FrameNum;
	if(!m_isCam)
	{
		cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_AVI_RATIO,0);
		FramesCount=cvGetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_COUNT);
 	    FrameNum=(int)cvGetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES);

	}
	
	
	cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("pImage", CV_WINDOW_AUTOSIZE); 
	
	if(pImage!=NULL)
	{
		cvReleaseImage(&pImage);  
    	pImage=NULL;
	}
	if(pResultImage!=NULL)
	{
		cvReleaseImage(&pResultImage); 
        pResultImage=NULL;
	}
	pImage = cvQueryFrame(pCapture);
	width=(int)(pImage->width/RATIO);
	height=(int)(pImage->height/RATIO);

	pResultImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
	pResultImage->origin=1;
	getDCImage(pImage,pResultImage);

 	CString str(m_path);
	if(m_isCam)
	{
		str="c:\\tmp.avi";
	}
 	int pos=str.Find(".");
 	str.Insert(pos,"_DC");

	CvVideoWriter* cvWriter;
	CString filepath=GetFilePath(str);

	if(filepath=="")
	{
		if(m_isCam)
		{
			cvWriter=cvCreateVideoWriter(str,CV_FOURCC('X','V','I','D'),
		         10,cvSize(width,height),1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -