diff --git a/src/AddObjectDialog.cpp b/src/AddObjectDialog.cpp index ec3e4146..9d12fe84 100644 --- a/src/AddObjectDialog.cpp +++ b/src/AddObjectDialog.cpp @@ -27,6 +27,10 @@ AddObjectDialog::AddObjectDialog(Camera * camera, const cv::Mat & image, bool mi ui_ = new Ui_addObjectDialog(); ui_->setupUi(this); + detector_ = Settings::createFeaturesDetector(); + extractor_ = Settings::createDescriptorsExtractor(); + Q_ASSERT(detector_ != 0 && extractor_ != 0); + connect(ui_->pushButton_cancel, SIGNAL(clicked()), this, SLOT(cancel())); connect(ui_->pushButton_back, SIGNAL(clicked()), this, SLOT(back())); connect(ui_->pushButton_next, SIGNAL(clicked()), this, SLOT(next())); @@ -50,6 +54,8 @@ AddObjectDialog::AddObjectDialog(Camera * camera, const cv::Mat & image, bool mi AddObjectDialog::~AddObjectDialog() { + delete detector_; + delete extractor_; if(object_) { delete object_; @@ -272,9 +278,7 @@ void AddObjectDialog::setState(int state) { // Extract keypoints selectedKeypoints.clear(); - cv::FeatureDetector * detector = Settings::createFeaturesDetector(); - detector->detect(imgRoi, selectedKeypoints); - delete detector; + detector_->detect(imgRoi, selectedKeypoints); } ui_->objectView->setData(selectedKeypoints, cv::Mat(), imgRoi, Settings::currentDetectorType(), ""); ui_->objectView->setMinimumSize(roi.width, roi.height); @@ -298,9 +302,7 @@ void AddObjectDialog::setState(int state) if(keypoints.size()) { // Extract descriptors - cv::DescriptorExtractor * extractor = Settings::createDescriptorsExtractor(); - extractor->compute(ui_->objectView->cvImage(), keypoints, descriptors); - delete extractor; + extractor_->compute(ui_->objectView->cvImage(), keypoints, descriptors); if(keypoints.size() != (unsigned int)descriptors.rows) { @@ -336,10 +338,8 @@ void AddObjectDialog::update(const cv::Mat & image) } // Extract keypoints - cv::FeatureDetector * detector = Settings::createFeaturesDetector(); cv::vector keypoints; - detector->detect(cvImage_, keypoints); - delete detector; + detector_->detect(cvImage_, keypoints); ui_->cameraView->setData(keypoints, cv::Mat(), cvImage_, Settings::currentDetectorType(), ""); ui_->cameraView->update(); diff --git a/src/AddObjectDialog.h b/src/AddObjectDialog.h index 6b7353c8..8b05d0bb 100644 --- a/src/AddObjectDialog.h +++ b/src/AddObjectDialog.h @@ -47,6 +47,8 @@ private: Camera * camera_; ObjWidget * object_; cv::Mat cvImage_; + cv::FeatureDetector * detector_; + cv::DescriptorExtractor * extractor_; enum State{kTakePicture, kSelectFeatures, kVerifySelection, kClosing}; int state_; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 5ac0ef5b..7eeba96a 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -51,7 +51,9 @@ MainWindow::MainWindow(Camera * camera, const QString & settings, QWidget * pare inliersCurve_(0), lowestRefreshRate_(99), objectsModified_(false), - tcpServer_(0) + tcpServer_(0), + detector_(0), + extractor_(0) { ui_ = new Ui_mainWindow(); ui_->setupUi(this); @@ -113,6 +115,10 @@ MainWindow::MainWindow(Camera * camera, const QString & settings, QWidget * pare ui_->toolBox->getParameterWidget(Settings::kFeature2D_SURF_gpu())->setEnabled(false); } + detector_ = Settings::createFeaturesDetector(); + extractor_ = Settings::createDescriptorsExtractor(); + Q_ASSERT(detector_ != 0 && extractor_ != 0); + connect((QDoubleSpinBox*)ui_->toolBox->getParameterWidget(Settings::kCamera_4imageRate()), SIGNAL(editingFinished()), camera_, @@ -202,6 +208,8 @@ MainWindow::~MainWindow() { disconnect(camera_, SIGNAL(imageReceived(const cv::Mat &)), this, SLOT(update(const cv::Mat &))); camera_->stop(); + delete detector_; + delete extractor_; objectsDescriptors_.clear(); qDeleteAll(objects_.begin(), objects_.end()); objects_.clear(); @@ -1302,9 +1310,6 @@ void MainWindow::update(const cv::Mat & image) if(!image.empty()) { - QTime time; - time.start(); - //Convert to grayscale cv::Mat grayscaleImg; if(image.channels() != 1 || image.depth() != CV_8U) @@ -1316,11 +1321,12 @@ void MainWindow::update(const cv::Mat & image) grayscaleImg = image; } + QTime time; + time.start(); + // EXTRACT KEYPOINTS - cv::FeatureDetector * detector = Settings::createFeaturesDetector(); std::vector keypoints; - detector->detect(grayscaleImg, keypoints); - delete detector; + detector_->detect(grayscaleImg, keypoints); ui_->label_timeDetection->setNum(time.restart()); cv::Mat descriptors; @@ -1335,9 +1341,7 @@ void MainWindow::update(const cv::Mat & image) } // EXTRACT DESCRIPTORS - cv::DescriptorExtractor * extractor = Settings::createDescriptorsExtractor(); - extractor->compute(grayscaleImg, keypoints, descriptors); - delete extractor; + extractor_->compute(grayscaleImg, keypoints, descriptors); if((int)keypoints.size() != descriptors.rows) { printf("ERROR : kpt=%d != descriptors=%d\n", (int)keypoints.size(), descriptors.rows); @@ -1658,6 +1662,7 @@ void MainWindow::update(const cv::Mat & image) } } } + ui_->label_timeHomographies->setNum(time.restart()); } else { @@ -1769,7 +1774,6 @@ void MainWindow::update(const cv::Mat & image) ui_->label_nfeatures->setNum((int)keypoints.size()); ui_->imageView_source->update(); - ui_->label_timeGui->setNum(time.restart()); } ui_->label_detectorDescriptorType->setText(QString("%1/%2").arg(Settings::currentDetectorType()).arg(Settings::currentDescriptorType())); @@ -1836,6 +1840,16 @@ void MainWindow::notifyParametersChanged(const QStringList & paramChanged) } } + if(detectorDescriptorParamsChanged) + { + //Re-init detector and extractor + delete detector_; + delete extractor_; + detector_ = Settings::createFeaturesDetector(); + extractor_ = Settings::createDescriptorsExtractor(); + Q_ASSERT(detector_ != 0 && extractor_ != 0); + } + if(Settings::getGeneral_autoUpdateObjects()) { if(detectorDescriptorParamsChanged) diff --git a/src/MainWindow.h b/src/MainWindow.h index d724cfb2..3205a7d3 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -105,6 +105,8 @@ private: QMap imagesMap_; TcpServer * tcpServer_; QMap lastObjectsUpdateParameters_; // ParametersMap + cv::FeatureDetector * detector_; + cv::DescriptorExtractor * extractor_; }; #endif /* MainWindow_H_ */ diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 01f1c78f..2d51cdbf 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -7,7 +7,7 @@ 0 0 826 - 488 + 506 @@ -200,7 +200,7 @@ 0 0 826 - 22 + 25 @@ -255,7 +255,7 @@ 360 - 100 + 156 @@ -285,8 +285,8 @@ 0 0 - 348 - 76 + 360 + 73 @@ -343,8 +343,8 @@ 0 0 - 199 - 361 + 198 + 376 @@ -448,6 +448,20 @@ 0 + + + + ms + + + + + + + ms + + + @@ -469,20 +483,6 @@ - - - - ms - - - - - - - ms - - - @@ -525,13 +525,6 @@ - - - - 000 - - - @@ -658,6 +651,13 @@ + + + + 000 + + +