From: Pablo d'A. <da...@us...> - 2006-01-06 16:02:45
|
Update of /cvsroot/hugin/hugin/src/Panorama In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30926/src/Panorama Modified Files: Makefile.am PTOptimise.cpp PanoToolsInterface.cpp Panorama.cpp PanoramaMemento.cpp Stitcher.cpp Log Message: added vignetting and brightness correction functions Index: Panorama.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/Panorama.cpp,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- Panorama.cpp 15 Dec 2005 16:05:23 -0000 1.93 +++ Panorama.cpp 6 Jan 2006 16:02:36 -0000 1.94 @@ -112,7 +112,7 @@ << " in line: " << line); return false; } - p += 2; + p += parameter.length() + 1; std::string::size_type p2 = line.find(' ',p); output = line.substr(p, p2-p); // DEBUG_DEBUG("string idex: " << p <<"," << p2 << " string: \"" << output << "\""); @@ -127,7 +127,7 @@ << " in line: " << line); return false; } - p += 3; + p += parameter.length() + 2; std::string::size_type e = line.find("\"",p); DEBUG_DEBUG("p:" << p << " e:" << e); output = line.substr(p,e-p); @@ -143,7 +143,7 @@ << " in line: " << line); return false; } - p += 3; + p += parameter.length() + 2; std::string::size_type e = line.find(" ",p); DEBUG_DEBUG("p:" << p << " e:" << e); output = line.substr(p,e-p); @@ -351,7 +351,7 @@ // remap into minature pano. PanoramaOptions opts; opts.setHFOV(360); - opts.projectionFormat = PanoramaOptions::EQUIRECTANGULAR; + opts.setProjection(PanoramaOptions::EQUIRECTANGULAR); opts.setWidth(360); opts.setHeight(180); @@ -416,7 +416,7 @@ // remap into minature pano. PanoramaOptions opts; opts.setHFOV(360); - opts.projectionFormat = PanoramaOptions::EQUIRECTANGULAR; + opts.setProjection(PanoramaOptions::EQUIRECTANGULAR); opts.setWidth(360); opts.setHeight(180); @@ -761,7 +761,7 @@ void Panorama::printOptimizerScript(ostream & o, const OptimizeVector & optvars, const PanoramaOptions & output, - const UIntSet & imgs, + const UIntSet & imgs, const std::string & stripPrefix) { #ifdef __unix__ @@ -824,12 +824,21 @@ } } - if (img.getOptions().docrop) { + ImageOptions iopts = img.getOptions(); + if (iopts.docrop) { // print crop parameters - vigra::Rect2D c = img.getOptions().cropRect; + vigra::Rect2D c = iopts.cropRect; o << " S" << c.left() << "," << c.right() << "," << c.top() << "," << c.bottom(); } + if (iopts.m_vigCorrMode != ImageOptions::VIGCORR_NONE) { + o << " Vm" << iopts.m_vigCorrMode; + } + + if (iopts.m_flatfield.size() > 0) { + o << " Vf\"" << iopts.m_flatfield << "\""; + } + // o << " u" << (*it).getOptions().featherWidth o << " u" << output.featherWidth << (img.getOptions().morph ? " o" : ""); Index: PanoToolsInterface.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/PanoToolsInterface.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- PanoToolsInterface.cpp 15 Dec 2005 16:05:24 -0000 1.20 +++ PanoToolsInterface.cpp 6 Jan 2006 16:02:36 -0000 1.21 @@ -265,7 +265,7 @@ pano.getImageVariables(imgNr), pano.getLens(img.getLensNr()).getProjection(), Diff2D(dest.getWidth(), dest.getHeight()), - dest.projectionFormat, dest.getHFOV(), + dest.getProjection(), dest.getHFOV(), Diff2D(img.getWidth(), img.getHeight())); } @@ -311,7 +311,7 @@ pano.getImageVariables(imgNr), pano.getLens(img.getLensNr()).getProjection(), Diff2D(dest.getWidth(), dest.getHeight()), - dest.projectionFormat, dest.getHFOV(), + dest.getProjection(), dest.getHFOV(), Diff2D(img.getWidth(), img.getHeight())); } @@ -573,7 +573,7 @@ if (trf.dest->data) { myfree((void**)trf.dest->data); } - setDestImage(*(trf.dest), vigra::Diff2D(width, height), imageData, opts.projectionFormat, opts.getHFOV()); + setDestImage(*(trf.dest), vigra::Diff2D(width, height), imageData, opts.getProjection(), opts.getHFOV()); ap.pano = *(trf.dest); } @@ -648,7 +648,7 @@ gl.cim = NULL; // Determine number of images and control points - gl.numIm = imgs.size(); + gl.numIm = int(imgs.size()); gl.nt = 0; @@ -657,7 +657,7 @@ gl.numParam = 0; for (UIntVector::const_iterator iit = imgs.begin(); iit != imgs.end(); ++iit) { imgMap[*iit] = imgCnt; - gl.numParam += optvec[imgCnt].size(); + gl.numParam += int(optvec[imgCnt].size()); imgCnt++; } @@ -681,12 +681,12 @@ if (matchCount == 2) { // found a control point.. add to control points list - m_ctrlPointMap[cps.size()] = it - controlPoints.begin(); + m_ctrlPointMap[int(cps.size())] = it - controlPoints.begin(); cps.push_back(point); } } - gl.numPts = cps.size(); + gl.numPts = int(cps.size()); // Allocate Space for Pointers to images, preferences and control points @@ -718,7 +718,7 @@ const PanoramaOptions & opts = pano.getOptions(); setDestImage(gl.pano, Diff2D(opts.getWidth(), opts.getHeight()), - 0, opts.projectionFormat, opts.getHFOV()); + 0, opts.getProjection(), opts.getHFOV()); // Default: Use buffer 'buf' for stitching SetStitchDefaults(&(gl.st)); strcpy( gl.st.srcName, "buf" ); Index: PTOptimise.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/PTOptimise.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- PTOptimise.cpp 12 Nov 2004 21:11:32 -0000 1.9 +++ PTOptimise.cpp 6 Jan 2006 16:02:36 -0000 1.10 @@ -402,7 +402,7 @@ CPVector & cps, utils::MultiProgressDisplay & progDisp) { - unsigned nImg = pano.getNrOfImages(); + unsigned nImg = unsigned(pano.getNrOfImages()); // build a graph over all overlapping images CPGraph graph; createCPGraph(pano,graph); Index: Stitcher.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/Stitcher.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- Stitcher.cpp 15 Dec 2005 16:05:23 -0000 1.10 +++ Stitcher.cpp 6 Jan 2006 16:02:36 -0000 1.11 @@ -259,7 +259,8 @@ return; } } else { - DEBUG_FATAL("unsupported depth, only images with 1 and 3 channel images are supported"); + DEBUG_ERROR("unsupported depth, only images with 1 and 3 channel images are supported"); + throw std::runtime_error("unsupported depth, only images with 1 and 3 channel images are supported"); return; } } Index: PanoramaMemento.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/PanoramaMemento.cpp,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- PanoramaMemento.cpp 15 Dec 2005 16:05:23 -0000 1.61 +++ PanoramaMemento.cpp 6 Jan 2006 16:02:36 -0000 1.62 @@ -57,25 +57,58 @@ // Lens variables vars.insert(pair<const char*, Variable>("v",Variable("v",51))); - vars.insert(pair<const char*, Variable>("a",Variable("a",0.0001))); - vars.insert(pair<const char*, Variable>("b",Variable("b",0.0001))); - vars.insert(pair<const char*, Variable>("c",Variable("c",0.0001))); + vars.insert(pair<const char*, Variable>("a",Variable("a",0.0))); + vars.insert(pair<const char*, Variable>("b",Variable("b",0.0))); + vars.insert(pair<const char*, Variable>("c",Variable("c",0.0))); vars.insert(pair<const char*, Variable>("d",Variable("d",0))); vars.insert(pair<const char*, Variable>("e",Variable("e",0))); vars.insert(pair<const char*, Variable>("g",Variable("g",0))); vars.insert(pair<const char*, Variable>("t",Variable("t",0))); + + vars.insert(pair<const char*, Variable>("Va",Variable("Va",0))); + vars.insert(pair<const char*, Variable>("Vb",Variable("Vb",0))); + vars.insert(pair<const char*, Variable>("Vc",Variable("Vc",0))); + vars.insert(pair<const char*, Variable>("Vd",Variable("Vd",0))); + vars.insert(pair<const char*, Variable>("Vx",Variable("Vx",0))); + vars.insert(pair<const char*, Variable>("Vy",Variable("Vy",0))); + + // color and brightness correction variables. + vars.insert(pair<const char*, Variable>("K0a",Variable("K0a",1.0))); + vars.insert(pair<const char*, Variable>("K0b",Variable("K0b",0))); + vars.insert(pair<const char*, Variable>("K1a",Variable("K1a",1.0))); + vars.insert(pair<const char*, Variable>("K1b",Variable("K1b",0))); + vars.insert(pair<const char*, Variable>("K2a",Variable("K2a",1.0))); + vars.insert(pair<const char*, Variable>("K2b",Variable("K2b",0))); + }; void PT::fillLensVarMap(LensVarMap & variables) { variables.insert(pair<const char*, LensVariable>("v",LensVariable("v", 51, true))); - variables.insert(pair<const char*, LensVariable>("a",LensVariable("a", 0.0001, true ))); - variables.insert(pair<const char*, LensVariable>("b",LensVariable("b", 0.0001, true))); - variables.insert(pair<const char*, LensVariable>("c",LensVariable("c", 0.0001, true))); + variables.insert(pair<const char*, LensVariable>("a",LensVariable("a", 0.0, true ))); + variables.insert(pair<const char*, LensVariable>("b",LensVariable("b", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("c",LensVariable("c", 0.0, true))); variables.insert(pair<const char*, LensVariable>("d",LensVariable("d", 0.0, true))); variables.insert(pair<const char*, LensVariable>("e",LensVariable("e", 0.0, true))); - variables.insert(pair<const char*, LensVariable>("g",LensVariable("g", 0.0))); - variables.insert(pair<const char*, LensVariable>("t",LensVariable("t", 0.0))); + variables.insert(pair<const char*, LensVariable>("g",LensVariable("g", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("t",LensVariable("t", 0.0, true))); + + // vignetting correction variables + variables.insert(pair<const char*, LensVariable>("Va",LensVariable("Va", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("Vb",LensVariable("Vb", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("Vc",LensVariable("Vc", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("Vd",LensVariable("Vd", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("Vx",LensVariable("Vx", 0.0, true))); + variables.insert(pair<const char*, LensVariable>("Vy",LensVariable("Vy", 0.0, true))); + + // color and brightness correction variables. + variables.insert(pair<const char*, LensVariable>("K0a",LensVariable("K0a", 1.0, false))); + variables.insert(pair<const char*, LensVariable>("K0b",LensVariable("K0b", 0.0, false))); + variables.insert(pair<const char*, LensVariable>("K1a",LensVariable("K1a", 1.0, false))); + variables.insert(pair<const char*, LensVariable>("K1b",LensVariable("K1b", 0.0, false))); + variables.insert(pair<const char*, LensVariable>("K2a",LensVariable("K2a", 1.0, false))); + variables.insert(pair<const char*, LensVariable>("K2b",LensVariable("K2b", 0.0, false))); + } void PT::printVariableMap(ostream & o, const VariableMap & vars) @@ -110,7 +143,9 @@ fillLensVarMap(variables); } -char *PT::Lens::variableNames[] = { "v", "a", "b", "c", "d", "e", "g", "t", 0}; +char *PT::Lens::variableNames[] = { "v", "a", "b", "c", "d", "e", "g", "t", + "Va", "Vb", "Vc", "Vd", "Vx", "Vy", + "K0a", "K0b", "K1a", "K1b", "K2a", "K2b", 0}; @@ -225,7 +260,7 @@ vigra::ImageImportInfo info(filename.c_str()); width = info.width(); height = info.height(); - } catch(vigra::PreconditionViolation & e) { + } catch(vigra::PreconditionViolation & ) { return false; } setImageSize(vigra::Size2D(width, height)); @@ -377,7 +412,7 @@ void PanoramaOptions::printScriptLine(std::ostream & o) const { - o << "p f" << projectionFormat << " w" << getWidth()<< " h" << getHeight() + o << "p f" << m_projectionFormat << " w" << getWidth()<< " h" << getHeight() << " v" << getHFOV() << " "; switch (colorCorrection) { @@ -425,19 +460,37 @@ o << std::endl; } +void PanoramaOptions::setProjection(ProjectionFormat f) +{ + m_projectionFormat = f; + // correct hfov. + setHFOV(std::min(getHFOV(), getMaxHFOV())); +} + void PanoramaOptions::setWidth(unsigned int w, bool keepView) { - double vfov; if (keepView) vfov = getVFOV(); m_width = w; if (keepView) { - setVFOV(vfov); + setVFOV(std::min(vfov, getMaxVFOV())); } DEBUG_DEBUG(" HFOV: " << m_hfov << " w: " << m_width << " h: " << m_height << " => vfov: " << getVFOV()); } +void PanoramaOptions::setHFOV(double h, bool keepView) +{ + double vfov; + if (keepView) { + vfov = getVFOV(); + } + m_hfov = std::min(h, getMaxHFOV()); + if (keepView) { + setVFOV(std::min(vfov, getMaxVFOV())); + } +} + void PanoramaOptions::setHeight(unsigned int h) { m_height = h; @@ -446,7 +499,7 @@ void PanoramaOptions::setVFOV(double VFOV) { - switch (projectionFormat) { + switch (m_projectionFormat) { case RECTILINEAR: { m_height = utils::roundi( m_width * tan(DEG_TO_RAD(VFOV)/2.0) / tan(DEG_TO_RAD(m_hfov)/2.0)); @@ -471,7 +524,7 @@ double PanoramaOptions::getVFOV() const { double VFOV; - switch (projectionFormat) { + switch (m_projectionFormat) { case PanoramaOptions::RECTILINEAR: VFOV = 2.0 * atan( (double)m_height * tan(DEG_TO_RAD(m_hfov)/2.0) / m_width); VFOV = RAD_TO_DEG(VFOV); @@ -495,6 +548,39 @@ return VFOV; } +double PanoramaOptions::getMaxHFOV() const +{ + switch (m_projectionFormat) + { + case RECTILINEAR: + return 179; + case CYLINDRICAL: + case EQUIRECTANGULAR: + case FULL_FRAME_FISHEYE: + return 360; + } + // strange, MSVC complains about not all control paths return a value. + // all projection formats are specifed in the switch ... + return 179.0; +} + +double PanoramaOptions::getMaxVFOV() const +{ + switch (m_projectionFormat) + { + case RECTILINEAR: + case CYLINDRICAL: + return 179; + case EQUIRECTANGULAR: + return 180; + case FULL_FRAME_FISHEYE: + return 360; + } + // strange, MSVC complains about not all control paths return a value. + // all projection formats are specifed in the switch ... + return 179.0; +} + const string PanoramaOptions::fileformatNames[] = { "JPEG", @@ -536,7 +622,8 @@ width = -1; height = -1; f = -2; - for (char * v = varnames; *v != 0; v++) { + vigcorrMode = 0; + for (char ** v = varnames; *v != 0; v++) { vars[*v] = 0; links[*v] = -2; } @@ -544,10 +631,11 @@ void parse(const string & line) { - for (char * v = varnames; *v != 0; v++) { - vars[*v] = 0; + double * val = defaultValues; + for (char ** v = varnames; *v; v++, val++) { + vars[*v] = *val; links[*v] = -1; - string name; + std::string name; name = *v; getPTDoubleParam(vars[*v], links[*v], line, name); } @@ -560,6 +648,10 @@ getPTStringParam(filename,line,"n"); getIntParam(width, line, "w"); getIntParam(height, line, "h"); + + getIntParam(vigcorrMode, line, "Vm"); + getPTStringParam(flatfieldname,line,"Vf"); + string crop_str; if ( getPTParam(crop_str, line, "C") ) { int left, right, top, bottom; @@ -581,18 +673,26 @@ } } - static char varnames[]; - string filename; - std::map<char, double> vars; - std::map<char, int> links; + static char *varnames[]; + static double defaultValues[]; + std::string filename; + std::string flatfieldname; + std::map<std::string, double> vars; + std::map<std::string, int> links; int f; int blend_radius; int width, height; + int vigcorrMode; vigra::Rect2D crop; }; -char ImgInfo::varnames[] = "vabcdegtrpy"; - +// cannot use Lens::variableNames here, because r,p,v need to be included +char * ImgInfo::varnames[] = {"v","a","b","c","d","e","g","t","r","p","y", + "Va", "Vb", "Vc", "Vd", "Vx", "Vy", + "K0a", "K0b", "K1a", "K1b", "K2a", "K2b", 0}; +double ImgInfo::defaultValues[] = {51.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 1.0, 0.0, 1.0, 0.0, 1.0, 0.0}; bool PanoramaMemento::loadPTScript(std::istream &i, const std::string &prefix) { @@ -641,7 +741,7 @@ string format; int i; getIntParam(i,line,"f"); - options.projectionFormat = (PanoramaOptions::ProjectionFormat) i; + options.setProjection( (PanoramaOptions::ProjectionFormat) i ); unsigned int w; getIntParam(w, line, "w"); options.setWidth(w); @@ -928,7 +1028,7 @@ // create lens with dummy info Lens l; for (char **v = Lens::variableNames; *v != 0; v++) { - map_get(l.variables, *v).setValue(PTGUILens.vars[**v]); + map_get(l.variables, *v).setValue(PTGUILens.vars[*v]); } l.setImageSize(vigra::Size2D(PTGUILens.width, PTGUILens.height)); l.setCropFactor(1); @@ -984,7 +1084,7 @@ // i lines. or it is linked on the o lines) // ordinary variables - for (char * v = ImgInfo::varnames; *v != 0; v++) { + for (char ** v = ImgInfo::varnames; *v ; v++) { if (iImgInfo[i].links[*v] == -2 && oImgInfo[i].links[*v] != -2 || iImgInfo[i].links[*v] == -1 && oImgInfo[i].links[*v] >=0) { DEBUG_DEBUG(*v << ": o -> i"); @@ -1038,9 +1138,8 @@ int link = -2; fillVariableMap(vars); - for (char * v = ImgInfo::varnames; *v != 0; v++) { - std::string name; - name = *v; + for (char ** v = ImgInfo::varnames; *v != 0; v++) { + std::string name(*v); double val = iImgInfo[i].vars[*v]; map_get(vars,name).setValue(val); DEBUG_ASSERT(link <0 || iImgInfo[i].links[*v] < 0|| link == iImgInfo[i].links[*v]); @@ -1081,7 +1180,7 @@ (*it).second.setLinked(false); DEBUG_DEBUG("reading variable " << varname << " link:" << link ); - if (link >=0 && iImgInfo[i].links[varname[0]]>= 0) { + if (link >=0 && iImgInfo[i].links[varname]>= 0) { // linked variable if (PTGUILensLoaded && link == 0) { @@ -1161,6 +1260,8 @@ opts.docrop = true; opts.cropRect = iImgInfo[i].crop; } + opts.m_vigCorrMode = iImgInfo[i].vigcorrMode; + opts.m_flatfield = iImgInfo[i].flatfieldname; images.back().setOptions(opts); } Index: Makefile.am =================================================================== RCS file: /cvsroot/hugin/hugin/src/Panorama/Makefile.am,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Makefile.am 10 Nov 2004 07:29:07 -0000 1.6 +++ Makefile.am 6 Jan 2006 16:02:36 -0000 1.7 @@ -7,4 +7,5 @@ noinst_LTLIBRARIES = libpanorama.la libpanorama_la_SOURCES = Panorama.cpp PanoramaMemento.cpp PanoImage.cpp PanoToolsInterface.cpp SpaceTransform.cpp PTOptimise.cpp ImageGraph.cpp Stitcher.cpp -EXTRA_DIST=Panorama.vcproj OptimizeOptions.cpp \ No newline at end of file +EXTRA_DIST=Panorama.vcproj OptimizeOptions.cpp +noinst_HEADERS = Stitcher_TIFF.h |