From: <hug...@li...> - 2012-06-12 17:16:12
|
branch: gui_overhaul details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgroot/hugin/hugin/rev/a731be141712 changeset: 5850:a731be141712 user: tmodes date: Tue Jun 12 19:16:54 2012 +0200 description: Improved overlap calculation for multirow cpfind diffstat: src/hugin_cpfind/cpfind/PanoDetector.cpp | 31 ++++++++++++++++++++++++++----- src/hugin_cpfind/cpfind/PanoDetector.h | 4 +++- 2 files changed, 29 insertions(+), 6 deletions(-) diffs (74 lines): diff -r 632638047d77 -r a731be141712 src/hugin_cpfind/cpfind/PanoDetector.cpp --- a/src/hugin_cpfind/cpfind/PanoDetector.cpp Mon Jun 11 18:11:30 2012 +0200 +++ b/src/hugin_cpfind/cpfind/PanoDetector.cpp Tue Jun 12 19:16:54 2012 +0200 @@ -1057,6 +1057,15 @@ if(images_layer.size()>2) { PT::Panorama optPano=_panoramaInfo->getSubset(images_layer_set); + //reset translation parameters + VariableMapVector varMapVec=optPano.getVariables(); + for(size_t i=0; i<varMapVec.size(); i++) + { + map_get(varMapVec[i], "TrX").setValue(0); + map_get(varMapVec[i], "TrY").setValue(0); + map_get(varMapVec[i], "TrZ").setValue(0); + }; + optPano.updateVariables(varMapVec); //next steps happens only when all images are connected; //now optimize panorama PanoramaOptions opts = _panoramaInfo->getOptions(); @@ -1121,7 +1130,7 @@ }; //now match overlapping images - if(!matchPrealigned(aExecutor, &optPano, checkedImagePairs, images_layer)) + if(!matchPrealigned(aExecutor, &optPano, checkedImagePairs, images_layer, false)) { return false; }; @@ -1137,13 +1146,25 @@ return true; }; -bool PanoDetector::matchPrealigned(PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap) +bool PanoDetector::matchPrealigned(PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap, bool exactOverlap) { - HuginBase::CalculateImageOverlap overlap(pano); + Panorama tempPano=pano->duplicate(); + if(!exactOverlap) + { + // increase hfov by 25 % to handle narrow overlaps (or even no overlap) better + VariableMapVector varMapVec=tempPano.getVariables(); + for(size_t i=0; i<tempPano.getNrOfImages(); i++) + { + Variable hfovVar=map_get(varMapVec[i], "v"); + hfovVar.setValue(std::min(360.0, 1.25 * hfovVar.getValue())); + }; + tempPano.updateVariables(varMapVec); + }; + HuginBase::CalculateImageOverlap overlap(&tempPano); overlap.calculate(10); - for(size_t i=0; i<pano->getNrOfImages()-1; i++) + for(size_t i=0; i<tempPano.getNrOfImages()-1; i++) { - for(size_t j=i+1; j<pano->getNrOfImages(); j++) + for(size_t j=i+1; j<tempPano.getNrOfImages(); j++) { if(set_contains(connectedImages[imgMap[i]],imgMap[j])) { diff -r 632638047d77 -r a731be141712 src/hugin_cpfind/cpfind/PanoDetector.h --- a/src/hugin_cpfind/cpfind/PanoDetector.h Mon Jun 11 18:11:30 2012 +0200 +++ b/src/hugin_cpfind/cpfind/PanoDetector.h Tue Jun 12 19:16:54 2012 +0200 @@ -80,9 +80,11 @@ @param pano pano, which should be used for determing of overlap, can contain also less images than _panoramaInfo @param connectedImages contains a list of already connected or tested image pairs, which should be skipped @param imgMap map of image nr in partial pano and full panorama + @param exactOverlap if true, only really overlapping image pairs are matched, if false it increases the hfov + to take also narrow overlaps better into account @return true, if detection was successful */ - bool matchPrealigned(ZThread::PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap); + bool matchPrealigned(ZThread::PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap, bool exactOverlap=true); // accessors |
From: <hug...@li...> - 2012-06-26 19:51:36
|
branch: details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgroot/hugin/hugin/rev/ab46fcb21182 changeset: 5879:ab46fcb21182 user: tmodes date: Tue Jun 12 19:16:54 2012 +0200 description: Improved overlap calculation for multirow cpfind diffstat: src/hugin_cpfind/cpfind/PanoDetector.cpp | 31 ++++++++++++++++++++++++++----- src/hugin_cpfind/cpfind/PanoDetector.h | 4 +++- 2 files changed, 29 insertions(+), 6 deletions(-) diffs (74 lines): diff -r 034758d1e78e -r ab46fcb21182 src/hugin_cpfind/cpfind/PanoDetector.cpp --- a/src/hugin_cpfind/cpfind/PanoDetector.cpp Mon Jun 11 17:49:52 2012 +0200 +++ b/src/hugin_cpfind/cpfind/PanoDetector.cpp Tue Jun 12 19:16:54 2012 +0200 @@ -1057,6 +1057,15 @@ if(images_layer.size()>2) { PT::Panorama optPano=_panoramaInfo->getSubset(images_layer_set); + //reset translation parameters + VariableMapVector varMapVec=optPano.getVariables(); + for(size_t i=0; i<varMapVec.size(); i++) + { + map_get(varMapVec[i], "TrX").setValue(0); + map_get(varMapVec[i], "TrY").setValue(0); + map_get(varMapVec[i], "TrZ").setValue(0); + }; + optPano.updateVariables(varMapVec); //next steps happens only when all images are connected; //now optimize panorama PanoramaOptions opts = _panoramaInfo->getOptions(); @@ -1121,7 +1130,7 @@ }; //now match overlapping images - if(!matchPrealigned(aExecutor, &optPano, checkedImagePairs, images_layer)) + if(!matchPrealigned(aExecutor, &optPano, checkedImagePairs, images_layer, false)) { return false; }; @@ -1137,13 +1146,25 @@ return true; }; -bool PanoDetector::matchPrealigned(PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap) +bool PanoDetector::matchPrealigned(PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap, bool exactOverlap) { - HuginBase::CalculateImageOverlap overlap(pano); + Panorama tempPano=pano->duplicate(); + if(!exactOverlap) + { + // increase hfov by 25 % to handle narrow overlaps (or even no overlap) better + VariableMapVector varMapVec=tempPano.getVariables(); + for(size_t i=0; i<tempPano.getNrOfImages(); i++) + { + Variable hfovVar=map_get(varMapVec[i], "v"); + hfovVar.setValue(std::min(360.0, 1.25 * hfovVar.getValue())); + }; + tempPano.updateVariables(varMapVec); + }; + HuginBase::CalculateImageOverlap overlap(&tempPano); overlap.calculate(10); - for(size_t i=0; i<pano->getNrOfImages()-1; i++) + for(size_t i=0; i<tempPano.getNrOfImages()-1; i++) { - for(size_t j=i+1; j<pano->getNrOfImages(); j++) + for(size_t j=i+1; j<tempPano.getNrOfImages(); j++) { if(set_contains(connectedImages[imgMap[i]],imgMap[j])) { diff -r 034758d1e78e -r ab46fcb21182 src/hugin_cpfind/cpfind/PanoDetector.h --- a/src/hugin_cpfind/cpfind/PanoDetector.h Mon Jun 11 17:49:52 2012 +0200 +++ b/src/hugin_cpfind/cpfind/PanoDetector.h Tue Jun 12 19:16:54 2012 +0200 @@ -80,9 +80,11 @@ @param pano pano, which should be used for determing of overlap, can contain also less images than _panoramaInfo @param connectedImages contains a list of already connected or tested image pairs, which should be skipped @param imgMap map of image nr in partial pano and full panorama + @param exactOverlap if true, only really overlapping image pairs are matched, if false it increases the hfov + to take also narrow overlaps better into account @return true, if detection was successful */ - bool matchPrealigned(ZThread::PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap); + bool matchPrealigned(ZThread::PoolExecutor& aExecutor, Panorama* pano, std::vector<HuginBase::UIntSet> &connectedImages, std::vector<size_t> imgMap, bool exactOverlap=true); // accessors |