From: <ip...@us...> - 2007-06-27 17:00:01
|
Revision: 2171 http://hugin.svn.sourceforge.net/hugin/?rev=2171&view=rev Author: ippei Date: 2007-06-27 09:59:59 -0700 (Wed, 27 Jun 2007) Log Message: ----------- working on panodata implementations Modified Paths: -------------- hugin/branches/ippei/src/hugin_base/hugin_math/hugin_math.h hugin/branches/ippei/src/hugin_base/hugin_utils/stl_utils.h hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.h hugin/branches/ippei/src/hugin_base/panodata/Lens.h hugin/branches/ippei/src/hugin_base/panodata/PanoImage.cpp hugin/branches/ippei/src/hugin_base/panodata/PanoImage.h hugin/branches/ippei/src/hugin_base/panodata/Panorama.cpp hugin/branches/ippei/src/hugin_base/panodata/Panorama.h hugin/branches/ippei/src/hugin_base/panodata/PanoramaData.h hugin/branches/ippei/src/hugin_base/panodata/PanoramaVariable.h hugin/branches/ippei/src/hugin_base/panodata/SrcPanoImage.h Added Paths: ----------- hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.cpp hugin/branches/ippei/src/hugin_base/panodata/Lens.cpp hugin/branches/ippei/src/hugin_base/panodata/PanoramaVariable.cpp hugin/branches/ippei/src/hugin_base/panodata/SrcPanoImage.cpp Removed Paths: ------------- hugin/branches/ippei/src/hugin_base/panodata/PanoramaMemento.cpp Modified: hugin/branches/ippei/src/hugin_base/hugin_math/hugin_math.h =================================================================== --- hugin/branches/ippei/src/hugin_base/hugin_math/hugin_math.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/hugin_math/hugin_math.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -24,8 +24,8 @@ * */ -#ifndef _HUGIN_MATH_MATH_H -#define _HUGIN_MATH_MATH_H +#ifndef _HUGIN_MATH_HUGIN_MATH_H +#define _HUGIN_MATH_HUGIN_MATH_H #include <iostream> #include <vigra/basicimage.hxx> Modified: hugin/branches/ippei/src/hugin_base/hugin_utils/stl_utils.h =================================================================== --- hugin/branches/ippei/src/hugin_base/hugin_utils/stl_utils.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/hugin_utils/stl_utils.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -78,9 +78,15 @@ } -/// + +/** get a map element. +* +* does not create a new element in the map, like operator[] does +* +* Throws an error if the element does not exist +*/ template<typename Map> -typename Map::data_type & map_get(Map &m, const char * key) +typename Map::mapped_type & map_get(Map &m, const typename Map::key_type & key) { typename Map::iterator it = m.find(key); if (it != m.end()) { @@ -91,15 +97,22 @@ } } -/** get a map element. - * - * does not create a new element in the map, like operator[] does - * - * Throws an error if the element does not exist - */ template<typename Map> -typename Map::data_type & map_get(Map &m, const typename Map::key_type & key) +const typename Map::mapped_type & const_map_get(const Map &m, const typename Map::key_type & key) { + typename Map::const_iterator it = m.find(key); + if (it != m.end()) { + return (*it).second; + } else { + DEBUG_WARN("could not find " << key); + throw std::out_of_range("No such element in vector"); + } +} + + +template<typename Map> +typename Map::mapped_type & map_get(Map &m, const char * key) +{ typename Map::iterator it = m.find(key); if (it != m.end()) { return (*it).second; @@ -109,9 +122,8 @@ } } -/// -template<class Map> -const typename Map::data_type & map_get(const Map &m, const typename Map::key_type & key) +template<typename Map> +const typename Map::mapped_type & const_map_get(const Map &m, const char * key) { typename Map::const_iterator it = m.find(key); if (it != m.end()) { Added: hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.cpp =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.cpp (rev 0) +++ hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.cpp 2007-06-27 16:59:59 UTC (rev 2171) @@ -0,0 +1,68 @@ +// -*- c-basic-offset: 4 -*- +/** @file PanoramaMemento.h + * + * @author Pablo d'Angelo <pab...@we...> + * + * $Id: PanoramaMemento.h 1970 2007-04-18 22:26:56Z dangelo $ + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +#include "ControlPoint.h" + + +namespace HuginBase { + + +bool ControlPoint::operator==(const ControlPoint & o) const +{ + return (image1Nr == o.image1Nr && + image2Nr == o.image2Nr && + x1 == o.x1 && y1 == o.y1 && + x2 == o.x2 && y2 == o.y2 && + mode == o.mode && + error == o.error); +} + + +void ControlPoint::mirror() +{ + unsigned int ti; + double td; + ti =image1Nr; image1Nr = image2Nr, image2Nr = ti; + td = x1; x1 = x2 ; x2 = td; + td = y1; y1 = y2 ; y2 = td; +} + + +std::string ControlPoint::modeNames[] = { "x_y", "x", "y" }; + +const std::string& ControlPoint::getModeName(OptimizeMode mode) const +{ + return modeNames[mode]; +} + + +#if 0 +ControlPoint::ControlPoint(Panorama & pano, const QDomNode & node) +{ + setFromXML(node,pano); +} +#endif + + +} // namespace Modified: hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.h =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/ControlPoint.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -27,59 +27,16 @@ #include <string> #include <vector> -#include <map> -#include <algorithm> -#include <set> -#include <math.h> -#ifdef HasPANO13 -extern "C" { +#include <vigra_ext/Interpolators.h> -#ifdef __INTEL__ -#define __INTELMEMO__ -#undef __INTEL__ -#endif -#include "pano13/panorama.h" +namespace HuginBase { -#ifdef __INTELMEMO__ -#define __INTEL__ -#undef __INTELMEMO__ -#endif - -// remove stupid #defines from the evil windows.h - -#ifdef DIFFERENCE -#undef DIFFERENCE -#endif - -#ifdef MIN -#undef MIN -#endif - -#ifdef MAX -#undef MAX -#endif - -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif -} -#endif - -#include "PT/PanoImage.h" - -#include "vigra_ext/Interpolators.h" - -namespace PT { - /// represents a control point class ControlPoint { + public: /** minimize x,y or both. higher numbers mean multiple line * control points @@ -89,6 +46,10 @@ X, ///< evaluate x, points are on a vertical line Y ///< evaluate y, points are on a horizontal line }; + + +public: + /// ControlPoint() : image1Nr(0), image2Nr(0), x1(0),y1(0), @@ -96,7 +57,10 @@ error(0), mode(X_Y) { }; -// ControlPoint(Panorama & pano, const QDomNode & node); + /// +// ControlPoint(Panorama & pano, const QDomNode & node); + + /// ControlPoint(unsigned int img1, double sX, double sY, unsigned int img2, double dX, double dY, int mode = X_Y) @@ -106,28 +70,29 @@ error(0), mode(mode) { }; - bool operator==(const ControlPoint & o) const - { - return (image1Nr == o.image1Nr && - image2Nr == o.image2Nr && - x1 == o.x1 && y1 == o.y1 && - x2 == o.x2 && y2 == o.y2 && - mode == o.mode && - error == o.error); - } - + /// + bool operator==(const ControlPoint & o) const; + + +public: + /// const std::string & getModeName(OptimizeMode mode) const; -// QDomNode toXML(QDomDocument & doc) const; - -// void setFromXML(const QDomNode & elem, Panorama & pano); - /// swap (image1Nr,x1,y1) with (image2Nr,x2,y2) void mirror(); + +public: + /// +// QDomNode toXML(QDomDocument & doc) const; + + /// +// void setFromXML(const QDomNode & elem, Panorama & pano); + + protected: // TODO: accessors - + unsigned int image1Nr; unsigned int image2Nr; double x1,y1; @@ -136,12 +101,13 @@ int mode; static std::string modeNames[]; - }; +/// typedef std::vector<ControlPoint> CPVector; + } // namespace #endif // _PANORAMAMEMENTO_H Copied: hugin/branches/ippei/src/hugin_base/panodata/Lens.cpp (from rev 2153, hugin/branches/ippei/src/hugin_base/panodata/PanoramaMemento.cpp) =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/Lens.cpp (rev 0) +++ hugin/branches/ippei/src/hugin_base/panodata/Lens.cpp 2007-06-27 16:59:59 UTC (rev 2171) @@ -0,0 +1,327 @@ +// -*- c-basic-offset: 4 -*- + +/** @file PanoramaMemento.cpp + * + * @brief implementation of PanoramaMemento Class + * + * @author Pablo d'Angelo <pab...@we...> + * + * $Id: PanoramaMemento.cpp 1998 2007-05-10 06:26:46Z dangelo $ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +//#include <config.h> +// +//#include <iomanip> +// +#include <jhead/jhead.h> +// +//#include <common/utils.h> +//#include <common/stl_utils.h> +//#include <common/math.h> +// +//#include <PT/PanoramaMemento.h> +//#include <PT/Panorama.h> +////#include <PT/SpaceTransform.h> +// +// +#include <vigra/impex.hxx> +// +//#include <PT/PanoToolsInterface.h> + +#include <hugin_utils/utils.h> +#include <hugin_utils/stl_utils.h> +#include "Lens.h" + +//using namespace std; +//using namespace hugin_utils; +//using namespace vigra; + + +namespace HuginBase { + + + +Lens::Lens() + : m_hasExif(false), m_projectionFormat(RECTILINEAR), + m_imageSize(0,0), m_sensorSize(36.0,24.0) +{ + fillLensVarMap(variables); +} + + +char* Lens::variableNames[] = { "v", "a", "b", "c", "d", "e", "g", "t", + "Va", "Vb", "Vc", "Vd", "Vx", "Vy", + "Eev", "Er", "Eb", + "Ra", "Rb", "Rc", "Rd", "Re", 0}; + +double Lens::getHFOV() const +{ + return const_map_get(this->variables,"v").getValue(); +} + +void Lens::setHFOV(double d) +{ + map_get(variables,"v").setValue(d); +} + +double Lens::getFocalLength() const +{ + + double HFOV = const_map_get(variables,"v").getValue(); +#if 0 + if (isLandscape()) { + ssize = m_sensorSize; + } else { + ssize.y = m_sensorSize.x; + ssize.x = m_sensorSize.y; + } +#endif + + switch (m_projectionFormat) + { + case RECTILINEAR: + return (m_sensorSize.x/2.0) / tan(HFOV/180.0*M_PI/2); + break; + case CIRCULAR_FISHEYE: + case FULL_FRAME_FISHEYE: + // same projection equation for both fisheye types, + // assume equal area projection. + return m_sensorSize.x / (HFOV/180*M_PI); + break; + default: + // TODO: add formulas for other projections + DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images"); + return 0; + } +} + +void Lens::setEV(double ev) +{ + map_get(variables, "Eev").setValue(ev); +} + +void Lens::setFocalLength(double fl) +{ +#if 0 + if (isLandscape()) { + ssize = m_sensorSize; + } else { + ssize.y = m_sensorSize.x; + ssize.x = m_sensorSize.y; + } +#endif + + double hfov=map_get(variables, "v").getValue(); + switch (m_projectionFormat) { + case RECTILINEAR: + hfov = 2*atan((m_sensorSize.x/2.0)/fl) * 180.0/M_PI; + break; + case CIRCULAR_FISHEYE: + case FULL_FRAME_FISHEYE: + hfov = m_sensorSize.x / fl * 180/M_PI; + default: + // TODO: add formulas for other projections + DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images"); + } + map_get(variables, "v").setValue(hfov); +} + + +void Lens::setCropFactor(double factor) +{ + // calculate diagonal on our sensor + double d = sqrt(36.0*36.0 + 24.0*24.0) / factor; + + double r = (double)m_imageSize.x / m_imageSize.y; + + // calculate the sensor width and height that fit the ratio + // the ratio is determined by the size of our image. + m_sensorSize.x = d / sqrt(1 + 1/(r*r)); + m_sensorSize.y = m_sensorSize.x / r; +} + +double Lens::getCropFactor() const +{ + double d2 = m_sensorSize.x*m_sensorSize.x + m_sensorSize.y*m_sensorSize.y; + return sqrt(36.0*36+24*24) / sqrt(d2); +} + + +double Lens::getAspectRatio() const +{ + return (double)m_imageSize.x / m_imageSize.y; +} + + +bool Lens::isLandscape() const +{ + return m_imageSize.x >= m_imageSize.y; +} + + +bool Lens::initFromFile(const std::string & filename, double &cropFactor, double & roll) +{ + std::string ext = hugin_utils::getExtension(filename); + std::transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int)) toupper); + + roll = 0; + int width; + int height; + try { + vigra::ImageImportInfo info(filename.c_str()); + width = info.width(); + height = info.height(); + } catch(vigra::PreconditionViolation & ) { + return false; + } + setImageSize(vigra::Size2D(width, height)); + + if (ext != "JPG" && ext != "JPEG") { + return false; + } + + ImageInfo_t exif; + ResetJpgfile(); + // Start with an empty image information structure. + + memset(&exif, 0, sizeof(exif)); + exif.FlashUsed = -1; + exif.MeteringMode = -1; + + if (!ReadJpegFile(exif,filename.c_str(), READ_EXIF)){ + DEBUG_DEBUG("Could not read jpg info"); + return false; + } + +#ifdef DEBUG + ShowImageInfo(exif); +#endif + + DEBUG_DEBUG("exif dimensions: " << exif.ExifImageWidth << "x" << exif.ExifImageWidth); + + 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; + } + // image has been modified without adjusting exif tags + // assume user has rotated to upright pose + if (exif.ExifImageWidth && exif.ExifImageLength) { + double ratioExif = exif.ExifImageWidth / (double)exif.ExifImageLength; + double ratioImage = width/(double)height; + if (abs( ratioExif - ratioImage) > 0.1) { + roll = 0; + } + } + + std::cout << "exp time: " << exif.ExposureTime << " f-stop: " << exif.ApertureFNumber << std::endl; + // calculate exposure from exif image + if (exif.ExposureTime > 0 && exif.ApertureFNumber > 0) { + setEV(log2(exif.ApertureFNumber*exif.ApertureFNumber/exif.ExposureTime)); + } + + // calc sensor dimensions if not set and 35mm focal length is available + FDiff2D sensorSize; + double focalLength = 0; + + + if (exif.FocalLength > 0 && exif.CCDHeight > 0 && exif.CCDWidth > 0) { + // read sensor size directly. + sensorSize.x = exif.CCDWidth; + sensorSize.y = exif.CCDHeight; + if (strcmp(exif.CameraModel, "Canon EOS 20D") == 0) { + // special case for buggy 20D camera + sensorSize.x = 22.5; + sensorSize.y = 15; + } + // + // check if sensor size ratio and image size fit together + double rsensor = (double)sensorSize.x / sensorSize.y; + double rimg = (double) width / height; + if ( (rsensor > 1 && rimg < 1) || (rsensor < 1 && rimg > 1) ) { + // image and sensor ratio do not match + // swap sensor sizes + float t; + t = sensorSize.y; + sensorSize.y = sensorSize.x; + sensorSize.x = t; + } + cropFactor = sqrt(36.0*36.0+24.0*24)/sqrt(sensorSize.x*sensorSize.x + sensorSize.y*sensorSize.y); + focalLength = exif.FocalLength; + } else if (exif.FocalLength35mm > 0 && exif.FocalLength > 0) { + cropFactor = exif.FocalLength35mm / exif.FocalLength; + focalLength = exif.FocalLength; + } else if (exif.FocalLength35mm > 0 && cropFactor <= 0) { + // do not ask for crop factor, even if we will store an invalid sensor size. + // currenty the sensor size (just the ratio) is not used anywhere. + cropFactor = 1; + focalLength = exif.FocalLength35mm; + } else if (exif.FocalLength > 0 || exif.FocalLength35mm > 0 ) { + // no complete specification found.. ask the user for sensor/chip size, or crop factor + if (cropFactor > 0) { + // crop factor was provided by user + } else { + // need to redo, this time with crop + cropFactor = -1; + return false; + } + if (exif.FocalLength > 0 ) { + focalLength = exif.FocalLength; + } else if (exif.FocalLength35mm) { + focalLength = exif.FocalLength35mm * cropFactor; + } + } + + if (sensorSize.x > 0) { + setSensorSize(sensorSize); + } else if (cropFactor > 0) { + setCropFactor(cropFactor); + } else { + return false; + } + + if (focalLength > 0) { + setFocalLength(focalLength); + } else { + return false; + } + + return true; +} + + +void Lens::update(const Lens & l) +{ + m_projectionFormat = l.m_projectionFormat; + m_sensorSize = l.m_sensorSize; + m_imageSize = l.m_imageSize; + variables = l.variables; +} + + + +} //namespace Modified: hugin/branches/ippei/src/hugin_base/panodata/Lens.h =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/Lens.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/Lens.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -25,190 +25,147 @@ * */ -#ifndef _PANORAMAMEMENTO_H -#define _PANORAMAMEMENTO_H +#ifndef _PANODATA_LENS_H +#define _PANODATA_LENS_H #include <string> #include <vector> #include <map> -#include <algorithm> -#include <set> -#include <math.h> -#ifdef HasPANO13 -extern "C" { +#include <hugin_math/hugin_math.h> +#include <panodata/PanoramaVariable.h> -#ifdef __INTEL__ -#define __INTELMEMO__ -#undef __INTEL__ -#endif -#include "pano13/panorama.h" +namespace HuginBase { -#ifdef __INTELMEMO__ -#define __INTEL__ -#undef __INTELMEMO__ -#endif - -// remove stupid #defines from the evil windows.h - -#ifdef DIFFERENCE -#undef DIFFERENCE -#endif - -#ifdef MIN -#undef MIN -#endif - -#ifdef MAX -#undef MAX -#endif - -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif -} -#endif - -#include "PT/PanoImage.h" - -#include "vigra_ext/Interpolators.h" - -namespace PT { - + class Lens { -public: - /** Lens type - */ - enum LensProjectionFormat { RECTILINEAR = 0, - PANORAMIC = 1, - CIRCULAR_FISHEYE = 2, - FULL_FRAME_FISHEYE = 3, - EQUIRECTANGULAR = 4}; + public: + /** Lens type + */ + enum LensProjectionFormat { + RECTILINEAR = 0, + PANORAMIC = 1, + CIRCULAR_FISHEYE = 2, + FULL_FRAME_FISHEYE = 3, + EQUIRECTANGULAR = 4 + }; + + public: + /** construct a new lens. + * + */ + Lens(); + + + public: + /// + // QDomElement toXML(QDomDocument & doc); + + /// + // void setFromXML(const QDomNode & node); - /** construct a new lens. - * - */ - Lens(); + /** try to fill Lens data (HFOV) from EXIF header + * + * @return true if focal length was found, lens will contain + * the correct data. + */ + // bool readEXIF(const std::string & filename); -// QDomElement toXML(QDomDocument & doc); -// void setFromXML(const QDomNode & node); + + public: + /** get projection type */ + LensProjectionFormat getProjection() const + { return m_projectionFormat; } - /** try to fill Lens data (HFOV) from EXIF header - * - * @return true if focal length was found, lens will contain - * the correct data. - */ -// bool readEXIF(const std::string & filename); + /** set projection type */ + void setProjection(LensProjectionFormat l) + { m_projectionFormat = l; } - /** get projection type */ - LensProjectionFormat getProjection() const - { - return m_projectionFormat; - } + /** get HFOV in degrees */ + double getHFOV() const; - /** set projection type */ - void setProjection(LensProjectionFormat l) { - m_projectionFormat = l; - } + /** set HFOV in degrees */ + void setHFOV(double d); - /** get HFOV in degrees */ - double getHFOV() const; + /** get focal length of lens, it is calculated from the HFOV */ + double getFocalLength() const; - /** set HFOV in degrees */ - void setHFOV(double d); + /** set focal length, updates HFOV */ + void setFocalLength(double); - /** get focal length of lens, it is calculated from the HFOV */ - double getFocalLength() const; + /** get crop factor, d35mm/dreal */ + double getCropFactor() const; - /** set focal length, updates HFOV */ - void setFocalLength(double); + /** Set the crop factor. + * + * This will recalculate the sensor size. + * + * @param c is the ratio of the sensor diagonals: + * factor = diag35mm / real_diag + */ + void setCropFactor(double c); - /** get crop factor, d35mm/dreal */ - double getCropFactor() const; + /** get sensor dimension */ + FDiff2D getSensorSize() const + { return m_sensorSize; } - /** Set the crop factor. - * - * This will recalculate the sensor size. - * - * @param c is the ratio of the sensor diagonals: - * factor = diag35mm / real_diag - */ - void setCropFactor(double c); + /** set sensor dimensions. Only square pixels are supported so far.*/ + void setSensorSize(const FDiff2D & size) + { m_sensorSize = size; } - /** get sensor dimension */ - FDiff2D getSensorSize() const - { - return m_sensorSize; - } + /** return the sensor ratio (width/height) + */ + double getAspectRatio() const; - /** set sensor dimensions. Only square pixels are supported so far.*/ - void setSensorSize(const FDiff2D & size); + /** check if the image associated with this lens is in landscape orientation. + */ + bool isLandscape() const; + + /** set the exposure value */ + void setEV(double ev); - /** return the sensor ratio (width/height) - */ - double getAspectRatio() const - { - return (double)m_imageSize.x / m_imageSize.y; - } + /** get the image size, in pixels */ + vigra::Size2D getImageSize() const + { return m_imageSize; } - /** check if the image associated with this lens is in landscape orientation. - */ - bool isLandscape() const - { - return m_imageSize.x >= m_imageSize.y; - } + /** set image size in pixels */ + void setImageSize(const vigra::Size2D & sz) + { m_imageSize = sz; } - /** set the exposure value */ - void setEV(double ev); + /** try to read image information from file */ + bool initFromFile(const std::string & filename, double &cropFactor, double & roll); - /** get the image size, in pixels */ - vigra::Size2D getImageSize() const - { - return m_imageSize; - } + // updates everything, including the lens variables. + void update(const Lens & l); - /** set image size in pixels */ - void setImageSize(const vigra::Size2D & sz) - { - m_imageSize = sz; - } + + protected: //? + + // bool isLandscape; + + // these are the lens specific settings. + // lens correction parameters + LensVarMap variables; + static char *variableNames[]; - /** try to read image information from file */ - bool initFromFile(const std::string & filename, double &cropFactor, double & roll); - -// double isLandscape() const { -// return sensorRatio >=1; -// } - - // updates everything, including the lens variables. - void update(const Lens & l); - - -// bool isLandscape; - // these are the lens specific settings. - // lens correction parameters - LensVarMap variables; - static char *variableNames[]; - - bool m_hasExif; -private: - - LensProjectionFormat m_projectionFormat; - vigra::Size2D m_imageSize; - FDiff2D m_sensorSize; + bool m_hasExif; + + + private: + LensProjectionFormat m_projectionFormat; + vigra::Size2D m_imageSize; + FDiff2D m_sensorSize; + }; +/// typedef std::vector<Lens> LensVector; } // namespace -#endif // _PANORAMAMEMENTO_H +#endif // _H Modified: hugin/branches/ippei/src/hugin_base/panodata/PanoImage.cpp =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/PanoImage.cpp 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/PanoImage.cpp 2007-06-27 16:59:59 UTC (rev 2171) @@ -6,75 +6,85 @@ // // -#include <config.h> -#include <stdio.h> -#include <math.h> -//#include <setjmp.h> -#include <stdexcept> +#include <iostream> -#include <vigra/impex.hxx> +#include <hugin_config.h> +#include <hugin_utils/utils.h> -#include <jhead/jhead.h> +#include "PanoImage.h" -#include <PT/PanoImage.h> -#include <PT/Panorama.h> -#include <common/utils.h> -//#include "hugin/ImageCache.h" - -using namespace PT; +using namespace HuginBase; using namespace std; -using namespace utils; +//using namespace hugin_utils; -void SrcPanoImage::resize(const vigra::Size2D & sz) + +PanoImage::PanoImage() + : height(0), width(0), lensNr(0) +{}; + + +PanoImage::PanoImage(const std::string &filename, int width, int height, int lens) + : filename(filename), + height(height), + width(width), + lensNr(lens) +{}; + + +PanoImage::~PanoImage() { - // TODO: check if images have the same orientation. - // calculate scaling ratio - double scale = (double) sz.x / m_size.x; + DEBUG_DEBUG("PanoImage dtor, image= " << filename); +} - // center shift - m_centerShift *= scale; - m_shear *= scale; - // crop - // ensure the scaled rectangle is inside the new image size - switch (m_crop) - { - case NO_CROP: - m_cropRect = vigra::Rect2D(sz); - break; - case CROP_RECTANGLE: - m_cropRect = m_cropRect * scale; - m_cropRect = m_cropRect & vigra::Rect2D(sz); - break; - case CROP_CIRCLE: - m_cropRect = m_cropRect * scale; - break; - } - m_size = sz; - // vignetting correction - m_radialVigCorrCenterShift *=scale; +#if 0 +PanoImage::PanoImage(const std::string &filename) +: filename(filename), height(0), width(0) +{ + DEBUG_DEBUG("PanoImage ctor for " << filename); + readImageInformation(); } -bool SrcPanoImage::horizontalWarpNeeded() + +bool PanoImage::readImageInformation() { - switch (m_proj) - { - case PANORAMIC: - case EQUIRECTANGULAR: - if (m_hfov == 360) return true; - case FULL_FRAME_FISHEYE: - case CIRCULAR_FISHEYE: - case RECTILINEAR: - default: - break; + std::string::size_type idx = filename.rfind('.'); + if (idx == std::string::npos) { + DEBUG_DEBUG("could not find extension in filename"); + return false; } - return false; + std::string ext = filename.substr( idx+1 ); + + DEBUG_ERROR("readImageInformation should be set Image information"); + // this depends on wxWindow + // wxImage * image = ImageCache::getInstance().getImage(filename); + // width = image->GetWidth(); + // height = image->GetHeight(); + + + try { + // find another platform independant way to read the image info.. + Magick::Image img; + img.ping(filename.c_str()); + width = img.baseColumns(); + height = img.baseRows(); + } catch( Magick::Exception &e ) { + DEBUG_NOTICE("error while reading file information for " << filename + << ": " << e.what()); + return false; + } + + // isLandscape = (width > height); + return true; } +#endif + #if 0 + QDomElement ImageOptions::toXML(QDomDocument & doc) { QDomElement root = doc.createElement("options"); @@ -90,7 +100,7 @@ root.setAttribute("optimize_c", optimizeC); root.setAttribute("optimize_d", optimizeD); root.setAttribute("optimize_e", optimizeE); - + return root; } @@ -105,353 +115,12 @@ morph = getAttrib(attrs, "morph").toUInt() != 0; } -#endif -PanoImage::PanoImage(const std::string &filename, int width, int height, - int lens) - : filename(filename), - height(height), - width(width), - lensNr(lens) -{ -} -bool SrcPanoImage::operator==(const SrcPanoImage & other) const -{ - // return true; - return ( m_proj == other.m_proj && - m_hfov == other.m_hfov && - m_roll == other.m_roll && - m_pitch == other.m_pitch && - m_yaw == other.m_yaw && - - m_responseType == other.m_responseType && - m_emorParams == other.m_emorParams && - m_exposure == other.m_exposure && - m_gamma == m_gamma && - m_wbRed == m_wbRed && - m_wbBlue == m_wbBlue && - - m_radialDist == other.m_radialDist && - m_radialDistRed == other.m_radialDistRed && - m_radialDistBlue == other.m_radialDistBlue && - m_centerShift == other.m_centerShift && - m_shear == other.m_shear && - - m_crop == other.m_crop && - m_cropRect == other.m_cropRect && - - m_vigCorrMode == other.m_vigCorrMode && - m_radialVigCorrCoeff == other.m_radialVigCorrCoeff && - - m_ka == other.m_ka && - m_kb == other.m_kb && - - m_exifModel == other.m_exifModel && - m_exifMake == other.m_exifMake && - m_exifCropFactor == other.m_exifCropFactor && - m_exifFocalLength == other.m_exifFocalLength && - - m_lensNr == other.m_lensNr && - m_featherWidth == other.m_featherWidth && - m_morph == other.m_morph); -} - -// convinience functions to extract a set of variables -double SrcPanoImage::getVar(const std::string & name) const -{ - assert(name.size() > 0); - // TODO: support all variables - if (name == "Eev") - return m_exposure; - else if (name == "Er") - return m_wbRed; - else if (name == "Eb") - return m_wbBlue; - else if (name == "Ra") - return m_emorParams[0]; - else if (name[0] == 'R') - { - assert(name.size() == 2); - int i = name[1] - 'a'; - return m_emorParams[i]; - } else if (name[0] == 'V') - { - int i = name[1] - 'a'; - if (i > 0 && i < 4) { - return m_radialVigCorrCoeff[i]; - } else { - if (name[1] == 'x') { - return m_radialVigCorrCenterShift.x; - } else if (name[1] == 'y') { - return m_radialVigCorrCenterShift.y; - } - } - } else { - assert(0 || "Unknown variable in getVar()"); - } - return 0; -} - -void SrcPanoImage::setVar(const std::string & name, double val) -{ - assert(name.size() > 0); - // TODO: support all variables - if (name == "Eev") - m_exposure = val; - else if (name == "Er") - m_wbRed = val; - else if (name == "Eb") - m_wbBlue = val; - else if (name[0] == 'R') - { - assert(name.size() == 2); - int i = name[1] - 'a'; - m_emorParams[i] = val; - } else if (name[0] == 'V') - { - int i = name[1] - 'a'; - if (i >= 0 && i < 4) { - m_radialVigCorrCoeff[i] = val; - } else { - if (name[1] == 'x') { - m_radialVigCorrCenterShift.x = val; - } else if (name[1] == 'y') { - m_radialVigCorrCenterShift.y = val; - } else { - DEBUG_ERROR("Unknown variable " << name); - } - } - } else { - DEBUG_ERROR("Unknown variable " << name); - } -} - - -bool PT::initImageFromFile(SrcPanoImage & img, double & focalLength, double & cropFactor) -{ - std::string filename = img.getFilename(); - std::string ext = utils::getExtension(filename); - std::transform(ext.begin(), ext.end(), ext.begin(), (int(*)(int)) toupper); - - double roll = 0; - int width; - int height; - try { - vigra::ImageImportInfo info(filename.c_str()); - width = info.width(); - height = info.height(); - } catch(vigra::PreconditionViolation & ) { - return false; - } - img.setSize(vigra::Size2D(width, height)); - - if (ext == "JPG" || ext == "JPEG") { - - ImageInfo_t exif; - ResetJpgfile(); - // Start with an empty image information structure. - - memset(&exif, 0, sizeof(exif)); - exif.FlashUsed = -1; - exif.MeteringMode = -1; - if (ReadJpegFile(exif,filename.c_str(), READ_EXIF)){ -#ifdef DEBUG - ShowImageInfo(exif); -#endif - std::cout << "exp time: " << exif.ExposureTime << " f-stop: " << exif.ApertureFNumber << std::endl; - // calculate exposure from exif image - if (exif.ExposureTime > 0 && exif.ApertureFNumber > 0) { - double gain = 1; - if (exif.ISOequivalent > 0) - gain = exif.ISOequivalent/ 100.0; - img.setExposureValue(log2(exif.ApertureFNumber*exif.ApertureFNumber/(gain * exif.ExposureTime))); - } - - img.setExifMake(exif.CameraMake); - img.setExifModel(exif.CameraModel); - DEBUG_DEBUG("exif dimensions: " << exif.ExifImageWidth << "x" << exif.ExifImageWidth); - 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; - } - // image has been modified without adjusting exif tags - // assume user has rotated to upright pose - if (exif.ExifImageWidth && exif.ExifImageLength) { - double ratioExif = exif.ExifImageWidth / (double)exif.ExifImageLength; - double ratioImage = width/(double)height; - if (abs( ratioExif - ratioImage) > 0.1) { - roll = 0; - } - } - - // calc sensor dimensions if not set and 35mm focal length is available - FDiff2D sensorSize; - - if (exif.CCDHeight > 0 && exif.CCDWidth > 0) { - // read sensor size directly. - sensorSize.x = exif.CCDWidth; - sensorSize.y = exif.CCDHeight; - if (strcmp(exif.CameraModel, "Canon EOS 20D") == 0) { - // special case for buggy 20D camera - sensorSize.x = 22.5; - sensorSize.y = 15; - } - // - // check if sensor size ratio and image size fit together - double rsensor = (double)sensorSize.x / sensorSize.y; - double rimg = (double) width / height; - if ( (rsensor > 1 && rimg < 1) || (rsensor < 1 && rimg > 1) ) { - // image and sensor ratio do not match - // swap sensor sizes - float t; - t = sensorSize.y; - sensorSize.y = sensorSize.x; - sensorSize.x = t; - } - cropFactor = sqrt(36.0*36.0+24.0*24)/sqrt(sensorSize.x*sensorSize.x + sensorSize.y*sensorSize.y); - } - - if (exif.FocalLength > 0 && cropFactor > 0) { - // user provided crop factor - focalLength = exif.FocalLength; - } else if (exif.FocalLength35mm > 0 && exif.FocalLength > 0) { - cropFactor = exif.FocalLength35mm / exif.FocalLength; - focalLength = exif.FocalLength; - } else if (exif.FocalLength35mm > 0) { - // 35 mm equiv focal length available, crop factor unknown. - // do not ask for crop factor, assume 1. - cropFactor = 1; - focalLength = exif.FocalLength35mm; - } else if (exif.FocalLength > 0 && cropFactor <= 0) { - // need to redo, this time with crop - focalLength = exif.FocalLength; - cropFactor = 0; - } - } - } - - img.setExifFocalLength(focalLength); - img.setExifCropFactor(cropFactor); - img.setRoll(roll); - - - - if (focalLength > 0 && cropFactor > 0) { - img.setHFOV(calcHFOV(img.getProjection(), focalLength, cropFactor, img.getSize())); - return true; - } else { - return false; - } -} - -double PT::calcHFOV(SrcPanoImage::Projection proj, double fl, double crop, vigra::Size2D imageSize) -{ - // calculate diagonal of film - double d = sqrt(36.0*36.0 + 24.0*24.0) / crop; - double r = (double)imageSize.x / imageSize.y; - - // calculate the sensor width and height that fit the ratio - // the ratio is determined by the size of our image. - FDiff2D sensorSize; - sensorSize.x = d / sqrt(1 + 1/(r*r)); - sensorSize.y = sensorSize.x / r; - - double hfov = 360; - - switch (proj) { - case SrcPanoImage::RECTILINEAR: - hfov = 2*atan((sensorSize.x/2.0)/fl) * 180.0/M_PI; - break; - case SrcPanoImage::CIRCULAR_FISHEYE: - case SrcPanoImage::FULL_FRAME_FISHEYE: - hfov = sensorSize.x / fl * 180/M_PI; - break; - case SrcPanoImage::EQUIRECTANGULAR: - case SrcPanoImage::PANORAMIC: - hfov = (sensorSize.x / fl) / M_PI * 180; - break; - default: - hfov = 360; - // TODO: add formulas for other projections - DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images"); - } - return hfov; -} - -double PT::calcFocalLength(SrcPanoImage::Projection proj, double hfov, double crop, vigra::Size2D imageSize) -{ - // calculate diagonal of film - double d = sqrt(36.0*36.0 + 24.0*24.0) / crop; - double r = (double)imageSize.x / imageSize.y; - - // calculate the sensor width and height that fit the ratio - // the ratio is determined by the size of our image. - FDiff2D sensorSize; - sensorSize.x = d / sqrt(1 + 1/(r*r)); - sensorSize.y = sensorSize.x / r; - - switch (proj) -{ - case SrcPanoImage::RECTILINEAR: - return (sensorSize.x/2.0) / tan(hfov/180.0*M_PI/2); - break; - case SrcPanoImage::CIRCULAR_FISHEYE: - case SrcPanoImage::FULL_FRAME_FISHEYE: - // same projection equation for both fisheye types, - // assume equal area projection. - return sensorSize.x / (hfov/180*M_PI); - break; - case SrcPanoImage::EQUIRECTANGULAR: - case SrcPanoImage::PANORAMIC: - return (sensorSize.x / (hfov/180*M_PI)); - break; - default: - // TODO: add formulas for other projections - DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images"); - return 0; -} -} - -#if 0 -PanoImage::PanoImage(const std::string &filename) - : filename(filename) -{ - DEBUG_DEBUG("PanoImage ctor for " << filename); - init(); - readImageInformation(); -} -#endif - -void PanoImage::init() -{ - height = 0; - width = 0; -} - - -#if 0 PanoImage::PanoImage(QDomNode & node) { setFromXML(node); } -#endif - -PanoImage::~PanoImage() -{ - DEBUG_DEBUG("PanoImage dtor, image= " << filename); -} - -#if 0 void PanoImage::setFromXML(QDomNode & elem) { assert(elem.nodeName() == "image"); @@ -483,37 +152,3 @@ } #endif -/* -bool PanoImage::readImageInformation() -{ - std::string::size_type idx = filename.rfind('.'); - if (idx == std::string::npos) { - DEBUG_DEBUG("could not find extension in filename"); - return false; - } - std::string ext = filename.substr( idx+1 ); - - DEBUG_ERROR("readImageInformation should be set Image information"); - // this depends on wxWindow -// wxImage * image = ImageCache::getInstance().getImage(filename); -// width = image->GetWidth(); -// height = image->GetHeight(); - - - try { - // find another platform independant way to read the image info.. - Magick::Image img; - img.ping(filename.c_str()); - width = img.baseColumns(); - height = img.baseRows(); - } catch( Magick::Exception &e ) { - DEBUG_NOTICE("error while reading file information for " << filename - << ": " << e.what()); - return false; - } - -// isLandscape = (width > height); - return true; -} - -*/ Modified: hugin/branches/ippei/src/hugin_base/panodata/PanoImage.h =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/PanoImage.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/PanoImage.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -24,37 +24,35 @@ * */ -#ifndef PANOIMAGE_H -#define PANOIMAGE_H +#ifndef _PANODATA_PANOIMAGE_H +#define _PANODATA_PANOIMAGE_H #include <iostream> #include <vector> -#include <common/utils.h> -#include <common/math.h> #include <vigra/diff2d.hxx> -namespace PT { -class Panorama; +namespace HuginBase { /** optimization & stitching options. */ struct ImageOptions { ImageOptions() - : featherWidth(10), - ignoreFrameWidth(0), - morph(false), - docrop(false), - autoCenterCrop(true), - m_vigCorrMode(VIGCORR_RADIAL|VIGCORR_DIV), - responseType(0), - active(true) + : featherWidth(10), + ignoreFrameWidth(0), + morph(false), + docrop(false), + autoCenterCrop(true), + m_vigCorrMode(VIGCORR_RADIAL|VIGCORR_DIV), + responseType(0), + active(true) { }; - // PT state + /// u10 specify width of feather for stitching. default:10 unsigned int featherWidth; + /// m20 ignore a frame 20 pixels wide. default: 0 unsigned int ignoreFrameWidth; @@ -66,6 +64,7 @@ bool autoCenterCrop; vigra::Rect2D cropRect; + /// vignetting correction mode (bitflags, no real enum) enum VignettingCorrMode { VIGCORR_NONE = 0, ///< no vignetting correction @@ -73,9 +72,12 @@ VIGCORR_FLATFIELD = 2, ///< flatfield correction VIGCORR_DIV = 4 ///< correct by division. }; + int m_vigCorrMode; + // coefficients for vignetting correction (even degrees: 0,2,4,6, ...) std::string m_flatfield; + // the response type (Rt) int responseType; @@ -93,71 +95,77 @@ */ class PanoImage { -public: - PanoImage() - { - width=0; - height=0; - lensNr=0; - }; - PanoImage(const std::string &filename, int width,int height, - int lens); + public: + /// + PanoImage(); -// PanoImage(const std::string & filename); - // create from xml node -// PanoImage(QDomNode & node); + /// + PanoImage(const std::string &filename, int width, int height, int lens); - virtual ~PanoImage(); + /// +// PanoImage(const std::string & filename); + + /// create from xml node +// PanoImage(QDomNode & node); - virtual const char * isA() const { return "PanoImage"; }; + /// + virtual ~PanoImage(); + + + public: + /// + virtual const char* isA() const + { return "PanoImage"; }; + + + public: + /// + std::string getFilename() const + { return filename; } - std::string getFilename() const - { return filename; } + void setFilename(const std::string& fn) + { filename = fn; } - void setFilename(std::string fn) - { filename = fn; } + const ImageOptions& getOptions() const + { return options; } - const ImageOptions & getOptions() const - { return options; } + void setOptions(const ImageOptions & opt) + { options = opt; } - void setOptions(const ImageOptions & opt) - { options = opt; } + unsigned int getHeight() const + { return height; } + + unsigned int getWidth() const + { return width; } - unsigned int getHeight() const - { return height; } - unsigned int getWidth() const - { return width; } + void setLensNr(const unsigned int& l) + { lensNr = l; } + + unsigned int getLensNr() const + { return lensNr; } - void setLensNr(unsigned int l) - { lensNr = l; } - unsigned int getLensNr() const - { return lensNr; } + void setSize(const vigra::Size2D& sz) + { width =sz.x; height = sz.y; } - void setSize(const vigra::Size2D & sz) - { width =sz.x; height = sz.y; } + void setFeatherWidth(const unsigned int& w) + { options.featherWidth = w; } - void setFeatherWidth(unsigned int w) - { options.featherWidth = w; }; - -private: - /// common init for all constructors - void init(); - /// read image info (size, exif header) - bool readImageInformation(); - - // image properties needed by Panorama tools. - - std::string filename; - int height,width; - - bool imageRead; - ImageOptions options; - // the lens of this image - unsigned int lensNr; + + private: + // read image info (size, exif header) + // bool readImageInformation(); + // bool imageRead; + + // image properties needed by Panorama tools. + std::string filename; + int height; + int width; + unsigned int lensNr; // the lens of this image + ImageOptions options; }; } // namespace -#endif // PANOIMAGE_H +#endif // _H Modified: hugin/branches/ippei/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/Panorama.cpp 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/Panorama.cpp 2007-06-27 16:59:59 UTC (rev 2171) @@ -58,55 +58,8 @@ using namespace vigra; using namespace utils; -//const Map::data_type & map_get(const Map &m, const Map::key_type & key) -const PT::Variable & PT::const_map_get(const VariableMap &m, const string & key) -{ - VariableMap::const_iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} -// Map::data_type & map_get( Map &m, Map::key_type & key) -PT::Variable & PT::map_get( VariableMap &m, const std::string & key) -{ - VariableMap::iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} -// Map::data_type & map_get( Map &m, Map::key_type & key) -PT::LensVariable & PT::map_get(PT::LensVarMap &m, const std::string & key) -{ - LensVarMap::iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} - -// Map::data_type & map_get( Map &m, Map::key_type & key) -const PT::LensVariable & PT::const_map_get(const PT::LensVarMap &m, const std::string & key) -{ - LensVarMap::const_iterator it = m.find(key); - if (it != m.end()) { - return (*it).second; - } else { - DEBUG_WARN("could not find " << key); - throw std::out_of_range("No such element in vector"); - } -} - - /// helper functions for parsing of a script line bool PT::getPTParam(std::string & output, const std::string & line, const std::string & parameter) { Modified: hugin/branches/ippei/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/Panorama.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/Panorama.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -651,14 +651,7 @@ -// helper functions, workaround for gcc 3.3, which doesn't find -// the map_get template functions. -PT::LensVariable & map_get(PT::LensVarMap &m, const std::string & key); -const PT::LensVariable & const_map_get(const PT::LensVarMap &m, const std::string & key); -PT::Variable & map_get(PT::VariableMap &m, const std::string & key); -const PT::Variable & const_map_get(const PT::VariableMap &m, const std::string & key); - } // namespace Modified: hugin/branches/ippei/src/hugin_base/panodata/PanoramaData.h =================================================================== --- hugin/branches/ippei/src/hugin_base/panodata/PanoramaData.h 2007-06-27 16:52:26 UTC (rev 2170) +++ hugin/branches/ippei/src/hugin_base/panodata/PanoramaData.h 2007-06-27 16:59:59 UTC (rev 2171) @@ -26,24 +26,25 @@ #ifndef _PANORAMA_H #define _PANORAMA_H -#include "common/math.h" -#include "common/utils.h" #include <vector> #include <set> -#include <sstream> +#include <iostream> -#include "PT/PanoImage.h" -#include "PT/PanoramaMemento.h" +#include <hugin_math/Matrix3.h> +#include <panodata/PanoImage.h> +#include <panodata/PanoramaVariable.h> +#include <panodata/SrcPanoImage.h> +#include <panodata/ControlPoint.h> -class Matrix3; +namespace HuginBase { - -namespace PT { - +/// typedef std::set<unsigned int> UIntSet; + +/// typedef std::vector<unsigned int> UIntVector; @@ -81,27 +82,13 @@ * change even if the settings were the same, because of sloppy * mechanic or other random infuences. * - * - * Changes should be made through command objects, not with direct calls. - * - * @todo should the changer call the report() functions? - * - * @todo should we add constraints for the simple / advanced functionality - * to the model? I have to think a bit more about that issue. maybe the - * contraints can be factored out into another class that corrects - * then when updating. or we could have different models.. - * SimplePanorama and AdvancedPanorama. - * - * also, it is useful to use the memento pattern for the internal - * state, so that redo/undo for complex interactions can be - * implemented without too much pain. */ - class PanoramaData { public: + /// virtual ~PanoramaData(); @@ -110,7 +97,7 @@ * This returns a panorama that contains only the images specified by \imgs * Useful for operations on a subset of the panorama */ - virtual PanoramaData getSubset(const PT::UIntSet & imgs) const =0; + virtual PanoramaData getSubset(const UIntSet & imgs) const =0; /** duplicate the panorama * @@ -130,7 +117,7 @@ virtual std::size_t getNrOfImages() const =0; /// get a panorama image, counting starts with 0 - virtual const PanoImage & getImage(std::size_t nr) const =0; + virtual const PanoImage& getImage(std::size_t nr) const =0; /// set a panorama image, counting starts with 0 virtual void setImage(std::size_t nr, PanoImage img) =0; @@ -139,19 +126,19 @@ // virtual unsigned int getImageNr(const PanoImage * image) const =0; /** add an Image to the panorama - * - * The Image must be initialized, the Lens must exist. - * - */ - virtual unsigned int addImage(const PanoImage &img, const VariableMap &vars) =0; + * + * The Image must be initialized, the Lens must exist. + * + */ + virtual unsigned int addImage(const PanoImage& img, const VariableMap& vars) =0; /** creates an image, from filename, and a Lens, if needed */ virtual int addImageAndLens(const std::string & filename, double HFOV) =0; /** add an Image to the panorama - * @return image number - */ - // virtual unsigned int addImage(const std::string & filename) =0; + * @return image number + */ +// virtual unsigned int addImage(const std::string & filename) =0; /** remove an Image. * @@ -173,28 +160,28 @@ virtual void setSrcImage(unsigned int nr, const SrcPanoImage & img) =0; /** set a new image filename - * - * It is assumed that it is of the same size - * as the old image. - * - */ + * + * It is assumed that it is of the same size + * as the old image. + * + */ virtual void setImageFilename(unsigned int img, const std::string & fname) =0; /** change image properties. - */ + */ virtual void setImageOptions(unsigned int i, const ImageOptions & opts) =0; /** mark an image as active or inactive. - * - * This is only a flag, that can be turned on or off. - * If an image is marked active, then it should - * be used for optimizing and stitching. - * - * However, this is not done automatically. One has - * to use getActiveImages() to get the numbers of the - * active images, and pass these to the respective - * functions that do the stitching or optimisation - */ + * + * This is only a flag, that can be turned on or off. + * If an image is marked active, then it should + * be used for optimizing and stitching. + * + * However, this is not done automatically. One has + * to use getActiveImages() to get the numbers of the + * active images, and pass these to the respective + * functions that do the stitching or optimisation + */ void activateImage(unsigned int imgNr, bool active=true) =0; /** get active images */ @@ -222,15 +209,15 @@ virtual unsigned int addCtrlPoint(const ControlPoint & point) =0; /** remove a control point. - */ + */ virtual void removeCtrlPoint(unsigned int pNr) =0; /** change a control Point. - */ + */ virtual void changeControlPoint(unsigned int pNr, const ControlPoint & point) =0; /// get the number of a control point - // virtual unsigned int getCtrlPointNr(const ControlPoint * point) const =0; +// virtual unsigned int getCtrlPointNr(const ControlPoint * point) const =0; /** get the next unused line number for t3, ... control point creation */ virtual int getNextCPTypeLineNumber() const =0; @@ -240,19 +227,19 @@ /** update control points distances. - * - * updates control distances and position in final panorama - * usually used to set the changes from the optimization. - * The control points must be the same as in - */ + * + * updates control distances and position in final panorama + * usually used to set the changes from the optimization. + * The control points must be the same as in + */ virtual void updateCtrlPointErrors(const CPVector & controlPoints) =0; /** update control points for a subset of images. - * - * Usually, the control point subset is created using subset() - * The number and ordering and control points must not be changed - * between the call to subset() and this function. - */ + * + * Usually, the control point subset is created using subset() + * The number and ordering and control points must not be changed + * between the call to subset() and this function. + */ void updateCtrlPointErrors(const UIntSet & imgs, const CPVector & cps) =0; @@ -265,42 +252,40 @@ virtual const Lens & getLens(unsigned int lensNr) const =0; /** set a lens for this image. - * - * copies all lens variables into the image. - */ + * + * copies all lens variables into the image. + */ virtual void setLens(unsigned int imgNr, unsigned int lensNr) =0; - /** add a new lens. - * - */ + /** add a new lens.*/ virtual unsigned int addLens(const Lens & lens) =0; /** remove a lens - * - * it is only possible when it is not used by any image. - */ + * + * it is only possible when it is not used by any image. + */ virtual void removeLens(unsigned int lensNr) =0; /** remove unused lenses. - * - * some operations might create lenses that are not - * referenced by any image. This functions removes them. - * - */ + * + * some operations might create lenses that are not + * referenced by any image. This functions removes them. + * + */ virtual void removeUnusedLenses() =0; /** Change the variable for a single lens - * - * updates a lens variable, copies it into - * all images. - * - */ + * + * updates a lens variable, copies it into + * all images. + * + */ virtual void updateLensVariable(unsigned int lensNr, const LensVariable &var) =0; /** update a lens - * - * Changes the lens variables in all images of this lens. - */ + * + * Changes the lens variables in all images of this lens. + */ virtual void updateLens(unsigned int lensNr, const Lens & lens) =0; @@ -390,26 +375,27 @@ class PanoramaObserver { -public: - - virtual ~PanoramaObserver() - { }; - - /** Notification about a Panorama change. - * - * This function will always be called, even when the - * change could be handled by panoramaImageAdded() or - * other notify functions. - * - * This allows lazy observers to just listen to - * panoramaChanged(). - * - */ - virtual void panoramaChanged(PanoramaData &pano) - { DEBUG_DEBUG("Default panoramaChanged called"); }; - - /** notifies about changes to images + public: + + /// + virtual ~PanoramaObserver() + { }; + + /** Not... [truncated message content] |