📄 objectextractiondoc.cpp
字号:
// 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 + -