From: Pablo d'A. <da...@us...> - 2006-11-11 21:29:29
|
Update of /cvsroot/hugin/hugin/src/Panorama In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv17708/Panorama Modified Files: Panorama.cpp PanoramaMemento.cpp Log Message: new feature: determine roll from exif data. Rotate image in control point editor according to the roll value. Started implementation of the makefile generation for support of new panotools programs and smartblend (not finished yet). Index: PanoramaMemento.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/PanoramaMemento.cpp,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- PanoramaMemento.cpp 9 Aug 2006 21:01:18 -0000 1.67 +++ PanoramaMemento.cpp 11 Nov 2006 21:29:25 -0000 1.68 @@ -253,11 +253,12 @@ } -bool Lens::initFromFile(const std::string & filename, double &cropFactor) +bool Lens::initFromFile(const std::string & filename, double &cropFactor, double & roll) { std::string ext = utils::getExtension(filename); std::transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int)) toupper); + roll = 0; int width; int height; try { @@ -296,6 +297,20 @@ FDiff2D sensorSize; double focalLength = 0; + switch (exif.Orientation) { + case 3: // rotate 180 + roll = 180; + break; + case 6: // rotate 90 + roll = 90; + break; + case 8: // rotate 270 + roll = 270; + break; + default: + break; + } + if (exif.FocalLength > 0 && exif.CCDHeight > 0 && exif.CCDWidth > 0) { // read sensor size directly. sensorSize.x = exif.CCDWidth; @@ -1076,21 +1091,21 @@ case 0: options.blendMode = PanoramaOptions::NO_BLEND; break; - case 1: - options.blendMode = PanoramaOptions::WEIGHTED_BLEND; - break; + case 1: + options.blendMode = PanoramaOptions::PTBLENDER_BLEND; + break; case 2: - options.blendMode = PanoramaOptions::SPLINE_BLEND; + options.blendMode = PanoramaOptions::ENBLEND_BLEND; break; case 3: - options.blendMode = PanoramaOptions::CHESSBOARD_BLEND; + options.blendMode = PanoramaOptions::SMARTBLEND_BLEND; break; default: - options.blendMode = PanoramaOptions::WEIGHTED_BLEND; + options.blendMode = PanoramaOptions::ENBLEND_BLEND; break; } } else { - options.blendMode = PanoramaOptions::WEIGHTED_BLEND; + options.blendMode = PanoramaOptions::ENBLEND_BLEND; } } break; Index: Panorama.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/Panorama.cpp,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- Panorama.cpp 19 Jul 2006 21:43:18 -0000 1.106 +++ Panorama.cpp 11 Nov 2006 21:29:25 -0000 1.107 @@ -33,6 +33,7 @@ #include <iterator> #include <algorithm> #include <locale.h> +#include <iomanip> #include <stdio.h> #include <math.h> @@ -527,7 +528,7 @@ } - size_t lastidx = borders.size() -1; + int lastidx = borders.size() -1; if (lastidx == -1) { // empty pano return; @@ -539,7 +540,7 @@ // |11 2222| -> | 222211 | std::vector<int> newBorders; newBorders.push_back(borders[lastidx]); - for (size_t i = 0; i < lastidx; i++) { + for (int i = 0; i < lastidx; i++) { newBorders.push_back(borders[i]+360); } borders = newBorders; @@ -876,6 +877,7 @@ } } + void Panorama::printPanoramaScript(ostream & o, const OptimizeVector & optvars, const PanoramaOptions & output, @@ -990,7 +992,7 @@ o << " Vf\"" << iopts.m_flatfield << "\""; } } - + o << " u" << output.featherWidth << (img.getOptions().morph ? " o" : ""); string fname = img.getFilename(); @@ -1075,15 +1077,15 @@ case PanoramaOptions::NO_BLEND: o << " e0"; break; - case PanoramaOptions::WEIGHTED_BLEND: + case PanoramaOptions::PTBLENDER_BLEND: o << " e1"; break; - case PanoramaOptions::SPLINE_BLEND: + case PanoramaOptions::ENBLEND_BLEND: o << " e2"; - break; - case PanoramaOptions::CHESSBOARD_BLEND: + break; + case PanoramaOptions::SMARTBLEND_BLEND: o << " e3"; - break; + break; } o << std::endl; @@ -1556,7 +1558,8 @@ map_get(lens.variables,"v").setValue(HFOV); double cropFactor = 0; - lens.initFromFile(filename, cropFactor); + double roll=0; + lens.initFromFile(filename, cropFactor, roll); int matchingLensNr=-1; for (unsigned int lnr=0; lnr < getNrOfLenses(); lnr++) { @@ -1579,6 +1582,7 @@ VariableMap vars; fillVariableMap(vars); + map_get(vars,"r").setValue(roll); DEBUG_ASSERT(matchingLensNr >= 0); PanoImage pimg(filename, img.width(), img.height(), (unsigned int) matchingLensNr); @@ -1848,10 +1852,10 @@ FDiff2D imgp2; transf.transform(imgp1, FDiff2D(0,0)); - transf.transform(imgp2, FDiff2D(2,2)); + transf.transform(imgp2, FDiff2D(1,1)); double dist = utils::norm(imgp2-imgp1); - return dist / sqrt(8.0); + return dist / sqrt(2); /* // calculate average pixel density of each image @@ -1876,3 +1880,146 @@ */ } +void PT::createMakefile(const Panorama & pano, + const std::string & ptofile, + const std::string & outputPrefix, + const PT::PanoramaOptions & opts, + const PT::UIntSet & imgs, + const PTPrograms & progs, + std::ostream & o) + +{ +#ifdef __unix__ + // set numeric locale to C, for correct number output + char * t = setlocale(LC_NUMERIC,NULL); + char * old_locale = (char*) malloc(strlen(t)+1); + strcpy(old_locale, t); + setlocale(LC_NUMERIC,"C"); +#endif + o << "# makefile for panorama stitching, created by hugin " << endl + << endl; + + // this function supports only multiple tiff output. + // for example using nona or PTRemap (or whatever it will be called) + + // set a suitable target file. + std::string output = quoteString(outputPrefix); + std::string final_output = output + ".tif"; + + bool externalBlender = false; + bool remapToMultiple = false; + + if (opts.blendMode == PT::PanoramaOptions::NO_BLEND) { + // just remapping or simple blending + if (opts.outputFormat == PT::PanoramaOptions::TIFF_m) { + remapToMultiple = true; + } + } else { + externalBlender = true; + remapToMultiple = true; + } + + o << "# the output panorama" << endl + << "TARGET=" << final_output << endl + << "PROJECT_FILE=" << quoteString(ptofile) << endl + << endl + << "# Input images" << endl + << "INPUT_IMAGES="; + for (unsigned int i=0; i < imgs.size(); i++) { + o << quoteString(pano.getImage(i).getFilename()) << " "; + } + o << endl + << "# remapped images" << endl + << "REMAPPED_IMAGES="; + for (unsigned int i=0; i < imgs.size(); i++) { + std::ostringstream fns; + fns << output << std::setfill('0') << std::setw(4) << i << ".tif"; + o << fns.str() << " "; + } + + // include makefile stub. + o << endl + << "# Tool configuration" << endl + << "NONA=" << quoteString(progs.nona) << endl + << "PTSTITCHER=" << quoteString(progs.PTStitcher) << endl + << "PTREMAP=" << quoteString(progs.PTremap) << endl + << "PTBLENDER=" << quoteString(progs.PTblender) << endl + << "PTROLLER=" << quoteString(progs.PTroller) << endl + << "ENBLEND=" << quoteString(progs.enblend) << endl + << "SMARTBLEND=" << quoteString(progs.smartblend) << endl + << endl + << "# options for the programs" << endl + << endl; + + string remapper; + switch(opts.remapper) { + case PanoramaOptions::NONA: + remapper = "nona"; + break; + case PanoramaOptions::PTSTITCHER: + remapper = "ptstitcher"; + break; + case PanoramaOptions::PTREMAP: + remapper = "ptremap"; + break; + } + + string blender; + switch(opts.blendMode) { + case PanoramaOptions::NO_BLEND: + blender="multilayer"; + break; + case PanoramaOptions::PTBLENDER_BLEND: + blender="ptblender"; + // TODO: add options here! + o << "PTBLENDER_OPTS="; + switch (opts.colorCorrection) { + case PanoramaOptions::NONE: + blender = "ptroller"; + break; + case PanoramaOptions::BRIGHTNESS_COLOR: + o << " -k " << opts.colorReferenceImage; + break; + case PanoramaOptions::BRIGHTNESS: + o << " -k " << opts.colorReferenceImage; + break; + case PanoramaOptions::COLOR: + o << " -k " << opts.colorReferenceImage; + break; + } + o << endl; + break; + case PanoramaOptions::ENBLEND_BLEND: + blender = "enblend"; + o << "ENBLEND_OPTS="; + if (opts.getHFOV() == 360.0) { + // blend over the border + o << " -w"; + } + if (opts.tiffCompression == "LZW") { + o << " -z"; + } + o << " -f" << opts.getWidth() << "x" << opts.getHeight() << endl; + break; + case PanoramaOptions::SMARTBLEND_BLEND: + blender = "smartblend"; + o << "SMARTBLEND_OPTS="; + if (opts.getHFOV() == 360.0) { + // blend over the border + o << " -w"; + } + break; + } + + std::string includefile = "template_" + remapper + "_" + blender; + o << "# including template " << includefile + << endl; + +#ifdef __unix__ + // reset locale + setlocale(LC_NUMERIC,old_locale); + free(old_locale); +#endif + +} + |