From: <hug...@li...> - 2010-06-20 18:43:32
|
details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/c049185ba09f changeset: 4084:c049185ba09f user: Antoine date: Sun Jun 20 13:38:32 2010 +0200 description: BUG FIX: Images duplicated while using --loadproject. details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/037cddfa380a changeset: 4085:037cddfa380a user: Antoine date: Sun Jun 20 14:43:51 2010 +0200 description: BUG FIX: Key point matching was not processed with --loadproject details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/9e6e35f29960 changeset: 4086:9e6e35f29960 user: Antoine date: Sun Jun 20 17:21:09 2010 +0200 description: BUG FIX: loadkeys trace info correctly numbered details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/e22b7586b33a changeset: 4087:e22b7586b33a user: Antoine date: Sun Jun 20 17:30:51 2010 +0200 description: Apply Thomas' patch removing unnessary includes and fixing compilation on windows diffstat: src/libpanomatic/panomatic/PanoDetector.cpp | 111 +++++++--------------- src/libpanomatic/panomatic/PanoDetector.h | 18 +-- src/libpanomatic/panomatic/PanoDetectorLogic.cpp | 40 ++----- src/libpanomatic/panomatic/Utils.h | 2 +- src/libpanomatic/panomatic/main.cpp | 12 +- 5 files changed, 64 insertions(+), 119 deletions(-) diffs (402 lines): diff -r 55a41715f2b4 -r e22b7586b33a src/libpanomatic/panomatic/PanoDetector.cpp --- a/src/libpanomatic/panomatic/PanoDetector.cpp Thu Jun 17 21:02:08 2010 +0200 +++ b/src/libpanomatic/panomatic/PanoDetector.cpp Sun Jun 20 17:30:51 2010 +0200 @@ -1,6 +1,3 @@ -#include <hugin_config.h> -#include <hugin_version.h> - #include "PanoDetector.h" #include <iostream> #include <fstream> @@ -11,11 +8,7 @@ #include "zthread/Runnable.h" #include "zthread/PoolExecutor.h" #include "Utils.h" -#include "Tracer.h" - - -#include <hugin_basic.h> -#include <hugin_utils/platform.h> +#include "Tracer.h" #ifndef srandom #define srandom srand @@ -39,7 +32,6 @@ } - bool PanoDetector::checkData() { // test linear match data @@ -53,7 +45,7 @@ // check the test mode if (_test) { - if (_files.size() != 2) + if (_filesData.size() != 2) { std::cout << "In test mode you must provide exactly 2 images." << std::endl; return false; @@ -63,7 +55,6 @@ return true; } - void PanoDetector::printDetails() { //cout << "\tNumber of keys : " << _numKeys << endl; @@ -105,8 +96,10 @@ if(!_loadProject && !_loadKeypoints) { cout << "Input Images :" << endl; - BOOST_FOREACH(string& aF, _files) - cout << " - " << aF << endl; + for (unsigned int i = 0; i < _filesData.size(); ++i) + { + cout << " - " << _filesData[i]._name << endl; + } } if (_loadProject) cout << "Input Project File : " << _inputProjectFile << endl; @@ -132,28 +125,6 @@ private: const PanoDetector& _panoDetector; PanoDetector::ImgData& _imgData; -}; - -// definition of a runnable class for loadproject -class LoadProjectDataRunnable : public Runnable -{ -public: - LoadProjectDataRunnable(PanoDetector::ImgData& iImageData, const PanoDetector& iPanoDetector) : - _imgData(iImageData), _panoDetector(iPanoDetector) {}; - - void run() - { - if (!PanoDetector::AnalyzeImage(_imgData, _panoDetector)) return; - // TODO: implement another function making use of SrcPanoImage methods - PanoDetector::FindKeyPointsInImage(_imgData, _panoDetector); - PanoDetector::FilterKeyPointsInImage(_imgData, _panoDetector); - PanoDetector::MakeKeyPointDescriptorsInImage(_imgData, _panoDetector); - PanoDetector::BuildKDTreesInImage(_imgData, _panoDetector); - PanoDetector::FreeMemoryInImage(_imgData, _panoDetector); - } -private: - const PanoDetector& _panoDetector; - PanoDetector::ImgData& _imgData; }; // definition of a runnable class for loadkeys @@ -204,21 +175,17 @@ if(_loadProject) { if(!loadProject()) return; - } else { - prepareImages(); } // 2. run analysis of images TRACE_INFO(endl<< "--- Analyze Images ---" << endl); try - { - for (ImgDataIt_t aB = _filesData.begin(); aB != _filesData.end(); ++aB) + { + for (unsigned int i = 0; i < _filesData.size(); ++i) if (_loadKeypoints) { - aExecutor.execute(new LoadKeypointsDataRunnable(aB->second, *this)); - } else if (_loadProject) { - aExecutor.execute(new LoadProjectDataRunnable(aB->second, *this)); + aExecutor.execute(new LoadKeypointsDataRunnable(_filesData[i], *this)); } else { - aExecutor.execute(new ImgDataRunnable(aB->second, *this)); + aExecutor.execute(new ImgDataRunnable(_filesData[i], *this)); } aExecutor.wait(); } @@ -244,7 +211,6 @@ { BOOST_FOREACH(MatchData& aMD, _matchesData) aExecutor.execute(new MatchDataRunnable(aMD, *this)); - aExecutor.wait(); } catch(Synchronization_Exception& e) @@ -258,20 +224,19 @@ writeOutput(); } + +void PanoDetector::addFileData(int nr, const std::string& iFile) +{ + // insert the image in the vector + _filesData.push_back(ImgData()); + // get the data + ImgData& aImgData = _filesData.back(); -void PanoDetector::prepareImages() -{ - for (unsigned int aFileN = 0; aFileN < _files.size(); ++aFileN) - { - // insert the image in the map - _filesData.insert(make_pair(_files[aFileN], ImgData())); - - // get the data - ImgData& aImgData = _filesData[_files[aFileN]]; - - // set the name - aImgData._name = _files[aFileN]; - } + // set the name + aImgData._name = iFile; + + // set the number + aImgData._number = nr; } bool PanoDetector::loadProject() @@ -295,11 +260,11 @@ // get image info SrcPanoImage img_info = _panoramaInfo->getImage(imgNr); - // insert the image in the map - _filesData.insert(make_pair(img_info.getFilename(), ImgData())); + // insert the image in the vector + _filesData.push_back(ImgData()); // get the data - ImgData& aImgData = _filesData[img_info.getFilename()]; + ImgData& aImgData = _filesData.back(); // set the name aImgData._name = img_info.getFilename(); @@ -313,9 +278,9 @@ bool PanoDetector::checkLoadSuccess() { - for (unsigned int aFileN = 0; aFileN < _files.size(); ++aFileN) + for (unsigned int aFileN = 0; aFileN < _filesData.size(); ++aFileN) { - ImgData& aID = _filesData[_files[aFileN]]; + ImgData& aID = _filesData[aFileN]; if (aID._loadFail) return false; } @@ -325,29 +290,27 @@ void PanoDetector::prepareMatches() { - int aLen = _files.size(); + int aLen = _filesData.size(); if (_linearMatch) aLen = _linearMatchLen; - if (aLen >= _files.size()) - aLen = _files.size() - 1; - - for (unsigned int i1 = 0; i1 < _files.size(); ++i1) + if (aLen >= _filesData.size()) + aLen = _filesData.size() - 1; + + for (unsigned int i1 = 0; i1 < _filesData.size(); ++i1) { int aEnd = i1 + 1 + aLen; - if (_files.size() < aEnd) - aEnd = _files.size(); + if (_filesData.size() < aEnd) + aEnd = _filesData.size(); for (unsigned int i2 = (i1+1); i2 < aEnd; ++i2) - { + { // create a new entry in the matches map _matchesData.push_back(MatchData()); MatchData& aM = _matchesData.back(); - aM._i1_name = _files[i1]; - aM._i2_name = _files[i2]; - aM._i1 = &(_filesData[aM._i1_name]); - aM._i2 = &(_filesData[aM._i2_name]); + aM._i1 = &(_filesData[i1]); + aM._i2 = &(_filesData[i2]); } } } diff -r 55a41715f2b4 -r e22b7586b33a src/libpanomatic/panomatic/PanoDetector.h --- a/src/libpanomatic/panomatic/PanoDetector.h Thu Jun 17 21:02:08 2010 +0200 +++ b/src/libpanomatic/panomatic/PanoDetector.h Sun Jun 20 17:30:51 2010 +0200 @@ -36,9 +36,7 @@ #include <localfeatures/KeyPoint.h> #include <localfeatures/KeyPointDetector.h> -#include <hugin_basic.h> -#include <hugin_utils/platform.h> -#include <algorithms/panorama_makefile/PanoramaMakefileExport.h> +#include <panodata/Panorama.h> using namespace HuginBase; @@ -105,15 +103,14 @@ inline bool getDownscale() const { return _downscale; } inline void setDownscale(bool iDown) { _downscale = iDown; } - - inline void addFile(const std::string& iFile) { _files.push_back(iFile); } - // inline void setNumberOfKeys(int iNumKeys) { _numKeys = iNumKeys; } inline void setOutputFile(const std::string& iOutputFile) { _outputFile = iOutputFile; } inline void setInputProjectFile(const std::string& iInputProjectFile) { _inputProjectFile = iInputProjectFile; } inline void setTest(bool iTest) { _test = iTest; } inline bool getTest() const { return _test; } inline void setCores(int iCores) { _cores = iCores; } + + void addFileData(int nr, const std::string& iFile); // predeclaration struct ImgData; @@ -149,7 +146,6 @@ bool _downscale; // list of files - FileNameList_t _files; std::string _outputFile; std::string _inputProjectFile; @@ -188,14 +184,12 @@ KDElemKeyPointVect_t _kdv; KPKDTreePtr _kd; }; - - typedef std::map<std::string, ImgData> ImgData_t; - typedef std::map<std::string, ImgData>::iterator ImgDataIt_t; + + typedef std::vector<ImgData> ImgData_t; + typedef std::vector<ImgData>::iterator ImgDataIt_t; struct MatchData { - std::string _i1_name; - std::string _i2_name; ImgData* _i1; ImgData* _i2; lfeat::PointMatchVector_t _matches; diff -r 55a41715f2b4 -r e22b7586b33a src/libpanomatic/panomatic/PanoDetectorLogic.cpp --- a/src/libpanomatic/panomatic/PanoDetectorLogic.cpp Thu Jun 17 21:02:08 2010 +0200 +++ b/src/libpanomatic/panomatic/PanoDetectorLogic.cpp Sun Jun 20 17:30:51 2010 +0200 @@ -99,19 +99,11 @@ ioImgInfo._detectHeight = info.height; ioImgInfo._descLength = info.dimensions; - // TODO _realImageName, _origWidth and _origHeight should eventually be removed from ImgData - ioImgInfo._realImageName = info.filename; - ioImgInfo._origWidth = info.width; - ioImgInfo._origHeight = info.height; - // Create image info - SrcPanoImage img_info = SrcPanoImage(info.filename); - img_info.setSize(vigra::Size2D(info.width, info.height)); - + SrcPanoImage img_info = SrcPanoImage(info.filename); //add image info to panorama Info - TRACE_IMG("kikoo..."); ioImgInfo._number = iPanoDetector.getPanoramaInfo()->addImage(img_info); - TRACE_IMG("Lol..."); + return true; } @@ -120,13 +112,17 @@ TRACE_IMG("Analyze image..."); try { - ioImgInfo._loadFail = false; - vigra::ImageImportInfo aImageInfo(ioImgInfo._name.c_str()); - ioImgInfo._realImageName = ioImgInfo._name; - //TODO: _realImageName should eventually be removed from ImgData + ioImgInfo._loadFail = false; + + //get image basic info + vigra::ImageImportInfo aImageInfo(ioImgInfo._name.c_str()); - // Create image info - SrcPanoImage img_info = SrcPanoImage(ioImgInfo._name); + if(!iPanoDetector.getLoadProject()) + { + //if no project was loaded, get image additional info + SrcPanoImage img_info = SrcPanoImage(ioImgInfo._name); + ioImgInfo._number = iPanoDetector.getPanoramaInfo()->addImage(img_info); + } int aNewImgWidth = aImageInfo.width(); int aNewImgHeight = aImageInfo.height(); @@ -207,17 +203,9 @@ } } - // store info - img_info.setSize(vigra::Size2D(aImageInfo.width(),aImageInfo.height())); + // store info ioImgInfo._detectWidth = aNewImgWidth; ioImgInfo._detectHeight = aNewImgHeight; - - //add image info to panorama info - ioImgInfo._number = iPanoDetector.getPanoramaInfo()->addImage(img_info); - - // TODO: _origWidth and _origHeight should eventually be removed from ImgData - ioImgInfo._origWidth = aImageInfo.width(); - ioImgInfo._origHeight = aImageInfo.height(); TRACE_IMG("Build integral image..."); // create integral image @@ -421,7 +409,7 @@ TRACE_PAIR("Removed " << aRemovedMatches.size() << " matches. " << ioMatchData._matches.size() << " remaining."); if (iPanoDetector.getTest()) - TestCode::drawRansacMatches(ioMatchData._i1_name, ioMatchData._i2_name, ioMatchData._matches, + TestCode::drawRansacMatches(ioMatchData._i1->_name, ioMatchData._i2->_name, ioMatchData._matches, aRemovedMatches, aRansacFilter, iPanoDetector.getDownscale()); return true; diff -r 55a41715f2b4 -r e22b7586b33a src/libpanomatic/panomatic/Utils.h --- a/src/libpanomatic/panomatic/Utils.h Thu Jun 17 21:02:08 2010 +0200 +++ b/src/libpanomatic/panomatic/Utils.h Sun Jun 20 17:30:51 2010 +0200 @@ -22,7 +22,7 @@ #define __utils_h #ifdef WIN32 -#include <windows.h> +#include <vigra/windows.h> #include <process.h> #else //#include <pthread.h> diff -r 55a41715f2b4 -r e22b7586b33a src/libpanomatic/panomatic/main.cpp --- a/src/libpanomatic/panomatic/main.cpp Thu Jun 17 21:02:08 2010 +0200 +++ b/src/libpanomatic/panomatic/main.cpp Sun Jun 20 17:30:51 2010 +0200 @@ -190,21 +190,21 @@ vector<string> aFiles = aArgFiles.getValue(); if ( !ioPanoDetector.getLoadProject() ) { - BOOST_FOREACH(string& aF, aFiles) + for (unsigned int i = 0; i < aFiles.size(); ++i) { if (aArgPTGuiCompat.getValue()) { - if (aF.find("/path:") == 0) - ioPanoDetector.setOutputFile(aF.substr(6, aF.size() - 6) + "\\panorama0.oto"); + if (aFiles[i].find("/path:") == 0) + ioPanoDetector.setOutputFile(aFiles[i].substr(6, aFiles[i].size() - 6) + "\\panorama0.oto"); - if (aF.find("/") == 0) + if (aFiles[i].find("/") == 0) continue; } - ioPanoDetector.addFile(aF); + ioPanoDetector.addFileData(i,aFiles[i]); } } else { if (aFiles.size()>1) - cout << "WARNING: Only the first project file was loaded, others are ignored!" << endl << endl; + cout << "WARNING: Only one project file was loaded, others were ignored." << endl << endl; ioPanoDetector.setInputProjectFile(aFiles[0]); } |