Skip to content
Snippets Groups Projects
Commit f4b189f6 authored by Andrews Sobral's avatar Andrews Sobral
Browse files

MFC GUI Updated

parent cb6ae83b
Branches
Tags
No related merge requests found
Showing
with 2206 additions and 28 deletions
*.rc eol=crlf
*.rc2 eol=crlf
*.vcproj eol=crlf
*.bat eol=crlf
*.sln eol=crlf
\ No newline at end of file
*.sln eol=crlf
*.ico -text
\ No newline at end of file
etc/
binaries/
package_bgs/pt/
java_gui/dist/
java_gui/build/
java_gui/bgslibrary.exe
......@@ -7,4 +8,5 @@ python/
qt_gui/
fet/etc/
*.exe
*.pdb
\ No newline at end of file
*.pdb
vs2010mfc/src/bgslibrary_vs2010_mfc.aps
\ No newline at end of file
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-6131398-5', 'andrewssobral.github.io');
ga('send', 'pageview');
</script>
BGSLibrary
==========
A Background Subtraction Library
Last Page Update: **25/01/2015**
Last Page Update: **01/05/2015**
Latest Library Version: **1.9.2** (see Release Notes for more info)
The BGSLibrary was developed by [Andrews Sobral](https://sites.google.com/site/andrewssobral) and provides an easy-to-use C++ framework based on [OpenCV](http://www.opencv.org/) to perform background subtraction (BGS) in videos. The BGSLibrary compiles under Linux, Mac OS X and Windows. Currently the library offers **37**¹ BGS algorithms. A large amount of algorithms were provided by several authors. The source code is available under GNU GPL v3 license, the library is free and open source for academic purposes².
For Windows users, a demo project for Visual Studio 2010 is provided. An executable version of BGSLibrary is available for Windows 32 bits and 64 bits. For Linux and Mac users, a Makefile can be used to compile all files.
For Windows users, a demo project for Visual Studio 2010/2013 is provided. An executable version of BGSLibrary is available for Windows 32 bits and 64 bits. For Linux and Mac users, a Makefile can be used to compile all files.
Note: the BGSLibrary is based on OpenCV 2.X, if you want to use with OpenCV 3.x please check-out our [opencv3](https://github.com/andrewssobral/bgslibrary/tree/opencv3) branch.
......@@ -171,25 +162,15 @@ Download links
* BGSLibrary v1.9.2 with MFC GUI v1.4.2 (x86/x64)
https://github.com/andrewssobral/bgslibrary/blob/master/binaries/mfc_bgslibrary_x86_v1.4.2.zip
Old versions:
* BGSLibrary v1.9.1 with MFC GUI v1.4.1 (x86/x64) (+src)
https://github.com/andrewssobral/bgslibrary/blob/master/binaries/mfc_bgslibrary_x86_v1.4.1.zip
* BGSLibrary v1.9.0 with MFC GUI v1.4.0 (x86/x64) (+src)
https://github.com/andrewssobral/bgslibrary/blob/master/binaries/mfc_bgslibrary_x86_v1.4.0.7z
https://github.com/andrewssobral/bgslibrary/releases/download/v1.9.2_x86_mfc_gui/bgslibrary_x86_v1.9.2_with_mfc_gui_v1.4.2.7z
* BGSLibrary v1.5.0 with Java GUI for Windows 32bits (x86)
* BGSLibrary v1.9.2 with Java GUI for Windows 32bits (x86)
https://github.com/andrewssobral/bgslibrary/blob/master/binaries/bgs_library_x86_v1.5.0_with_gui.7z
https://github.com/andrewssobral/bgslibrary/releases/download/v1.9.2_x86_java_gui/bgslibrary_x86_v1.9.2_with_java_gui_v1.0.4.7z
* BGSLibrary v1.5.0 with Java GUI for Windows 64bits (x64)
* BGSLibrary v1.9.2 with Java GUI for Windows 64bits (x64)
https://github.com/andrewssobral/bgslibrary/blob/master/binaries/bgs_library_x64_v1.5.0_with_gui.7z
https://github.com/andrewssobral/bgslibrary/releases/download/v1.9.2_x64_java_gui/bgslibrary_x64_v1.9.2_with_java_gui_v1.0.4.7z
![MFC BGSLibrary](https://sites.google.com/site/andrewssobral/mfc_bgslibrary_120.png "MFC BGSLibrary")
......
......@@ -37,4 +37,6 @@
<enableIMBS>0</enableIMBS>
<enableMultiCueBGS>0</enableMultiCueBGS>
<enableSigmaDeltaBGS>0</enableSigmaDeltaBGS>
<enableSuBSENSEBGS>0</enableSuBSENSEBGS>
<enableLOBSTERBGS>0</enableLOBSTERBGS>
</opencv_storage>
*.exe
*.pdb
*.dll
\ No newline at end of file
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File deleted
File added
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
Release/
ipch/
*.exe
*.pdb
*.sdf
*.opensdf
\ No newline at end of file
// App.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "App.h"
#include "Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CApp
BEGIN_MESSAGE_MAP(CApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CApp construction
CApp::CApp()
{
// support Restart Manager
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
// The one and only CApp object
CApp theApp;
// CApp initialization
BOOL CApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// Create the shell manager, in case the dialog contains
// any shell tree view or shell list view controls.
CShellManager *pShellManager = new CShellManager;
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
CDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Delete the shell manager created above.
if (pShellManager != NULL)
{
delete pShellManager;
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
// App.h : main header file for the application
//
#pragma once
#ifndef __AFXWIN_H__
#error "include 'stdafx.h' before including this file for PCH"
#endif
#include "resource.h" // main symbols
// CApp:
// See App.cpp for the implementation of this class
//
class CApp : public CWinApp
{
public:
CApp();
// Overrides
public:
virtual BOOL InitInstance();
// Implementation
DECLARE_MESSAGE_MAP()
};
extern CApp theApp;
\ No newline at end of file
// Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "App.h"
#include "Dlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CDlg dialog
CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_BGSLIST, m_bgslist);
DDX_Control(pDX, IDC_LOG, m_log);
DDX_Control(pDX, IDC_INPUT_VIDEO, m_inputVideo);
DDX_Control(pDX, IDC_USE_WEBCAM, m_useWebCam);
DDX_Control(pDX, IDC_SPIN_WEBCAM_INDEX, m_spinWebCamIndex);
DDX_Control(pDX, IDC_EDIT_WEBCAM_INDEX, m_webCamIndex);
DDX_Control(pDX, IDC_FRAME_NUMBER, m_frameNumber);
DDX_Control(pDX, IDC_SAVE_FRAME, m_saveFrame);
DDX_Control(pDX, IDC_SAVE_MASK, m_saveMask);
DDX_Control(pDX, IDC_SAVE_BKG, m_saveBkg);
DDX_Control(pDX, IDC_IMG_SEQ, m_isImgSeq);
DDX_Control(pDX, IDC_EDIT_START_IDX, m_startIdx);
DDX_Control(pDX, IDC_EDIT_STOP_IDX, m_stopIdx);
DDX_Control(pDX, IDC_COMBO_FILE_TYPE, m_fileTypeList);
DDX_Control(pDX, IDC_SPIN_START_IDX, m_spinStartIdx);
DDX_Control(pDX, IDC_SPIN_STOP_IDX, m_spinStopIdx);
DDX_Control(pDX, IDC_EDIT_DELAY, m_delay);
DDX_Control(pDX, IDC_EXEC_TIME, m_execTime);
DDX_Control(pDX, IDC_MEDIAN_FILTER, m_medianFilter);
}
BEGIN_MESSAGE_MAP(CDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDSTART, &CDlg::OnBnClickedStart)
ON_BN_CLICKED(IDSTOP, &CDlg::OnBnClickedStop)
ON_BN_CLICKED(IDC_USE_WEBCAM, &CDlg::OnBnClickedUseWebcam)
ON_BN_CLICKED(IDC_IMG_SEQ, &CDlg::OnBnClickedImgSeq)
ON_BN_CLICKED(IDSAVE, &CDlg::OnBnClickedSave)
END_MESSAGE_MAP()
// CDlg message handlers
BOOL CDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
methodName = L"";
useWebCam = false;
useImgSeq = false;
filePath = L"";
bgs = NULL;
webCamIndex = 0;
m_spinWebCamIndex.SetRange(0, 9);
m_spinStartIdx.SetRange(0, 999999);
m_spinStopIdx.SetRange(0, 999999);
m_frameNumber.SetWindowTextW(L"0");
addBgsList();
m_fileTypeList.AddString(L"PNG");
m_fileTypeList.AddString(L"JPG");
m_fileTypeList.AddString(L"JPEG");
m_fileTypeList.AddString(L"JPE");
m_fileTypeList.AddString(L"JP2");
m_fileTypeList.AddString(L"BMP");
m_fileTypeList.AddString(L"DIB");
m_fileTypeList.AddString(L"PBM");
m_fileTypeList.AddString(L"PGM");
m_fileTypeList.AddString(L"PPM");
m_fileTypeList.AddString(L"SR");
m_fileTypeList.AddString(L"RAS");
m_fileTypeList.AddString(L"TIFF");
m_fileTypeList.AddString(L"TIF");
m_fileTypeList.SelectString(0,L"PNG");
m_inputVideo.SetWindowTextW(L"dataset/video.avi");
m_delay.SetWindowTextW(L"1");
m_execTime.SetWindowTextW(L"0");
started = false;
if(started == false)
{
cv::namedWindow("INPUT", 1);
HWND hWnd = (HWND) cvGetWindowHandle("INPUT");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_FRAME_INPUT)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
}
if(started == false)
{
cv::namedWindow("MASK", 1);
HWND hWnd = (HWND) cvGetWindowHandle("MASK");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_FRAME_MASK)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
}
if(started == false)
{
cv::namedWindow("BKG", 1);
HWND hWnd = (HWND) cvGetWindowHandle("BKG");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_FRAME_BKG)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CDlg::addBgsList()
{
// 37 algorithms
m_bgslist.AddString(L"FrameDifferenceBGS");
m_bgslist.AddString(L"StaticFrameDifferenceBGS");
m_bgslist.AddString(L"WeightedMovingMeanBGS");
m_bgslist.AddString(L"WeightedMovingVarianceBGS");
m_bgslist.AddString(L"MixtureOfGaussianV1BGS");
m_bgslist.AddString(L"MixtureOfGaussianV2BGS");
m_bgslist.AddString(L"AdaptiveBackgroundLearning");
m_bgslist.AddString(L"AdaptiveSelectiveBackgroundLearning");
m_bgslist.AddString(L"GMG");
m_bgslist.AddString(L"DPAdaptiveMedianBGS");
m_bgslist.AddString(L"DPGrimsonGMMBGS");
m_bgslist.AddString(L"DPZivkovicAGMMBGS");
m_bgslist.AddString(L"DPMeanBGS");
m_bgslist.AddString(L"DPWrenGABGS");
m_bgslist.AddString(L"DPPratiMediodBGS");
m_bgslist.AddString(L"DPEigenbackgroundBGS");
m_bgslist.AddString(L"DPTextureBGS");
m_bgslist.AddString(L"T2FGMM_UM");
m_bgslist.AddString(L"T2FGMM_UV");
m_bgslist.AddString(L"T2FMRF_UM");
m_bgslist.AddString(L"T2FMRF_UV");
m_bgslist.AddString(L"FuzzySugenoIntegral");
m_bgslist.AddString(L"FuzzyChoquetIntegral");
m_bgslist.AddString(L"LBSimpleGaussian");
m_bgslist.AddString(L"LBFuzzyGaussian");
m_bgslist.AddString(L"LBMixtureOfGaussians");
m_bgslist.AddString(L"LBAdaptiveSOM");
m_bgslist.AddString(L"LBFuzzyAdaptiveSOM");
m_bgslist.AddString(L"MultiLayerBGS");
//m_bgslist.AddString(L"PBAS");
m_bgslist.AddString(L"VuMeter");
m_bgslist.AddString(L"KDE");
m_bgslist.AddString(L"IndependentMultimodalBGS");
m_bgslist.AddString(L"SJN_MultiCueBGS");
m_bgslist.AddString(L"SigmaDeltaBGS");
m_bgslist.AddString(L"SuBSENSEBGS");
m_bgslist.AddString(L"LOBSTERBGS");
}
bool CDlg::getBgsMethodName()
{
int nIndex = m_bgslist.GetCurSel();
if(nIndex != CB_ERR)
{
m_bgslist.GetLBText(nIndex, methodName);
return true;
}
else
{
AfxMessageBox(L"Please, select one background subtraction method!");
return false;
}
}
bool CDlg::getFileType()
{
int nIndex = m_fileTypeList.GetCurSel();
if(nIndex != CB_ERR)
{
m_fileTypeList.GetLBText(nIndex, fileType);
return true;
}
else
{
AfxMessageBox(L"Please, select one file type or extension!");
return false;
}
}
bool CDlg::getInputVideoFilePath()
{
m_inputVideo.GetWindowTextW(filePath);
if(filePath.GetLength() > 0)
return true;
else
{
AfxMessageBox(L"Please, select one video file or image sequence folder!");
return false;
}
}
void CDlg::OnBnClickedStart()
{
if(started == false)
{
m_log.SetWindowTextW(L"Checking...");
if(!getBgsMethodName())
{
m_log.SetWindowTextW(L"Stopped...");
return;
}
useWebCam = false;
if(m_useWebCam.GetCheck() == BST_CHECKED)
useWebCam = true;
useImgSeq = false;
if(m_isImgSeq.GetCheck() == BST_CHECKED)
{
useImgSeq = true;
if(!getFileType())
{
m_log.SetWindowTextW(L"Stopped...");
return;
}
}
if(useWebCam == false)
if(!getInputVideoFilePath())
{
m_log.SetWindowTextW(L"Stopped...");
return;
}
m_log.SetWindowTextW(L"Starting...");
thread = AfxBeginThread((AFX_THREADPROC) CDlg::Thread, (LPVOID) this);
}
else
{
AfxMessageBox(L"Thread is already initialized!");
return;
}
}
DWORD CDlg::Thread(LPVOID *lpvParam)
{
CDlg *thr = (CDlg*) lpvParam;
thr->ThreadProcess();
return NULL;
}
void CDlg::ThreadProcess()
{
CString csStartIdx;
m_startIdx.GetWindowTextW(csStartIdx);
startIdx = _tstoi(csStartIdx);
CString csStopIdx;
m_stopIdx.GetWindowTextW(csStopIdx);
stopIdx = _tstoi(csStopIdx);
if(useImgSeq == false)
{
if(useWebCam)
{
CString strIndex;
m_webCamIndex.GetWindowTextW(strIndex);
webCamIndex = _tstoi(strIndex);
capture = cvCaptureFromCAM(webCamIndex);
}
else
{
CStringA file_path_aux(filePath);
capture = cvCaptureFromFile((const char *) file_path_aux);
}
if(!capture)
{
AfxMessageBox(L"ERROR: Cannot initialize video!");
m_log.SetWindowTextW(L"Stopped...");
return;
}
}
else
{
if(stopIdx == 0)
{
AfxMessageBox(L"Stop index not defined!");
return;
}
if(startIdx > stopIdx)
{
AfxMessageBox(L"Start index is higher than stop index!");
return;
}
}
/* Background Subtraction Methods */
if(methodName == "FrameDifferenceBGS")
bgs = new FrameDifferenceBGS;
if(methodName == "StaticFrameDifferenceBGS")
bgs = new StaticFrameDifferenceBGS;
if(methodName == "WeightedMovingMeanBGS")
bgs = new WeightedMovingMeanBGS;
if(methodName == "WeightedMovingVarianceBGS")
bgs = new WeightedMovingVarianceBGS;
if(methodName == "MixtureOfGaussianV1BGS")
bgs = new MixtureOfGaussianV1BGS;
if(methodName == "MixtureOfGaussianV2BGS")
bgs = new MixtureOfGaussianV2BGS;
if(methodName == "AdaptiveBackgroundLearning")
bgs = new AdaptiveBackgroundLearning;
if(methodName == "AdaptiveSelectiveBackgroundLearning")
bgs = new AdaptiveSelectiveBackgroundLearning;
if(methodName == "GMG")
bgs = new GMG;
if(methodName == "DPAdaptiveMedianBGS")
bgs = new DPAdaptiveMedianBGS;
if(methodName == "DPGrimsonGMMBGS")
bgs = new DPGrimsonGMMBGS;
if(methodName == "DPZivkovicAGMMBGS")
bgs = new DPZivkovicAGMMBGS;
if(methodName == "DPMeanBGS")
bgs = new DPMeanBGS;
if(methodName == "DPWrenGABGS")
bgs = new DPWrenGABGS;
if(methodName == "DPPratiMediodBGS")
bgs = new DPPratiMediodBGS;
if(methodName == "DPEigenbackgroundBGS")
bgs = new DPEigenbackgroundBGS;
if(methodName == "DPTextureBGS")
bgs = new DPTextureBGS;
if(methodName == "T2FGMM_UM")
bgs = new T2FGMM_UM;
if(methodName == "T2FGMM_UV")
bgs = new T2FGMM_UV;
if(methodName == "T2FMRF_UM")
bgs = new T2FMRF_UM;
if(methodName == "T2FMRF_UV")
bgs = new T2FMRF_UV;
if(methodName == "FuzzySugenoIntegral")
bgs = new FuzzySugenoIntegral;
if(methodName == "FuzzyChoquetIntegral")
bgs = new FuzzyChoquetIntegral;
if(methodName == "LBSimpleGaussian")
bgs = new LBSimpleGaussian;
if(methodName == "LBFuzzyGaussian")
bgs = new LBFuzzyGaussian;
if(methodName == "LBMixtureOfGaussians")
bgs = new LBMixtureOfGaussians;
if(methodName == "LBAdaptiveSOM")
bgs = new LBAdaptiveSOM;
if(methodName == "LBFuzzyAdaptiveSOM")
bgs = new LBFuzzyAdaptiveSOM;
if(methodName == "MultiLayerBGS")
bgs = new MultiLayerBGS;
//if(methodName == "PBAS")
//bgs = new PixelBasedAdaptiveSegmenter;
if(methodName == "VuMeter")
bgs = new VuMeter;
if(methodName == "KDE")
bgs = new KDE;
if(methodName == "IndependentMultimodalBGS")
bgs = new IndependentMultimodalBGS;
if(methodName == "SJN_MultiCueBGS")
bgs = new SJN_MultiCueBGS;
if (methodName == "SigmaDeltaBGS")
bgs = new SigmaDeltaBGS;
if (methodName == "SuBSENSEBGS")
bgs = new SuBSENSEBGS;
if (methodName == "LOBSTERBGS")
bgs = new LOBSTERBGS;
if(bgs == NULL)
{
AfxMessageBox(L"BGS object not defined!");
return;
}
started = true;
int i = 0;
if(useImgSeq == true && startIdx > 0)
i = startIdx - 1;
CString strFrameNumber;
CString strExecTime;
cv::Size default_size;
default_size.width = 235;
default_size.height = 189;
IplImage* frame;
std::string input_filename;
cv::Mat img_input;
// Convert a TCHAR string to a LPCSTR
CT2CA fileType2(fileType);
CT2CA filePath2(filePath);
// construct a std::string using the LPCSTR input
std::string str_fileType(fileType2);
std::string str_filePath(filePath2);
// delay
CString csDelay;
m_delay.GetWindowTextW(csDelay);
int delay = _tstoi(csDelay);
do
{
m_log.SetWindowTextW(L"Running...");
i++;
//::Sleep(1);
if(useImgSeq == true && i == (stopIdx + 1))
break;
if(useImgSeq)
{
input_filename = str_filePath + "\\" + boost::lexical_cast<std::string>(i) + "." + str_fileType;
img_input = cv::imread(input_filename);
CString input_filename2(input_filename.c_str());
m_log.SetWindowTextW(input_filename2);
strFrameNumber.Format(L"%d",i);
m_frameNumber.SetWindowTextW(strFrameNumber);
if(img_input.data == NULL)
{
AfxMessageBox(L"File can not be read!");
break;
}
}
else
{
if(useWebCam == false && stopIdx >= 2 && i > stopIdx)
break;
frame = cvQueryFrame(capture);
if(!frame)
break;
if(useWebCam == false && startIdx >= 2 && i < startIdx)
continue;
img_input = cv::Mat(frame,true);
}
cv::Mat img_mask;
cv::Mat img_bkg;
Clock::time_point t0 = Clock::now();
bgs->process(img_input, img_mask, img_bkg);
Clock::time_point t1 = Clock::now();
auto d = boost::chrono::duration_cast<milliseconds>(t1 - t0);
//std::cout << "\nElapsed time: " << d.count() << "ms" << std::endl;
cv::Mat img_input_aux;
cv::resize(img_input, img_input_aux, default_size);
cv::Mat img_mask_aux;
if(img_mask.empty())
img_mask = cv::Mat::zeros(cv::Size(img_input.size().width, img_input.size().height), img_input.type());
if(m_medianFilter.GetCheck() == BST_CHECKED)
cv::medianBlur(img_mask, img_mask, 5);
cv::resize(img_mask, img_mask_aux, default_size);
cv::Mat img_bgk_aux;
if(img_bkg.empty())
img_bkg = cv::Mat::zeros(cv::Size(img_input.size().width, img_input.size().height), img_input.type());
cv::resize(img_bkg, img_bgk_aux, default_size);
cv::imshow("INPUT", img_input_aux);
cv::imshow("MASK", img_mask_aux);
cv::imshow("BKG", img_bgk_aux);
extern_input_filename = "outputs/input/" + boost::lexical_cast<std::string>(i)+".png";
img_input.copyTo(extern_input_img);
if(m_saveFrame.GetCheck() == BST_CHECKED)
cv::imwrite(extern_input_filename, img_input);
extern_fg_filename = "outputs/foreground/" + boost::lexical_cast<std::string>(i)+".png";
img_mask.copyTo(extern_fg_img);
if(m_saveMask.GetCheck() == BST_CHECKED)
cv::imwrite(extern_fg_filename, img_mask);
extern_bg_filename = "outputs/background/" + boost::lexical_cast<std::string>(i)+".png";
img_bkg.copyTo(extern_bg_img);
if(m_saveBkg.GetCheck() == BST_CHECKED)
cv::imwrite(extern_bg_filename, img_bkg);
strFrameNumber.Format(L"%d",i);
m_frameNumber.SetWindowTextW(strFrameNumber);
//strExecTime.Format(_T("%.2f"), d.count());
strExecTime.Format(_T("%d"), d.count());
m_execTime.SetWindowTextW(strExecTime);
::Sleep(delay);
}while(1);
delete bgs;
if(!useImgSeq)
cvReleaseCapture(&capture);
//AfxMessageBox(L"Thread is finished!");
m_log.SetWindowTextW(L"Finished!");
started = false;
}
void CDlg::OnBnClickedStop()
{
if(started)
{
m_log.SetWindowTextW(L"Stopping...");
StopThread();
if(!useImgSeq)
if(capture)
cvReleaseCapture(&capture);
delete bgs;
bgs = NULL;
m_log.SetWindowTextW(L"Stopped!");
started = false;
}
}
void CDlg::StopThread()
{
DWORD exit_code = NULL;
if(thread != NULL)
{
GetExitCodeThread(thread->m_hThread, &exit_code);
if(exit_code == STILL_ACTIVE)
{
::TerminateThread(thread->m_hThread, 0);
CloseHandle(thread->m_hThread);
}
thread->m_hThread = NULL;
thread = NULL;
}
}
void CDlg::OnBnClickedUseWebcam()
{
if(m_useWebCam.GetCheck() == BST_CHECKED)
m_isImgSeq.SetCheck(BST_UNCHECKED);
m_inputVideo.EnableFileBrowseButton();
}
void CDlg::OnBnClickedImgSeq()
{
if(m_isImgSeq.GetCheck() == BST_CHECKED)
{
m_inputVideo.EnableFolderBrowseButton();
m_useWebCam.SetCheck(BST_UNCHECKED);
}
else
{
m_startIdx.SetWindowTextW(L"0");
m_stopIdx.SetWindowTextW(L"0");
m_inputVideo.EnableFileBrowseButton();
}
}
void CDlg::OnBnClickedSave()
{
if(m_saveFrame.GetCheck() == BST_CHECKED)
cv::imwrite(extern_input_filename, extern_input_img);
if(m_saveMask.GetCheck() == BST_CHECKED)
cv::imwrite(extern_fg_filename, extern_fg_img);
if(m_saveBkg.GetCheck() == BST_CHECKED)
cv::imwrite(extern_bg_filename, extern_bg_img);
m_log.SetWindowTextW(L"OK! Saved!");
}
// Dlg.h : header file
//
#pragma once
#include "stdafx.h"
#include "afxwin.h"
#include "afxcmn.h"
// CDlg dialog
class CDlg : public CDialogEx
{
// Construction
public:
CDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_APP };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
bool started;
CWinThread* thread;
CvCapture* capture;
IBGS* bgs;
CString methodName;
CString fileType;
bool useWebCam;
bool useImgSeq;
int webCamIndex;
int startIdx;
int stopIdx;
int extern_i;
std::string extern_input_filename;
cv::Mat extern_input_img;
std::string extern_fg_filename;
cv::Mat extern_fg_img;
std::string extern_bg_filename;
cv::Mat extern_bg_img;
CString filePath;
public:
afx_msg void ThreadProcess();
static DWORD Thread(LPVOID *x);
afx_msg void StopThread();
afx_msg bool ipDraw(HDC hdc, IplImage* img, int xoffset=0, int yoffset=0);
public:
void addBgsList();
bool getBgsMethodName();
CComboBox m_bgslist;
afx_msg void OnBnClickedStart();
CStatic m_log;
CMFCEditBrowseCtrl m_inputVideo;
bool getInputVideoFilePath();
CButton m_useWebCam;
afx_msg void OnBnClickedStop();
CSpinButtonCtrl m_spinWebCamIndex;
CEdit m_webCamIndex;
CStatic m_frameNumber;
CButton m_saveFrame;
CButton m_saveMask;
CButton m_saveBkg;
CButton m_isImgSeq;
CEdit m_startIdx;
CEdit m_stopIdx;
CComboBox m_fileTypeList;
bool getFileType();
CSpinButtonCtrl m_spinStartIdx;
CSpinButtonCtrl m_spinStopIdx;
afx_msg void OnBnClickedUseWebcam();
afx_msg void OnBnClickedImgSeq();
CEdit m_delay;
CStatic m_execTime;
CButton m_medianFilter;
afx_msg void OnBnClickedSave();
};
================================================================================
MICROSOFT FOUNDATION CLASS LIBRARY : bgslibrary_vs2010_mfc Project Overview
===============================================================================
The application wizard has created this bgslibrary_vs2010_mfc application for
you. This application not only demonstrates the basics of using the Microsoft
Foundation Classes but is also a starting point for writing your application.
This file contains a summary of what you will find in each of the files that
make up your bgslibrary_vs2010_mfc application.
bgslibrary_vs2010_mfc.vcxproj
This is the main project file for VC++ projects generated using an application wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
application wizard.
bgslibrary_vs2010_mfc.vcxproj.filters
This is the filters file for VC++ projects generated using an Application Wizard.
It contains information about the association between the files in your project
and the filters. This association is used in the IDE to show grouping of files with
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
"Source Files" filter).
bgslibrary_vs2010_mfc.h
This is the main header file for the application. It includes other
project specific headers (including Resource.h) and declares the
CApp application class.
bgslibrary_vs2010_mfc.cpp
This is the main application source file that contains the application
class CApp.
bgslibrary_vs2010_mfc.rc
This is a listing of all of the Microsoft Windows resources that the
program uses. It includes the icons, bitmaps, and cursors that are stored
in the RES subdirectory. This file can be directly edited in Microsoft
Visual C++. Your project resources are in 1033.
res\bgslibrary_vs2010_mfc.ico
This is an icon file, which is used as the application's icon. This
icon is included by the main resource file bgslibrary_vs2010_mfc.rc.
res\bgslibrary_vs2010_mfc.rc2
This file contains resources that are not edited by Microsoft
Visual C++. You should place all resources not editable by
the resource editor in this file.
/////////////////////////////////////////////////////////////////////////////
The application wizard creates one dialog class:
Dlg.h, Dlg.cpp - the dialog
These files contain your CDlg class. This class defines
the behavior of your application's main dialog. The dialog's template is
in bgslibrary_vs2010_mfc.rc, which can be edited in Microsoft Visual C++.
/////////////////////////////////////////////////////////////////////////////
Other Features:
ActiveX Controls
The application includes support to use ActiveX controls.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named bgslibrary_vs2010_mfc.pch and a precompiled types file named StdAfx.obj.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft Visual C++ reads and updates this file.
bgslibrary_vs2010_mfc.manifest
Application manifest files are used by Windows XP to describe an applications
dependency on specific versions of Side-by-Side assemblies. The loader uses this
information to load the appropriate assembly from the assembly cache or private
from the application. The Application manifest maybe included for redistribution
as an external .manifest file that is installed in the same folder as the application
executable or it may be included in the executable in the form of a resource.
/////////////////////////////////////////////////////////////////////////////
Other notes:
The application wizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
If your application uses MFC in a shared DLL, you will need
to redistribute the MFC DLLs. If your application is in a language
other than the operating system's locale, you will also have to
redistribute the corresponding localized resources MFC100XXX.DLL.
For more information on both of these topics, please see the section on
redistributing Visual C++ applications in MSDN documentation.
/////////////////////////////////////////////////////////////////////////////
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About MFC BGSLibrary"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,14,14,20,20
LTEXT "MFC BGSLibrary, Version 1.4.2",IDC_STATIC,42,14,114,8,SS_NOPREFIX
LTEXT "Copyright (C) 2014",IDC_STATIC,42,26,114,8
DEFPUSHBUTTON "OK",IDOK,113,41,50,14,WS_GROUP
END
IDD_APP DIALOGEX 0, 0, 505, 257
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "BGSLibrary MFC GUI"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "Start",IDSTART,390,236,50,14
PUSHBUTTON "Stop",IDSTOP,448,236,50,14
LTEXT "Background Subtraction Method:",IDC_STATIC,7,7,106,8
COMBOBOX IDC_COMBO_BGSLIST,7,20,111,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Log:",IDC_LOG,7,242,310,8
LTEXT "Input (video file or image sequence):",IDC_STATIC,130,7,119,8
CONTROL "",IDC_INPUT_VIDEO,"MfcEditBrowse",WS_BORDER | WS_TABSTOP | 0x80,130,20,361,14
CONTROL "",IDC_FRAME_INPUT,"Static",SS_BLACKFRAME | SS_CENTERIMAGE | SS_REALSIZEIMAGE | WS_BORDER,7,69,160,120
CTEXT "Input",IDC_STATIC,7,58,160,8
CONTROL "",IDC_FRAME_MASK,"Static",SS_BLACKFRAME | SS_CENTERIMAGE | SS_REALSIZEIMAGE | WS_BORDER,170,69,160,120
CTEXT "Foreground Mask",IDC_STATIC,170,58,160,8
CONTROL "Use Web Camera",IDC_USE_WEBCAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,40,69,10
EDITTEXT IDC_EDIT_WEBCAM_INDEX,77,39,33,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "",IDC_SPIN_WEBCAM_INDEX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,99,39,11,14
LTEXT "Frame number:",IDC_TEXT_FRAME_NUMBER,45,221,50,8
RTEXT "0",IDC_FRAME_NUMBER,97,221,35,8
CONTROL "",IDC_FRAME_BKG,"Static",SS_BLACKFRAME | WS_BORDER,333,69,160,120
CTEXT "Background Model",IDC_STATIC,333,58,160,8
CONTROL "Save input frames",IDC_SAVE_FRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,74,10
CONTROL "Save foreground masks",IDC_SAVE_MASK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,191,91,10
CONTROL "Save background models",IDC_SAVE_BKG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,333,191,95,10
CONTROL "The input is a sequence of images?",IDC_IMG_SEQ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,130,40,127,10
LTEXT "Start index:",IDC_STATIC,257,40,39,8
EDITTEXT IDC_EDIT_START_IDX,295,38,40,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "",IDC_SPIN_START_IDX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,323,38,10,14
LTEXT "Stop index:",IDC_STATIC,341,40,38,8
EDITTEXT IDC_EDIT_STOP_IDX,378,38,40,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "",IDC_SPIN_STOP_IDX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,407,38,10,14
LTEXT "File type:",IDC_STATIC,424,40,31,8
COMBOBOX IDC_COMBO_FILE_TYPE,456,38,35,19,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Delay:",IDC_STATIC,73,207,22,8
EDITTEXT IDC_EDIT_DELAY,97,205,32,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER
LTEXT "ms",IDC_STATIC,132,207,10,8
CONTROL "Median filter",IDC_MEDIAN_FILTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,265,191,55,10
LTEXT "Execution time (ms/frame):",IDC_STATIC,7,232,88,8
RTEXT "0",IDC_EXEC_TIME,97,233,35,8
PUSHBUTTON "Save Results",IDSAVE,331,236,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "BGSLibrary"
VALUE "FileDescription", "bgslibrary_vs2010_mfc"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "bgslibrary_vs2010_mfc.exe"
VALUE "LegalCopyright", "TODO: (c) MFC BGSLibrary. All rights reserved."
VALUE "OriginalFilename", "bgslibrary_vs2010_mfc.exe"
VALUE "ProductName", "MFC BGSLibrary"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 163
TOPMARGIN, 7
BOTTOMMARGIN, 55
END
IDD_APP, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 498
TOPMARGIN, 7
BOTTOMMARGIN, 250
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
IDD_APP DLGINIT
BEGIN
IDC_INPUT_VIDEO, 0x37c, 42, 0
0x4d3c, 0x4346, 0x6445, 0x7469, 0x7242, 0x776f, 0x6573, 0x4d5f, 0x646f,
0x3e65, 0x3c31, 0x4d2f, 0x4346, 0x6445, 0x7469, 0x7242, 0x776f, 0x6573,
0x4d5f, 0x646f, 0x3e65,
0
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_ABOUTBOX "&About MFC BGSLibrary..."
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Portuguese (Brazil) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTB)
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#ifndef APSTUDIO_INVOKED\r\n"
"#include ""targetver.h""\r\n"
"#endif\r\n"
"#include ""afxres.h""\r\n"
"#include ""verrsrc.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"LANGUAGE 9, 1\r\n"
"#include ""res\\bgslibrary_vs2010_mfc.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\bgslibrary_vs2010_mfc.ico"
#endif // Portuguese (Brazil) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\bgslibrary_vs2010_mfc.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bgslibrary_vs2010_mfc", "bgslibrary_vs2010_mfc.vcxproj", "{236E77EE-00D6-4B4E-80C7-C38847B1B60E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{236E77EE-00D6-4B4E-80C7-C38847B1B60E}.Debug|Win32.ActiveCfg = Debug|Win32
{236E77EE-00D6-4B4E-80C7-C38847B1B60E}.Debug|Win32.Build.0 = Debug|Win32
{236E77EE-00D6-4B4E-80C7-C38847B1B60E}.Release|Win32.ActiveCfg = Release|Win32
{236E77EE-00D6-4B4E-80C7-C38847B1B60E}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
File added
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment