2011-12-02 18:34:08 +00:00
/*
* Copyright ( C ) 2011 , Mathieu Labbe - IntRoLab - Universite de Sherbrooke
*/
2011-10-25 15:48:19 +00:00
# include "MainWindow.h"
# include "AddObjectDialog.h"
# include "ui_mainWindow.h"
# include "qtipl.h"
# include "KeypointItem.h"
2011-11-15 16:37:40 +00:00
# include "ObjWidget.h"
2011-10-25 15:48:19 +00:00
# include "Camera.h"
# include "Settings.h"
# include "ParametersToolBox.h"
2011-11-24 19:11:30 +00:00
# include "AboutDialog.h"
2011-10-25 15:48:19 +00:00
# include <iostream>
# include <stdio.h>
# include "opencv2/calib3d/calib3d.hpp"
# include <QtCore/QTextStream>
# include <QtCore/QFile>
# include <QtGui/QFileDialog>
# include <QtGui/QMessageBox>
# include <QtGui/QGraphicsScene>
2011-11-09 15:07:19 +00:00
# include <QtGui/QGraphicsRectItem>
2011-11-23 16:44:14 +00:00
# include <QtGui/QSpinBox>
2011-11-26 12:45:35 +00:00
# include <QtGui/QStatusBar>
2012-01-04 17:30:36 +00:00
# include <QtGui/QProgressDialog>
2012-02-04 00:11:11 +00:00
# include <QtGui/QCloseEvent>
2011-10-25 15:48:19 +00:00
2011-11-23 16:44:14 +00:00
// Camera ownership transferred
MainWindow : : MainWindow ( Camera * camera , QWidget * parent ) :
2011-10-25 15:48:19 +00:00
QMainWindow ( parent ) ,
2011-11-23 19:12:41 +00:00
camera_ ( camera ) ,
2012-02-04 00:11:11 +00:00
lowestRefreshRate_ ( 99 ) ,
objectsModified_ ( false )
2011-10-25 15:48:19 +00:00
{
ui_ = new Ui_mainWindow ( ) ;
ui_ - > setupUi ( this ) ;
2011-11-24 19:11:30 +00:00
aboutDialog_ = new AboutDialog ( this ) ;
2011-11-26 12:45:35 +00:00
this - > setStatusBar ( new QStatusBar ( ) ) ;
2011-10-25 15:48:19 +00:00
2011-11-23 16:44:14 +00:00
if ( ! camera_ )
{
camera_ = new Camera ( this ) ;
}
else
{
camera_ - > setParent ( this ) ;
}
2011-10-25 15:48:19 +00:00
QByteArray geometry ;
2011-11-10 14:00:20 +00:00
Settings : : loadSettings ( Settings : : iniDefaultPath ( ) , & geometry ) ;
2011-10-25 15:48:19 +00:00
this - > restoreGeometry ( geometry ) ;
ui_ - > toolBox - > setupUi ( ) ;
2011-11-23 16:44:14 +00:00
connect ( ( QSpinBox * ) ui_ - > toolBox - > getParameterWidget ( Settings : : kCamera_imageRate ( ) ) ,
SIGNAL ( editingFinished ( ) ) ,
camera_ ,
SLOT ( updateImageRate ( ) ) ) ;
2011-10-25 15:48:19 +00:00
ui_ - > dockWidget_parameters - > hide ( ) ;
ui_ - > menuView - > addAction ( ui_ - > dockWidget_parameters - > toggleViewAction ( ) ) ;
ui_ - > menuView - > addAction ( ui_ - > dockWidget_objects - > toggleViewAction ( ) ) ;
2012-01-28 01:00:23 +00:00
connect ( ui_ - > toolBox , SIGNAL ( parametersChanged ( ) ) , this , SLOT ( notifyParametersChanged ( ) ) ) ;
2011-10-25 15:48:19 +00:00
ui_ - > imageView_source - > setGraphicsViewMode ( false ) ;
2012-02-04 22:15:32 +00:00
ui_ - > imageView_source - > setTextLabel ( tr ( " Press \" space \" to start camera... " ) ) ;
2011-10-25 15:48:19 +00:00
//reset button
connect ( ui_ - > pushButton_restoreDefaults , SIGNAL ( clicked ( ) ) , ui_ - > toolBox , SLOT ( resetCurrentPage ( ) ) ) ;
2012-01-28 01:00:23 +00:00
// udpate objects button
connect ( ui_ - > pushButton_updateObjects , SIGNAL ( clicked ( ) ) , this , SLOT ( updateObjects ( ) ) ) ;
2011-10-25 15:48:19 +00:00
ui_ - > actionStop_camera - > setEnabled ( false ) ;
2012-01-30 03:16:30 +00:00
ui_ - > actionPause_camera - > setEnabled ( false ) ;
2011-10-25 15:48:19 +00:00
ui_ - > actionSave_objects - > setEnabled ( false ) ;
// Actions
2012-02-04 22:15:32 +00:00
connect ( ui_ - > actionAdd_object_from_scene , SIGNAL ( triggered ( ) ) , this , SLOT ( addObjectFromScene ( ) ) ) ;
2012-01-30 00:54:23 +00:00
connect ( ui_ - > actionAdd_objects_from_files , SIGNAL ( triggered ( ) ) , this , SLOT ( addObjectsFromFiles ( ) ) ) ;
connect ( ui_ - > actionLoad_scene_from_file , SIGNAL ( triggered ( ) ) , this , SLOT ( loadSceneFromFile ( ) ) ) ;
2011-11-23 19:12:41 +00:00
connect ( ui_ - > actionStart_camera , SIGNAL ( triggered ( ) ) , this , SLOT ( startProcessing ( ) ) ) ;
2011-11-23 18:58:55 +00:00
connect ( ui_ - > actionStop_camera , SIGNAL ( triggered ( ) ) , this , SLOT ( stopProcessing ( ) ) ) ;
2012-01-30 03:16:30 +00:00
connect ( ui_ - > actionPause_camera , SIGNAL ( triggered ( ) ) , this , SLOT ( pauseProcessing ( ) ) ) ;
2011-10-25 15:48:19 +00:00
connect ( ui_ - > actionExit , SIGNAL ( triggered ( ) ) , this , SLOT ( close ( ) ) ) ;
connect ( ui_ - > actionSave_objects , SIGNAL ( triggered ( ) ) , this , SLOT ( saveObjects ( ) ) ) ;
connect ( ui_ - > actionLoad_objects , SIGNAL ( triggered ( ) ) , this , SLOT ( loadObjects ( ) ) ) ;
2012-02-04 22:15:32 +00:00
connect ( ui_ - > actionCamera_from_video_file , SIGNAL ( triggered ( ) ) , this , SLOT ( setupCameraFromVideoFile ( ) ) ) ;
2011-11-24 19:11:30 +00:00
connect ( ui_ - > actionAbout , SIGNAL ( triggered ( ) ) , aboutDialog_ , SLOT ( exec ( ) ) ) ;
2012-01-12 22:21:56 +00:00
connect ( ui_ - > actionRestore_all_default_settings , SIGNAL ( triggered ( ) ) , ui_ - > toolBox , SLOT ( resetAllPages ( ) ) ) ;
2012-02-04 00:11:11 +00:00
connect ( ui_ - > actionRemove_all_objects , SIGNAL ( triggered ( ) ) , this , SLOT ( removeAllObjects ( ) ) ) ;
2011-11-23 19:12:41 +00:00
2012-02-04 22:15:32 +00:00
ui_ - > actionStart_camera - > setShortcut ( Qt : : Key_Space ) ;
ui_ - > actionPause_camera - > setShortcut ( Qt : : Key_Space ) ;
ui_ - > actionCamera_from_video_file - > setCheckable ( true ) ;
ui_ - > actionCamera_from_video_file - > setChecked ( ! Settings : : getCamera_videoFilePath ( ) . isEmpty ( ) ) ;
2012-01-30 03:16:30 +00:00
2012-01-30 00:54:23 +00:00
if ( Settings : : getGeneral_autoStartCamera ( ) )
{
// Set 1 msec to see state on the status bar.
QTimer : : singleShot ( 1 , this , SLOT ( startProcessing ( ) ) ) ;
}
2011-10-25 15:48:19 +00:00
}
MainWindow : : ~ MainWindow ( )
{
2011-11-23 16:44:14 +00:00
disconnect ( camera_ , SIGNAL ( imageReceived ( const cv : : Mat & ) ) , this , SLOT ( update ( const cv : : Mat & ) ) ) ;
camera_ - > stop ( ) ;
2011-10-25 15:48:19 +00:00
dataTree_ = cv : : Mat ( ) ;
qDeleteAll ( objects_ . begin ( ) , objects_ . end ( ) ) ;
objects_ . clear ( ) ;
delete ui_ ;
}
void MainWindow : : closeEvent ( QCloseEvent * event )
{
2012-02-04 00:11:11 +00:00
bool quit = true ;
this - > stopProcessing ( ) ;
if ( objectsModified_ & & this - > isVisible ( ) & & objects_ . size ( ) )
{
int ret = QMessageBox : : question ( this , tr ( " Save new objects " ) , tr ( " Do you want to save added objects? " ) , QMessageBox : : Yes | QMessageBox : : No | QMessageBox : : Cancel ) ;
switch ( ret )
{
case QMessageBox : : Yes :
quit = this - > saveObjects ( ) ;
break ;
case QMessageBox : : Cancel :
quit = false ;
break ;
case QMessageBox : : No :
default :
break ;
}
}
if ( quit )
{
Settings : : saveSettings ( Settings : : iniDefaultPath ( ) , this - > saveGeometry ( ) ) ;
event - > accept ( ) ;
}
else
{
event - > ignore ( ) ;
}
2011-10-25 15:48:19 +00:00
}
2011-11-23 22:04:58 +00:00
ParametersToolBox * MainWindow : : parametersToolBox ( ) const
{
return ui_ - > toolBox ;
}
2012-02-04 00:11:11 +00:00
void MainWindow : : loadObjects ( const QString & dirPath )
2011-10-25 15:48:19 +00:00
{
2012-02-04 00:11:11 +00:00
QDir dir ( dirPath ) ;
if ( dir . exists ( ) )
2011-10-25 15:48:19 +00:00
{
2012-02-04 22:15:32 +00:00
QStringList filters = Settings : : getGeneral_imageFormats ( ) . split ( ' ' ) ;
2012-02-04 00:11:11 +00:00
QFileInfoList list = dir . entryInfoList ( filters , QDir : : Files , QDir : : Name ) ;
for ( int i = 0 ; i < list . size ( ) ; + + i )
2011-10-25 15:48:19 +00:00
{
2012-02-04 00:11:11 +00:00
this - > addObjectFromFile ( list . at ( i ) . filePath ( ) ) ;
}
if ( list . size ( ) )
{
this - > updateObjects ( ) ;
2011-10-25 15:48:19 +00:00
}
2011-11-23 18:58:55 +00:00
}
}
2012-02-04 00:11:11 +00:00
void MainWindow : : saveObjects ( const QString & dirPath )
2011-11-23 18:58:55 +00:00
{
2012-02-04 00:11:11 +00:00
QDir dir ( dirPath ) ;
if ( dir . exists ( ) )
2011-11-23 18:58:55 +00:00
{
2012-02-04 00:11:11 +00:00
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
objects_ . at ( i ) - > image ( ) . save ( QString ( " %1/%2.bmp " ) . arg ( dirPath ) . arg ( objects_ . at ( i ) - > id ( ) ) ) ;
}
2011-11-23 18:58:55 +00:00
}
}
void MainWindow : : loadObjects ( )
{
2012-02-04 00:11:11 +00:00
QString dirPath = QFileDialog : : getExistingDirectory ( this , tr ( " Load objects... " ) , Settings : : workingDirectory ( ) ) ;
if ( ! dirPath . isEmpty ( ) )
2011-11-23 18:58:55 +00:00
{
2012-02-04 00:11:11 +00:00
loadObjects ( dirPath ) ;
2011-10-25 15:48:19 +00:00
}
}
2012-02-04 00:11:11 +00:00
bool MainWindow : : saveObjects ( )
2011-10-25 15:48:19 +00:00
{
2012-02-04 00:11:11 +00:00
QString dirPath = QFileDialog : : getExistingDirectory ( this , tr ( " Save objects... " ) , Settings : : workingDirectory ( ) ) ;
if ( ! dirPath . isEmpty ( ) )
2011-10-25 15:48:19 +00:00
{
2012-02-04 00:11:11 +00:00
saveObjects ( dirPath ) ;
return true ;
2011-10-25 15:48:19 +00:00
}
2012-02-04 00:11:11 +00:00
return false ;
2011-10-25 15:48:19 +00:00
}
2011-11-15 16:37:40 +00:00
void MainWindow : : removeObject ( ObjWidget * object )
2011-10-25 15:48:19 +00:00
{
if ( object )
{
objects_ . removeOne ( object ) ;
object - > deleteLater ( ) ;
this - > updateData ( ) ;
2012-02-04 22:15:32 +00:00
if ( ! camera_ - > isRunning ( ) & & ui_ - > imageView_source - > iplImage ( ) )
{
cv : : Mat image ( ui_ - > imageView_source - > iplImage ( ) , true ) ;
this - > update ( image ) ;
}
2011-10-25 15:48:19 +00:00
}
}
2012-02-04 00:11:11 +00:00
void MainWindow : : removeAllObjects ( )
{
2012-02-04 22:15:32 +00:00
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
delete objects_ . at ( i ) ;
}
objects_ . clear ( ) ;
this - > updateData ( ) ;
if ( ! camera_ - > isRunning ( ) & & ui_ - > imageView_source - > iplImage ( ) )
2012-02-04 00:11:11 +00:00
{
2012-02-04 22:15:32 +00:00
cv : : Mat image ( ui_ - > imageView_source - > iplImage ( ) , true ) ;
this - > update ( image ) ;
2012-02-04 00:11:11 +00:00
}
}
2012-02-04 22:15:32 +00:00
void MainWindow : : addObjectFromScene ( )
2011-10-25 15:48:19 +00:00
{
2011-11-23 19:12:41 +00:00
disconnect ( camera_ , SIGNAL ( imageReceived ( const cv : : Mat & ) ) , this , SLOT ( update ( const cv : : Mat & ) ) ) ;
2012-02-04 22:15:32 +00:00
AddObjectDialog * dialog ;
bool resumeCamera = camera_ - > isRunning ( ) ;
if ( ! ui_ - > actionStart_camera - > isEnabled ( ) | | ! ui_ - > imageView_source - > iplImage ( ) )
2011-10-25 15:48:19 +00:00
{
2012-02-04 22:15:32 +00:00
dialog = new AddObjectDialog ( camera_ , ui_ - > imageView_source - > iplImage ( ) , ui_ - > imageView_source - > isMirrorView ( ) , this ) ;
2011-10-25 15:48:19 +00:00
}
2012-02-04 22:15:32 +00:00
else
{
dialog = new AddObjectDialog ( 0 , ui_ - > imageView_source - > iplImage ( ) , ui_ - > imageView_source - > isMirrorView ( ) , this ) ;
}
if ( dialog - > exec ( ) = = QDialog : : Accepted )
{
ObjWidget * obj = dialog - > retrieveObject ( ) ;
if ( obj )
{
objects_ . push_back ( obj ) ;
showObject ( objects_ . last ( ) ) ;
updateData ( ) ;
objectsModified_ = true ;
}
}
if ( resumeCamera | | ! ui_ - > imageView_source - > iplImage ( ) )
{
this - > startProcessing ( ) ;
}
else
{
connect ( camera_ , SIGNAL ( imageReceived ( const cv : : Mat & ) ) , this , SLOT ( update ( const cv : : Mat & ) ) ) ;
cv : : Mat image ( ui_ - > imageView_source - > iplImage ( ) , true ) ;
this - > update ( image ) ;
}
delete dialog ;
2011-10-25 15:48:19 +00:00
}
2012-01-30 00:54:23 +00:00
void MainWindow : : addObjectsFromFiles ( )
{
2012-02-04 22:15:32 +00:00
QStringList fileNames = QFileDialog : : getOpenFileNames ( this , tr ( " Add objects... " ) , Settings : : workingDirectory ( ) , tr ( " Image Files (%1) " ) . arg ( Settings : : getGeneral_imageFormats ( ) ) ) ;
2012-01-30 00:54:23 +00:00
if ( fileNames . size ( ) )
{
for ( int i = 0 ; i < fileNames . size ( ) ; + + i )
{
2012-02-04 00:11:11 +00:00
this - > addObjectFromFile ( fileNames . at ( i ) ) ;
}
objectsModified_ = true ;
updateObjects ( ) ;
}
}
void MainWindow : : addObjectFromFile ( const QString & filePath )
{
2012-02-04 22:15:32 +00:00
printf ( " Load file %s \n " , filePath . toStdString ( ) . c_str ( ) ) ;
2012-02-04 00:11:11 +00:00
if ( ! filePath . isNull ( ) )
{
IplImage * img = cvLoadImage ( filePath . toStdString ( ) . c_str ( ) , CV_LOAD_IMAGE_GRAYSCALE ) ;
if ( img )
{
int id = 0 ;
QFileInfo file ( filePath ) ;
QStringList list = file . fileName ( ) . split ( ' . ' ) ;
if ( list . size ( ) )
2012-01-30 00:54:23 +00:00
{
2012-02-04 00:11:11 +00:00
bool ok = false ;
id = list . front ( ) . toInt ( & ok ) ;
if ( ok )
{
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
if ( objects_ . at ( i ) - > id ( ) = = id )
{
if ( this - > isVisible ( ) )
{
QMessageBox : : warning ( this , tr ( " Warning " ) , tr ( " Object %1 already added, a new ID will be generated. " ) . arg ( id ) ) ;
}
else
{
printf ( " WARNING: Object %d already added, a new ID will be generated. " , id ) ;
}
id = 0 ;
break ;
}
}
}
else
{
id = 0 ;
}
2012-01-30 00:54:23 +00:00
}
2012-02-04 00:11:11 +00:00
objects_ . append ( new ObjWidget ( id , std : : vector < cv : : KeyPoint > ( ) , cv : : Mat ( ) , img , " " , " " ) ) ;
this - > showObject ( objects_ . last ( ) ) ;
cvReleaseImage ( & img ) ;
2012-01-30 00:54:23 +00:00
}
}
}
void MainWindow : : loadSceneFromFile ( )
{
2012-02-04 22:15:32 +00:00
QString fileName = QFileDialog : : getOpenFileName ( this , tr ( " Load scene... " ) , Settings : : workingDirectory ( ) , tr ( " Image Files (%1) " ) . arg ( Settings : : getGeneral_imageFormats ( ) ) ) ;
2012-01-30 00:54:23 +00:00
if ( ! fileName . isEmpty ( ) )
{
IplImage * img = cvLoadImage ( fileName . toStdString ( ) . c_str ( ) ) ;
if ( img )
{
cv : : Mat imageMat ( img ) ;
this - > update ( imageMat ) ;
cvReleaseImage ( & img ) ;
ui_ - > label_timeRefreshRate - > setVisible ( false ) ;
}
}
}
2012-01-30 03:16:30 +00:00
void MainWindow : : setupCameraFromVideoFile ( )
{
2012-02-04 22:15:32 +00:00
if ( ! ui_ - > actionCamera_from_video_file - > isChecked ( ) )
2012-01-30 03:16:30 +00:00
{
2012-02-04 22:15:32 +00:00
Settings : : setCamera_videoFilePath ( " " ) ;
2012-01-30 03:16:30 +00:00
ui_ - > toolBox - > updateParameter ( Settings : : kCamera_videoFilePath ( ) ) ;
2012-02-04 22:15:32 +00:00
}
else
{
QString fileName = QFileDialog : : getOpenFileName ( this , tr ( " Setup camera from video file... " ) , Settings : : workingDirectory ( ) , tr ( " Video Files (%1) " ) . arg ( Settings : : getGeneral_videoFormats ( ) ) ) ;
if ( ! fileName . isEmpty ( ) )
2012-01-30 03:16:30 +00:00
{
2012-02-04 22:15:32 +00:00
Settings : : setCamera_videoFilePath ( fileName ) ;
ui_ - > toolBox - > updateParameter ( Settings : : kCamera_videoFilePath ( ) ) ;
if ( camera_ - > isRunning ( ) )
{
this - > stopProcessing ( ) ;
this - > startProcessing ( ) ;
}
2012-01-30 03:16:30 +00:00
}
}
2012-02-04 22:15:32 +00:00
ui_ - > actionCamera_from_video_file - > setChecked ( ! Settings : : getCamera_videoFilePath ( ) . isEmpty ( ) ) ;
2012-01-30 03:16:30 +00:00
}
2011-11-15 16:37:40 +00:00
void MainWindow : : showObject ( ObjWidget * obj )
2011-10-25 15:48:19 +00:00
{
if ( obj )
{
obj - > setGraphicsViewMode ( false ) ;
2012-01-28 01:00:23 +00:00
obj - > setMirrorView ( ui_ - > imageView_source - > isMirrorView ( ) ) ;
2011-11-15 16:37:40 +00:00
QList < ObjWidget * > objs = ui_ - > objects_area - > findChildren < ObjWidget * > ( ) ;
2011-10-25 15:48:19 +00:00
QVBoxLayout * vLayout = new QVBoxLayout ( ) ;
2011-11-17 20:31:08 +00:00
obj - > setMinimumSize ( obj - > image ( ) . width ( ) , obj - > image ( ) . height ( ) ) ;
2012-01-04 17:30:36 +00:00
int id = Settings : : getGeneral_nextObjID ( ) ;
2011-10-25 15:48:19 +00:00
if ( obj - > id ( ) = = 0 )
{
obj - > setId ( id + + ) ;
Settings : : setGeneral_nextObjID ( id ) ;
}
else if ( obj - > id ( ) > id )
{
id = obj - > id ( ) + 1 ;
Settings : : setGeneral_nextObjID ( id ) ;
}
2012-01-30 03:16:30 +00:00
ui_ - > toolBox - > updateParameter ( Settings : : kGeneral_nextObjID ( ) ) ;
2011-10-25 15:48:19 +00:00
QLabel * title = new QLabel ( QString ( " %1 (%2) " ) . arg ( obj - > id ( ) ) . arg ( QString : : number ( obj - > keypoints ( ) . size ( ) ) ) , this ) ;
QLabel * detectorDescriptorType = new QLabel ( QString ( " %1/%2 " ) . arg ( obj - > detectorType ( ) ) . arg ( obj - > descriptorType ( ) ) , this ) ;
2012-01-28 01:00:23 +00:00
QLabel * detectedLabel = new QLabel ( this ) ;
title - > setObjectName ( QString ( " %1title " ) . arg ( obj - > id ( ) ) ) ;
detectorDescriptorType - > setObjectName ( QString ( " %1type " ) . arg ( obj - > id ( ) ) ) ;
2011-10-25 15:48:19 +00:00
detectedLabel - > setObjectName ( QString ( " %1detection " ) . arg ( obj - > id ( ) ) ) ;
QHBoxLayout * hLayout = new QHBoxLayout ( ) ;
hLayout - > addWidget ( title ) ;
hLayout - > addWidget ( detectorDescriptorType ) ;
hLayout - > addWidget ( detectedLabel ) ;
hLayout - > addStretch ( 1 ) ;
vLayout - > addLayout ( hLayout ) ;
vLayout - > addWidget ( obj ) ;
objects_ . last ( ) - > setDeletable ( true ) ;
2011-11-15 16:37:40 +00:00
connect ( obj , SIGNAL ( removalTriggered ( ObjWidget * ) ) , this , SLOT ( removeObject ( ObjWidget * ) ) ) ;
2011-10-25 15:48:19 +00:00
connect ( obj , SIGNAL ( destroyed ( QObject * ) ) , title , SLOT ( deleteLater ( ) ) ) ;
connect ( obj , SIGNAL ( destroyed ( QObject * ) ) , detectedLabel , SLOT ( deleteLater ( ) ) ) ;
connect ( obj , SIGNAL ( destroyed ( QObject * ) ) , detectorDescriptorType , SLOT ( deleteLater ( ) ) ) ;
connect ( obj , SIGNAL ( destroyed ( QObject * ) ) , vLayout , SLOT ( deleteLater ( ) ) ) ;
ui_ - > verticalLayout_objects - > insertLayout ( ui_ - > verticalLayout_objects - > count ( ) - 1 , vLayout ) ;
}
}
2012-01-28 01:00:23 +00:00
void MainWindow : : updateObjects ( )
{
if ( objects_ . size ( ) )
{
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
IplImage * img = cvCloneImage ( objects_ . at ( i ) - > iplImage ( ) ) ;
cv : : FeatureDetector * detector = Settings : : createFeaturesDetector ( ) ;
std : : vector < cv : : KeyPoint > keypoints ;
detector - > detect ( img , keypoints ) ;
delete detector ;
cv : : Mat descriptors ;
if ( keypoints . size ( ) )
{
cv : : DescriptorExtractor * extractor = Settings : : createDescriptorsExtractor ( ) ;
extractor - > compute ( img , keypoints , descriptors ) ;
delete extractor ;
if ( ( int ) keypoints . size ( ) ! = descriptors . rows )
{
printf ( " ERROR : kpt=%d != descriptors=%d \n " , ( int ) keypoints . size ( ) , descriptors . rows ) ;
}
}
else
{
printf ( " WARNING: no features detected in object %d !?! \n " , objects_ . at ( i ) - > id ( ) ) ;
}
objects_ . at ( i ) - > setData ( keypoints , descriptors , img , Settings : : currentDetectorType ( ) , Settings : : currentDescriptorType ( ) ) ;
//update object labels
QLabel * title = qFindChild < QLabel * > ( this , QString ( " %1title " ) . arg ( objects_ . at ( i ) - > id ( ) ) ) ;
title - > setText ( QString ( " %1 (%2) " ) . arg ( objects_ . at ( i ) - > id ( ) ) . arg ( QString : : number ( objects_ . at ( i ) - > keypoints ( ) . size ( ) ) ) ) ;
QLabel * detectorDescriptorType = qFindChild < QLabel * > ( this , QString ( " %1type " ) . arg ( objects_ . at ( i ) - > id ( ) ) ) ;
detectorDescriptorType - > setText ( QString ( " %1/%2 " ) . arg ( objects_ . at ( i ) - > detectorType ( ) ) . arg ( objects_ . at ( i ) - > descriptorType ( ) ) ) ;
}
updateData ( ) ;
2012-02-04 22:15:32 +00:00
}
if ( ! camera_ - > isRunning ( ) & & ui_ - > imageView_source - > iplImage ( ) )
{
cv : : Mat image ( ui_ - > imageView_source - > iplImage ( ) , true ) ;
this - > update ( image ) ;
2012-01-28 01:00:23 +00:00
}
this - > statusBar ( ) - > clearMessage ( ) ;
}
2011-10-25 15:48:19 +00:00
void MainWindow : : updateData ( )
{
if ( objects_ . size ( ) )
{
ui_ - > actionSave_objects - > setEnabled ( true ) ;
}
else
{
ui_ - > actionSave_objects - > setEnabled ( false ) ;
}
dataTree_ = cv : : Mat ( ) ;
dataRange_ . clear ( ) ;
int count = 0 ;
int dim = - 1 ;
int type = - 1 ;
// Get the total size and verify descriptors
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
if ( dim > = 0 & & objects_ . at ( i ) - > descriptors ( ) . cols ! = dim )
{
2012-01-30 03:16:30 +00:00
if ( this - > isVisible ( ) )
{
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Descriptors of the objects are not all the same size! \n Objects opened must have all the same size (and from the same descriptor extractor). " ) ) ;
}
else
{
printf ( " ERROR: Descriptors of the objects are not all the same size! Objects opened must have all the same size (and from the same descriptor extractor). " ) ;
}
2011-10-25 15:48:19 +00:00
return ;
}
dim = objects_ . at ( i ) - > descriptors ( ) . cols ;
if ( type > = 0 & & objects_ . at ( i ) - > descriptors ( ) . type ( ) ! = type )
{
2012-01-30 03:16:30 +00:00
if ( this - > isVisible ( ) )
{
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Descriptors of the objects are not all the same type! \n Objects opened must have been processed by the same descriptor extractor. " ) ) ;
}
else
{
printf ( " ERROR: Descriptors of the objects are not all the same type! Objects opened must have been processed by the same descriptor extractor. " ) ;
}
2011-10-25 15:48:19 +00:00
return ;
}
type = objects_ . at ( i ) - > descriptors ( ) . type ( ) ;
count + = objects_ . at ( i ) - > descriptors ( ) . rows ;
}
// Copy data
if ( count )
{
cv : : Mat data ( count , dim , type ) ;
printf ( " Total descriptors=%d, dim=%d, type=%d \n " , count , dim , type ) ;
int row = 0 ;
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
cv : : Mat dest ( data , cv : : Range ( row , row + objects_ . at ( i ) - > descriptors ( ) . rows ) ) ;
objects_ . at ( i ) - > descriptors ( ) . copyTo ( dest ) ;
row + = objects_ . at ( i ) - > descriptors ( ) . rows ;
dataRange_ . append ( row ) ;
}
data . convertTo ( dataTree_ , CV_32F ) ;
}
}
2011-11-23 18:58:55 +00:00
void MainWindow : : startProcessing ( )
2011-10-25 15:48:19 +00:00
{
2012-02-04 22:15:32 +00:00
bool updateStatusMessage = this - > statusBar ( ) - > currentMessage ( ) . isEmpty ( ) ;
if ( updateStatusMessage )
{
this - > statusBar ( ) - > showMessage ( tr ( " Starting camera... " ) ) ;
}
2011-11-23 16:44:14 +00:00
if ( camera_ - > start ( ) )
2011-10-25 15:48:19 +00:00
{
2011-11-23 16:44:14 +00:00
connect ( camera_ , SIGNAL ( imageReceived ( const cv : : Mat & ) ) , this , SLOT ( update ( const cv : : Mat & ) ) ) ;
2011-10-25 15:48:19 +00:00
ui_ - > actionStop_camera - > setEnabled ( true ) ;
2012-01-30 03:16:30 +00:00
ui_ - > actionPause_camera - > setEnabled ( true ) ;
2011-10-25 15:48:19 +00:00
ui_ - > actionStart_camera - > setEnabled ( false ) ;
2012-01-30 00:54:23 +00:00
ui_ - > actionLoad_scene_from_file - > setEnabled ( false ) ;
ui_ - > label_timeRefreshRate - > setVisible ( true ) ;
2012-02-04 22:15:32 +00:00
if ( updateStatusMessage )
{
this - > statusBar ( ) - > showMessage ( tr ( " Camera started. " ) , 2000 ) ;
}
2011-10-25 15:48:19 +00:00
}
else
{
2012-02-04 22:15:32 +00:00
if ( updateStatusMessage )
{
this - > statusBar ( ) - > clearMessage ( ) ;
}
2012-01-30 03:16:30 +00:00
if ( this - > isVisible ( ) )
{
QMessageBox : : critical ( this , tr ( " Camera error " ) , tr ( " Camera initialization failed! (with device %1) " ) . arg ( Settings : : getCamera_deviceId ( ) ) ) ;
}
else
{
printf ( " ERROR: Camera initialization failed! (with device %d) " , Settings : : getCamera_deviceId ( ) ) ;
}
2011-10-25 15:48:19 +00:00
}
}
2011-11-23 18:58:55 +00:00
void MainWindow : : stopProcessing ( )
2011-10-25 15:48:19 +00:00
{
if ( camera_ )
{
2011-11-23 16:44:14 +00:00
disconnect ( camera_ , SIGNAL ( imageReceived ( const cv : : Mat & ) ) , this , SLOT ( update ( const cv : : Mat & ) ) ) ;
camera_ - > stop ( ) ;
2011-10-25 15:48:19 +00:00
}
ui_ - > actionStop_camera - > setEnabled ( false ) ;
2012-01-30 03:16:30 +00:00
ui_ - > actionPause_camera - > setEnabled ( false ) ;
2011-10-25 15:48:19 +00:00
ui_ - > actionStart_camera - > setEnabled ( true ) ;
2012-01-30 00:54:23 +00:00
ui_ - > actionLoad_scene_from_file - > setEnabled ( true ) ;
2011-10-25 15:48:19 +00:00
}
2012-01-30 03:16:30 +00:00
void MainWindow : : pauseProcessing ( )
{
ui_ - > actionStop_camera - > setEnabled ( true ) ;
ui_ - > actionPause_camera - > setEnabled ( true ) ;
ui_ - > actionStart_camera - > setEnabled ( false ) ;
if ( camera_ - > isRunning ( ) )
{
camera_ - > pause ( ) ;
}
else
{
camera_ - > start ( ) ;
}
}
2011-11-23 16:44:14 +00:00
void MainWindow : : update ( const cv : : Mat & image )
2011-10-25 15:48:19 +00:00
{
// reset objects color
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
objects_ [ i ] - > resetKptsColor ( ) ;
}
2011-11-23 16:44:14 +00:00
if ( ! image . empty ( ) )
2011-10-25 15:48:19 +00:00
{
2011-11-23 16:44:14 +00:00
IplImage iplImage = image ;
QTime time ;
time . start ( ) ;
//Convert to grayscale
IplImage * imageGrayScale = 0 ;
if ( iplImage . nChannels ! = 1 | | iplImage . depth ! = IPL_DEPTH_8U )
{
imageGrayScale = cvCreateImage ( cvSize ( iplImage . width , iplImage . height ) , IPL_DEPTH_8U , 1 ) ;
cvCvtColor ( & iplImage , imageGrayScale , CV_BGR2GRAY ) ;
}
cv : : Mat img ;
if ( imageGrayScale )
{
img = cv : : Mat ( imageGrayScale ) ;
}
else
2011-10-25 15:48:19 +00:00
{
2011-11-23 16:44:14 +00:00
img = cv : : Mat ( & iplImage ) ;
}
2011-10-25 15:48:19 +00:00
2011-11-23 16:44:14 +00:00
// EXTRACT KEYPOINTS
cv : : FeatureDetector * detector = Settings : : createFeaturesDetector ( ) ;
std : : vector < cv : : KeyPoint > keypoints ;
detector - > detect ( img , keypoints ) ;
delete detector ;
ui_ - > label_timeDetection - > setText ( QString : : number ( time . restart ( ) ) ) ;
cv : : Mat descriptors ;
2012-01-05 00:31:29 +00:00
if ( keypoints . size ( ) )
2011-11-23 16:44:14 +00:00
{
2012-01-05 00:31:29 +00:00
// EXTRACT DESCRIPTORS
cv : : DescriptorExtractor * extractor = Settings : : createDescriptorsExtractor ( ) ;
extractor - > compute ( img , keypoints , descriptors ) ;
delete extractor ;
if ( ( int ) keypoints . size ( ) ! = descriptors . rows )
{
printf ( " ERROR : kpt=%d != descriptors=%d \n " , ( int ) keypoints . size ( ) , descriptors . rows ) ;
}
if ( imageGrayScale )
{
cvReleaseImage ( & imageGrayScale ) ;
}
ui_ - > label_timeExtraction - > setText ( QString : : number ( time . restart ( ) ) ) ;
2011-11-23 16:44:14 +00:00
}
2012-01-05 00:31:29 +00:00
else
2011-11-23 16:44:14 +00:00
{
2012-01-05 00:31:29 +00:00
printf ( " WARNING: no features detected !?! \n " ) ;
ui_ - > label_timeExtraction - > setText ( QString : : number ( 0 ) ) ;
2011-11-23 16:44:14 +00:00
}
2011-10-25 15:48:19 +00:00
2011-11-23 16:44:14 +00:00
// COMPARE
2012-01-05 00:31:29 +00:00
if ( ! dataTree_ . empty ( ) & & keypoints . size ( ) & & ( Settings : : getNearestNeighbor_nndrRatioUsed ( ) | | Settings : : getNearestNeighbor_minDistanceUsed ( ) ) )
2011-11-23 16:44:14 +00:00
{
// CREATE INDEX
cv : : Mat environment ( descriptors . rows , descriptors . cols , CV_32F ) ;
descriptors . convertTo ( environment , CV_32F ) ;
cv : : flann : : Index treeFlannIndex ( environment , cv : : flann : : KDTreeIndexParams ( ) ) ;
ui_ - > label_timeIndexing - > setText ( QString : : number ( time . restart ( ) ) ) ;
2012-01-05 00:31:29 +00:00
2011-11-23 16:44:14 +00:00
// DO NEAREST NEIGHBOR
2012-01-04 17:30:36 +00:00
int k = 1 ;
if ( Settings : : getNearestNeighbor_nndrRatioUsed ( ) )
{
k = 2 ;
}
2011-11-23 16:44:14 +00:00
int emax = 64 ;
cv : : Mat results ( dataTree_ . rows , k , CV_32SC1 ) ; // results index
cv : : Mat dists ( dataTree_ . rows , k , CV_32FC1 ) ; // Distance results are CV_32FC1
treeFlannIndex . knnSearch ( dataTree_ , results , dists , k , cv : : flann : : SearchParams ( emax ) ) ; // maximum number of leafs checked
ui_ - > label_timeMatching - > setText ( QString : : number ( time . restart ( ) ) ) ;
// PROCESS RESULTS
2011-11-23 18:58:55 +00:00
if ( this - > isVisible ( ) )
{
2012-01-28 01:00:23 +00:00
ui_ - > imageView_source - > setData ( keypoints , cv : : Mat ( ) , & iplImage , Settings : : currentDetectorType ( ) , Settings : : currentDescriptorType ( ) ) ;
2011-11-23 18:58:55 +00:00
}
2011-11-23 16:44:14 +00:00
int j = 0 ;
std : : vector < cv : : Point2f > mpts_1 , mpts_2 ;
std : : vector < int > indexes_1 , indexes_2 ;
std : : vector < uchar > outlier_mask ;
2012-01-04 21:08:42 +00:00
QMap < int , QPair < QRect , QTransform > > objectsDetected ;
2012-01-04 17:30:36 +00:00
float minMatchedDistance = - 1.0f ;
float maxMatchedDistance = - 1.0f ;
2011-11-23 18:08:33 +00:00
for ( int i = 0 ; i < dataTree_ . rows ; + + i )
2011-10-25 15:48:19 +00:00
{
2012-02-04 22:15:32 +00:00
int nColor = j % 11 + 7 ;
QColor color ( ( Qt : : GlobalColor ) ( nColor = = Qt : : yellow ? Qt : : gray : nColor ) ) ;
2012-01-04 17:30:36 +00:00
bool matched = false ;
2011-11-23 16:44:14 +00:00
// Check if this descriptor matches with those of the objects
2012-01-04 17:30:36 +00:00
if ( Settings : : getNearestNeighbor_nndrRatioUsed ( ) & &
dists . at < float > ( i , 0 ) < = Settings : : getNearestNeighbor_nndrRatio ( ) * dists . at < float > ( i , 1 ) )
{
matched = true ;
}
if ( ( matched | | ! Settings : : getNearestNeighbor_nndrRatioUsed ( ) ) & &
Settings : : getNearestNeighbor_minDistanceUsed ( ) )
{
if ( dists . at < float > ( i , 0 ) < = Settings : : getNearestNeighbor_minDistance ( ) )
{
matched = true ;
}
else
{
matched = false ;
}
}
if ( minMatchedDistance = = - 1 | | minMatchedDistance > dists . at < float > ( i , 0 ) )
{
minMatchedDistance = dists . at < float > ( i , 0 ) ;
}
if ( maxMatchedDistance = = - 1 | | maxMatchedDistance < dists . at < float > ( i , 0 ) )
{
maxMatchedDistance = dists . at < float > ( i , 0 ) ;
}
if ( matched )
2011-11-23 16:44:14 +00:00
{
if ( j > 0 )
{
mpts_1 . push_back ( objects_ . at ( j ) - > keypoints ( ) . at ( i - dataRange_ . at ( j - 1 ) ) . pt ) ;
indexes_1 . push_back ( i - dataRange_ . at ( j - 1 ) ) ;
}
else
{
mpts_1 . push_back ( objects_ . at ( j ) - > keypoints ( ) . at ( i ) . pt ) ;
indexes_1 . push_back ( i ) ;
}
2011-11-23 18:58:55 +00:00
mpts_2 . push_back ( keypoints . at ( results . at < int > ( i , 0 ) ) . pt ) ;
2011-11-23 16:44:14 +00:00
indexes_2 . push_back ( results . at < int > ( i , 0 ) ) ;
2012-01-04 21:58:29 +00:00
// colorize all matched if homography is not computed
if ( ! Settings : : getHomography_homographyComputed ( ) )
{
objects_ . at ( j ) - > setKptColor ( indexes_1 . back ( ) , color ) ;
ui_ - > imageView_source - > setKptColor ( results . at < int > ( i , 0 ) , color ) ;
}
2011-11-23 16:44:14 +00:00
}
2011-10-25 15:48:19 +00:00
2011-11-23 16:44:14 +00:00
if ( i + 1 > = dataRange_ . at ( j ) )
2011-10-25 15:48:19 +00:00
{
2011-11-23 16:44:14 +00:00
QLabel * label = ui_ - > dockWidget_objects - > findChild < QLabel * > ( QString ( " %1detection " ) . arg ( objects_ . at ( j ) - > id ( ) ) ) ;
2012-01-04 21:58:29 +00:00
if ( Settings : : getHomography_homographyComputed ( ) )
2011-10-25 15:48:19 +00:00
{
2012-01-04 21:58:29 +00:00
if ( mpts_1 . size ( ) > = Settings : : getHomography_minimumInliers ( ) )
2011-10-25 15:48:19 +00:00
{
2012-01-04 21:58:29 +00:00
cv : : Mat H = findHomography ( mpts_1 ,
mpts_2 ,
cv : : RANSAC ,
Settings : : getHomography_ransacReprojThr ( ) ,
outlier_mask ) ;
uint inliers = 0 , outliers = 0 ;
for ( unsigned int k = 0 ; k < mpts_1 . size ( ) ; + + k )
2011-11-23 16:44:14 +00:00
{
2012-01-04 21:58:29 +00:00
if ( outlier_mask . at ( k ) )
{
+ + inliers ;
}
else
{
+ + outliers ;
}
2011-11-23 16:44:14 +00:00
}
2011-10-25 15:48:19 +00:00
2012-01-04 21:58:29 +00:00
// COLORIZE
if ( inliers > = Settings : : getHomography_minimumInliers ( ) )
2011-10-25 15:48:19 +00:00
{
2012-01-04 21:58:29 +00:00
if ( this - > isVisible ( ) )
2011-10-25 15:48:19 +00:00
{
2012-01-04 21:58:29 +00:00
for ( unsigned int k = 0 ; k < mpts_1 . size ( ) ; + + k )
2011-11-23 18:58:55 +00:00
{
2012-01-04 21:58:29 +00:00
if ( outlier_mask . at ( k ) )
{
objects_ . at ( j ) - > setKptColor ( indexes_1 . at ( k ) , color ) ;
ui_ - > imageView_source - > setKptColor ( indexes_2 . at ( k ) , color ) ;
}
else
{
2012-01-05 00:31:29 +00:00
objects_ . at ( j ) - > setKptColor ( indexes_1 . at ( k ) , QColor ( 0 , 0 , 0 ) ) ;
2012-01-04 21:58:29 +00:00
}
2011-11-23 18:58:55 +00:00
}
2011-10-25 15:48:19 +00:00
}
2012-01-04 21:58:29 +00:00
QTransform hTransform (
H . at < double > ( 0 , 0 ) , H . at < double > ( 1 , 0 ) , H . at < double > ( 2 , 0 ) ,
H . at < double > ( 0 , 1 ) , H . at < double > ( 1 , 1 ) , H . at < double > ( 2 , 1 ) ,
H . at < double > ( 0 , 2 ) , H . at < double > ( 1 , 2 ) , H . at < double > ( 2 , 2 ) ) ;
// find center of object
QRect rect = objects_ . at ( j ) - > image ( ) . rect ( ) ;
objectsDetected . insert ( objects_ . at ( j ) - > id ( ) , QPair < QRect , QTransform > ( rect , hTransform ) ) ;
// Example getting the center of the object in the scene using the homography
//QPoint pos(rect.width()/2, rect.height()/2);
//hTransform.map(pos)
// add rectangle
if ( this - > isVisible ( ) )
{
label - > setText ( QString ( " %1 in %2 out " ) . arg ( inliers ) . arg ( outliers ) ) ;
QPen rectPen ( color ) ;
rectPen . setWidth ( 4 ) ;
QGraphicsRectItem * rectItem = new QGraphicsRectItem ( rect ) ;
rectItem - > setPen ( rectPen ) ;
rectItem - > setTransform ( hTransform ) ;
ui_ - > imageView_source - > addRect ( rectItem ) ;
}
}
else
2011-11-23 18:58:55 +00:00
{
2012-01-04 21:58:29 +00:00
label - > setText ( QString ( " Too low inliers (%1) " ) . arg ( inliers ) ) ;
2011-11-23 18:58:55 +00:00
}
2011-10-25 15:48:19 +00:00
}
else
{
2012-01-04 21:58:29 +00:00
label - > setText ( QString ( " Too low matches (%1) " ) . arg ( mpts_1 . size ( ) ) ) ;
2011-10-25 15:48:19 +00:00
}
}
2011-11-23 16:44:14 +00:00
else
{
2012-01-04 21:58:29 +00:00
label - > setText ( QString ( " %1 matches " ) . arg ( mpts_1 . size ( ) ) ) ;
2011-11-23 16:44:14 +00:00
}
mpts_1 . clear ( ) ;
mpts_2 . clear ( ) ;
indexes_1 . clear ( ) ;
indexes_2 . clear ( ) ;
outlier_mask . clear ( ) ;
+ + j ;
2011-10-25 15:48:19 +00:00
}
}
2012-01-04 17:30:36 +00:00
ui_ - > label_minMatchedDistance - > setNum ( minMatchedDistance ) ;
ui_ - > label_maxMatchedDistance - > setNum ( maxMatchedDistance ) ;
2011-11-23 18:58:55 +00:00
2012-01-04 21:08:42 +00:00
if ( objectsDetected . size ( ) )
2011-11-23 18:58:55 +00:00
{
2012-01-04 21:08:42 +00:00
emit objectsFound ( objectsDetected ) ;
2011-11-23 18:58:55 +00:00
}
2011-11-23 16:44:14 +00:00
}
2011-11-23 18:58:55 +00:00
else if ( this - > isVisible ( ) )
2011-11-23 16:44:14 +00:00
{
2012-01-28 01:00:23 +00:00
ui_ - > imageView_source - > setData ( keypoints , cv : : Mat ( ) , & iplImage , Settings : : currentDetectorType ( ) , Settings : : currentDescriptorType ( ) ) ;
2011-11-23 16:44:14 +00:00
}
2011-10-25 15:48:19 +00:00
2011-11-23 18:58:55 +00:00
if ( this - > isVisible ( ) )
2011-11-23 16:44:14 +00:00
{
2011-11-23 18:58:55 +00:00
//Update object pictures
for ( int i = 0 ; i < objects_ . size ( ) ; + + i )
{
objects_ [ i ] - > update ( ) ;
}
2011-10-25 15:48:19 +00:00
}
2011-11-23 16:44:14 +00:00
ui_ - > label_nfeatures - > setText ( QString : : number ( keypoints . size ( ) ) ) ;
ui_ - > imageView_source - > update ( ) ;
ui_ - > label_timeGui - > setText ( QString : : number ( time . restart ( ) ) ) ;
2011-10-25 15:48:19 +00:00
}
ui_ - > label_detectorDescriptorType - > setText ( QString ( " %1/%2 " ) . arg ( Settings : : currentDetectorType ( ) ) . arg ( Settings : : currentDescriptorType ( ) ) ) ;
2011-11-23 19:12:41 +00:00
int refreshRate = qRound ( 1000.0f / float ( updateRate_ . restart ( ) ) ) ;
if ( refreshRate > 0 & & refreshRate < lowestRefreshRate_ )
{
lowestRefreshRate_ = refreshRate ;
}
// Refresh the label only after each 1000 ms
if ( refreshStartTime_ . elapsed ( ) > 1000 )
{
2012-01-04 17:30:36 +00:00
if ( Settings : : getCamera_imageRate ( ) > 0 )
2011-11-23 22:12:44 +00:00
{
2012-01-04 17:30:36 +00:00
ui_ - > label_timeRefreshRate - > setText ( QString ( " (%1 Hz - %2 Hz) " ) . arg ( QString : : number ( Settings : : getCamera_imageRate ( ) ) ) . arg ( QString : : number ( lowestRefreshRate_ ) ) ) ;
2011-11-23 22:12:44 +00:00
}
else
{
ui_ - > label_timeRefreshRate - > setText ( QString ( " (%2 Hz) " ) . arg ( QString : : number ( lowestRefreshRate_ ) ) ) ;
}
2011-11-23 19:12:41 +00:00
lowestRefreshRate_ = 99 ;
refreshStartTime_ . start ( ) ;
}
2011-10-25 15:48:19 +00:00
}
2012-01-28 01:00:23 +00:00
void MainWindow : : notifyParametersChanged ( )
{
2012-02-04 22:15:32 +00:00
printf ( " Parameters changed... \n " ) ;
2012-01-28 01:00:23 +00:00
if ( objects_ . size ( ) )
{
this - > statusBar ( ) - > showMessage ( tr ( " A parameter has changed... \" Update objects \" may be required. " ) ) ;
}
2012-01-30 00:54:23 +00:00
if ( ! camera_ - > isRunning ( ) & & ui_ - > imageView_source - > iplImage ( ) )
{
cv : : Mat image ( ui_ - > imageView_source - > iplImage ( ) , true ) ;
this - > update ( image ) ;
ui_ - > label_timeRefreshRate - > setVisible ( false ) ;
}
2012-01-30 03:16:30 +00:00
2012-02-04 22:15:32 +00:00
ui_ - > actionCamera_from_video_file - > setChecked ( ! Settings : : getCamera_videoFilePath ( ) . isEmpty ( ) ) ;
2012-01-28 01:00:23 +00:00
}