📄 hmmdemo.cpp
字号:
// App command to run the dialog
void CHMMDemoApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CHMMDemoApp message handlers
// App command to run the dialog
void CHMMDemoApp::OnFileOpen()
{
CFileDialog dlg( TRUE, 0, 0, OFN_ALLOWMULTISELECT | OFN_ENABLESIZING |
OFN_EXPLORER | OFN_FILEMUSTEXIST,
"Face Base Files (*.txt)|*.txt|"
"Image Files (*.bmp;*.jpg;*.jpeg)|*.bmp;*.jpg;*.jpeg|"
"All Files (*.*)|*.*||", 0 );
int buf_size = 1 << 15;
char* buffer = (char*)malloc(buf_size + 100);
dlg.m_ofn.lpstrFile = buffer;
buffer[0] = '\0';
dlg.m_ofn.nMaxFile = buf_size;
int result = dlg.DoModal();
if( result == IDOK )
{
POSITION pos = dlg.GetStartPosition();
if( pos ) /* at least one image in the list */
{
CHMMDemoView* view = GetCameraView();
view->SetImageList(0);
CStringList* imageList = new CStringList;
while( pos )
{
imageList->AddTail( dlg.GetNextPathName(pos));
}
view->SetImageList( imageList );
CWinApp::OpenDocumentFile( imageList->GetHead() );
}
}
free( buffer );
}
void CHMMDemoApp::OnSettings()
{
CPropertySheet sheet;
sheet.AddPage( m_dlgHMMParams );
sheet.AddPage( m_dlgSamplingParams );
sheet.AddPage( m_dlgMiscParams );
if(sheet.DoModal() == IDOK)
{
CMainFrame* mainframe = (CMainFrame*)AfxGetMainWnd();
CHMMDemoDoc* doc = mainframe->GetCameraView()->GetDocument();
CFaceBase& base = doc->GetFaceBase();
base.SetParams( m_dlgSamplingParams->m_dctSize,
m_dlgSamplingParams->m_obsSize,
m_dlgSamplingParams->m_delta,
m_dlgHMMParams->m_States,
m_dlgHMMParams->m_NumMix,
m_dlgMiscParams->m_useWidth,
m_dlgMiscParams->m_FixedWidth,
m_dlgMiscParams->m_useHeight,
m_dlgMiscParams->m_FixedHeight,
m_dlgMiscParams->m_SuppressIntensity);
}
}
void CHMMDemoApp::OnSaveConfig()
{
CFileDialog dlg( FALSE, 0, 0, /*OFN_ALLOWMULTISELECT | */OFN_ENABLESIZING |
OFN_EXPLORER,
"Config file (*.txt) |*.txt|", 0 );
if ( dlg.DoModal() == IDOK )
{
int res = SaveConfig( dlg.GetFileName() );
ASSERT(res);
}
}
void CHMMDemoApp::OnLoadConfig()
{
CFileDialog dlg( TRUE, 0, 0, /*OFN_ALLOWMULTISELECT | */OFN_ENABLESIZING |
OFN_EXPLORER,
"Config file (*.txt) |*.txt|", 0 );
if ( dlg.DoModal() == IDOK )
{
int res = LoadConfig( dlg.GetFileName(), true );
ASSERT( res );
}
}
int CHMMDemoApp::ExitInstance()
{
SaveSettings();
return CWinApp::ExitInstance();
}
//loads config file without clearing base info
int CHMMDemoApp::LoadConfig(const char *filename, bool synchronize_base)
{
CvSize dctSize, delta, obsSize;
char str[128];
int value;
FILE* file = fopen( filename, "r" );
if ( !file ) return 0;
//set initial values
m_dlgMiscParams->m_useWidth = FALSE;
m_dlgMiscParams->m_FixedWidth = 0;
m_dlgMiscParams->m_useHeight = FALSE;
m_dlgMiscParams->m_FixedHeight = 0;
m_dlgMiscParams->m_SuppressIntensity = FALSE;
while ( !feof(file) )
{
fscanf( file, "%s %d", str, &value );
//here we allow config file to be not hard defined
//Is it useful? - I don't know
if ( strcmp( "WindowWidth", str ) == 0 )
{
dctSize.width = value;
}
else if ( strcmp( "WindowHeight", str ) == 0 )
{
dctSize.height = value;
}
else if ( strcmp( "DeltaX", str ) == 0 )
{
delta.width = value;
}
else if ( strcmp( "DeltaY", str ) == 0 )
{
delta.height = value;
}
else if ( strcmp( "DCTcoeffX", str ) == 0 )
{
obsSize.width = value;
}
else if ( strcmp( "DCTcoeffY", str ) == 0 )
{
obsSize.height = value;
}
else if ( strcmp( "SuperStates", str ) == 0 )
{
m_dlgHMMParams->m_States[0] = value;
}
else if ( strcmp( "States", str ) == 0 )
{
//scan states
ASSERT( m_dlgHMMParams->m_States[0] );//superstates must be already loaded
m_dlgHMMParams->m_States[1] = value;
for(int i = 1; i < m_dlgHMMParams->m_States[0]; i++ )
{
fscanf(file, "%d", &m_dlgHMMParams->m_States[i+1] );
}
}
else if ( strcmp( "NumMixtures", str ) == 0 )
{
m_dlgHMMParams->m_NumMix = value;
}
else if ( strcmp( "FIXED_WIDTH", str ) == 0 )
{
m_dlgMiscParams->m_useWidth = TRUE;
m_dlgMiscParams->m_FixedWidth = value;
}
else if ( strcmp( "FIXED_HEIGHT", str ) == 0 )
{
m_dlgMiscParams->m_useHeight = TRUE;
m_dlgMiscParams->m_FixedHeight = value;
}
else if ( strcmp( "SUPPRESS_INTENSITY", str ) == 0 )
{
m_dlgMiscParams->m_SuppressIntensity = TRUE;
}
else
{
//do nothing
}
}
//check correctness of loaded file
if ( (dctSize.width < obsSize.width)||
(dctSize.height < obsSize.height) )
{
//error message
DoMessageBox( "Wrong parameters in config file\nNew parameters were not loaded", MB_OK|MB_ICONSTOP, 0 );
}
//initialize application variables
m_dlgSamplingParams->m_dctSize = dctSize;
m_dlgSamplingParams->m_obsSize = obsSize;
m_dlgSamplingParams->m_delta = delta;
fclose( file );
if (synchronize_base)
{
CMainFrame* mainframe = (CMainFrame*)AfxGetMainWnd();
CHMMDemoDoc* doc = mainframe->GetCameraView()->GetDocument();
CFaceBase& base = doc->GetFaceBase();
return base.SetParams( //sampling params
m_dlgSamplingParams->m_dctSize,
m_dlgSamplingParams->m_obsSize,
m_dlgSamplingParams->m_delta,
//HMM params
m_dlgHMMParams->m_States,
m_dlgHMMParams->m_NumMix,
//image scaling params
m_dlgMiscParams->m_useWidth,
m_dlgMiscParams->m_FixedWidth,
m_dlgMiscParams->m_useHeight,
m_dlgMiscParams->m_FixedHeight,
//intensity suppression
m_dlgMiscParams->m_SuppressIntensity, 1 );
}
return 1;
}
int CHMMDemoApp::SaveConfig(const char* filename)
{
FILE* file = fopen( filename, "wt" );
if (!file) { ASSERT(0); return 0; }
fprintf( file, "***********Sampling params************\n" );
fprintf( file, "WindowWidth %d\n" , m_dlgSamplingParams->m_dctSize.width );
fprintf( file, "WindowHeight %d\n", m_dlgSamplingParams->m_dctSize.height );
fprintf( file, "DeltaX %d\n" , m_dlgSamplingParams->m_delta.width );
fprintf( file, "DeltaY %d\n", m_dlgSamplingParams->m_delta.height );
fprintf( file, "DCTcoeffX %d\n" , m_dlgSamplingParams->m_obsSize.width );
fprintf( file, "DCTcoeffY %d\n", m_dlgSamplingParams->m_obsSize.height );
fprintf( file, "***************HMM params*************\n" );
fprintf( file, "SuperStates %d\n", m_dlgHMMParams->m_States[0] );
fprintf( file, "States");
for( int i = 0; i < m_dlgHMMParams->m_States[0]; i++ )
{
fprintf( file, " %d", m_dlgHMMParams->m_States[i+1] );
}
fprintf( file, "\n" );
fprintf( file, "NumMixtures %d\n", m_dlgHMMParams->m_NumMix );
fprintf( file, "***************Misc. params*************\n" );
if( m_dlgMiscParams->m_useWidth )
fprintf( file, "FIXED_WIDTH %d\n", m_dlgMiscParams->m_FixedWidth );
if( m_dlgMiscParams->m_useHeight )
fprintf( file, "FIXED_HEIGHT %d\n", m_dlgMiscParams->m_FixedHeight );
if( m_dlgMiscParams->m_SuppressIntensity )
fprintf( file, "SUPPRESS_INTENSITY %d\n", m_dlgMiscParams->m_SuppressIntensity );
fclose( file );
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -