From aafe4beac48dd6bb192f4a65af463f485ea88b96 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Thu, 5 Jan 2012 00:31:29 +0000 Subject: [PATCH] Fixed a crash (Windows) after adding an object. This may be related to issue 1. The cause is that the first image acquired from the camera is blank, so no features are extracted and the code not handled this case, crashing during nearest neighbor search. git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@67 620bd6b2-0a58-f614-fd9a-1bd335dccda9 --- src/MainWindow.cpp | 35 ++++++++++++++++++++--------------- src/ObjWidget.cpp | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 2d8b0dde..0f516ef0 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -353,31 +353,38 @@ void MainWindow::update(const cv::Mat & image) delete detector; ui_->label_timeDetection->setText(QString::number(time.restart())); - // EXTRACT DESCRIPTORS cv::Mat descriptors; - cv::DescriptorExtractor * extractor = Settings::createDescriptorsExtractor(); - extractor->compute(img, keypoints, descriptors); - delete extractor; - if((int)keypoints.size() != descriptors.rows) + if(keypoints.size()) { - printf("ERROR : kpt=%d != descriptors=%d\n", (int)keypoints.size(), descriptors.rows); + // 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())); } - if(imageGrayScale) + else { - cvReleaseImage(&imageGrayScale); + printf("WARNING: no features detected !?!\n"); + ui_->label_timeExtraction->setText(QString::number(0)); } - ui_->label_timeExtraction->setText(QString::number(time.restart())); // COMPARE - int alpha = 20*255/100; - if(!dataTree_.empty() && (Settings::getNearestNeighbor_nndrRatioUsed() || Settings::getNearestNeighbor_minDistanceUsed())) + if(!dataTree_.empty() && keypoints.size() && (Settings::getNearestNeighbor_nndrRatioUsed() || Settings::getNearestNeighbor_minDistanceUsed())) { // 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())); - + // DO NEAREST NEIGHBOR int k = 1; if(Settings::getNearestNeighbor_nndrRatioUsed()) @@ -390,7 +397,6 @@ void MainWindow::update(const cv::Mat & image) 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 if(this->isVisible()) { @@ -406,7 +412,6 @@ void MainWindow::update(const cv::Mat & image) for(int i=0; isetKptColor(indexes_1.at(k), QColor(0,0,0,alpha)); + objects_.at(j)->setKptColor(indexes_1.at(k), QColor(0,0,0)); } } } diff --git a/src/ObjWidget.cpp b/src/ObjWidget.cpp index df737740..6404af97 100644 --- a/src/ObjWidget.cpp +++ b/src/ObjWidget.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -201,6 +202,14 @@ void ObjWidget::setAlpha(int alpha) color.setAlpha(alpha_); keypointItems_.at(i)->setColor(color); } + for(int i=0; ipen(); + QColor color = pen.color(); + color.setAlpha(alpha_); + pen.setColor(color); + rectItems_.at(i)->setPen(pen); + } } if(!_graphicsViewMode->isChecked()) { @@ -282,6 +291,11 @@ void ObjWidget::addRect(QGraphicsRectItem * rect) graphicsView_->scene()->addItem(rect); } rect->setZValue(2); + QPen pen = rect->pen(); + QColor color = pen.color(); + color.setAlpha(alpha_); + pen.setColor(color); + rect->setPen(pen); rectItems_.append(rect); }