From 4fb42d488925be838118655cf7bb4ee46f5e1540 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Fri, 31 Aug 2012 14:09:25 +0000 Subject: [PATCH] Fixed a warning (int and unsigned int comparison) in Camera.cpp Updated example to switch between LSH and KDTree depending on descriptors type detected. Also use SIFT as it gives better results than SURF. git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@163 620bd6b2-0a58-f614-fd9a-1bd335dccda9 --- example/main.cpp | 75 +++++++++++++++++++++++++--------------------- src/Camera.cpp | 2 +- src/MainWindow.cpp | 2 -- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/example/main.cpp b/example/main.cpp index bdc5f127..7ed950bd 100644 --- a/example/main.cpp +++ b/example/main.cpp @@ -66,10 +66,9 @@ int main(int argc, char * argv[]) // cv::FeatureDetector * detector = new cv::GFTTDetector(); // cv::FeatureDetector * detector = new cv::MSER(); // cv::FeatureDetector * detector = new cv::ORB(); - // cv::FeatureDetector * detector = new cv::SIFT(); + cv::FeatureDetector * detector = new cv::SIFT(); // cv::FeatureDetector * detector = new cv::StarFeatureDetector(); - // cv::FeatureDetector * detector = new cv::SURF(); - cv::FeatureDetector * detector = new cv::SURF(600.0); + // cv::FeatureDetector * detector = new cv::SURF(600.0); detector->detect(objectImg, objectKeypoints); printf("Object: %d keypoints detected in %d ms\n", (int)objectKeypoints.size(), time.restart()); detector->detect(sceneImg, sceneKeypoints); @@ -81,9 +80,8 @@ int main(int argc, char * argv[]) // The extractor can be any of (see OpenCV features2d.hpp): // cv::DescriptorExtractor * extractor = new cv::BriefDescriptorExtractor(); // cv::DescriptorExtractor * extractor = new cv::ORB(); - // cv::DescriptorExtractor * extractor = new cv::SIFT(); - // cv::DescriptorExtractor * extractor = new cv::SURF(); - cv::DescriptorExtractor * extractor = new cv::SURF(600.0); + cv::DescriptorExtractor * extractor = new cv::SIFT(); + // cv::DescriptorExtractor * extractor = new cv::SURF(600.0); extractor->compute(objectImg, objectKeypoints, objectDescriptors); printf("Object: %d descriptors extracted in %d ms\n", objectDescriptors.rows, time.restart()); extractor->compute(sceneImg, sceneKeypoints, sceneDescriptors); @@ -92,46 +90,55 @@ int main(int argc, char * argv[]) //////////////////////////// // NEAREST NEIGHBOR MATCHING USING FLANN LIBRARY (included in OpenCV) //////////////////////////// - // Format descriptors for Flann - cv::Mat objectData; - cv::Mat sceneData; - if(objectDescriptors.type()!=CV_32F) { - objectDescriptors.convertTo(objectData, CV_32F); // make sure it's CV_32F - } - else { - objectData = objectDescriptors; - } - if(sceneDescriptors.type()!=CV_32F) { - sceneDescriptors.convertTo(sceneData, CV_32F); // make sure it's CV_32F - } - else { - sceneData = sceneDescriptors; - } - - // Create Flann index - cv::flann::Index treeFlannIndex(sceneData, cv::flann::KDTreeIndexParams()); - printf("Time creating FLANN index = %d ms\n", time.restart()); - - // search (nearest neighbor) + cv::Mat results; + cv::Mat dists; int k=2; // find the 2 nearest neighbors - cv::Mat results(objectData.rows, k, CV_32SC1); // Results index - cv::Mat dists(objectData.rows, k, CV_32FC1); // Distance results are CV_32FC1 - treeFlannIndex.knnSearch(objectData, results, dists, k, cv::flann::SearchParams() ); // maximum number of leafs checked - printf("Time nearest neighbor search = %d ms\n", time.restart()); + if(objectDescriptors.type()==CV_8U) + { + // Binary descriptors detected (from ORB or Brief) + + // Create Flann LSH index + cv::flann::Index flannIndex(sceneDescriptors, cv::flann::LshIndexParams(20, 10, 2)); + printf("Time creating FLANN index = %d ms\n", time.restart()); + results = cv::Mat(objectDescriptors.rows, k, CV_32SC1); // Results index + dists = cv::Mat(objectDescriptors.rows, k, CV_32FC1); // Distance results are CV_32FC1 ?!?!? NOTE OpenCV doc is not clear about that... + + // search (nearest neighbor) + flannIndex.knnSearch(objectDescriptors, results, dists, k, cv::flann::SearchParams() ); + printf("Time nearest neighbor search = %d ms\n", time.restart()); + } + else + { + // assume it is CV_32F + + // Create Flann KDTree index + cv::flann::Index flannIndex(sceneDescriptors, cv::flann::KDTreeIndexParams()); + printf("Time creating FLANN index = %d ms\n", time.restart()); + results = cv::Mat(objectDescriptors.rows, k, CV_32SC1); // Results index + dists = cv::Mat(objectDescriptors.rows, k, CV_32FC1); // Distance results are CV_32FC1 + + // search (nearest neighbor) + flannIndex.knnSearch(objectDescriptors, results, dists, k, cv::flann::SearchParams() ); + printf("Time nearest neighbor search = %d ms\n", time.restart()); + } + + + + //////////////////////////// // PROCESS NEAREST NEIGHBOR RESULTS //////////////////////////// // Set gui data - objWidget.setData(objectKeypoints, objectDescriptors, objectImg, "SURF", "SURF"); - sceneWidget.setData(sceneKeypoints, sceneDescriptors, sceneImg, "SURF", "SURF"); + objWidget.setData(objectKeypoints, objectDescriptors, objectImg, "", ""); + sceneWidget.setData(sceneKeypoints, sceneDescriptors, sceneImg, "", ""); // Find correspondences by NNDR (Nearest Neighbor Distance Ratio) float nndrRatio = 0.6; std::vector mpts_1, mpts_2; // Used for homography std::vector indexes_1, indexes_2; // Used for homography std::vector outlier_mask; // Used for homography - for(int i=0; i::iterator iter = matches[i].begin(); iter!=matches[i].end(); ++iter) { - printf("iter.key()=%d, iter.value()=%d\n", iter.key(), iter.value()); - printf("objects_[%d].keypoints=%d\n", i, (int)objects_[i]->keypoints().size()); objects_[i]->setKptColor(iter.key(), color); ui_->imageView_source->setKptColor(iter.value(), color); }