| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | 
							- /*M///////////////////////////////////////////////////////////////////////////////////////
 
- //
 
- //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
 
- //
 
- //  By downloading, copying, installing or using the software you agree to this license.
 
- //  If you do not agree to this license, do not download, install,
 
- //  copy or use the software.
 
- //
 
- // Copyright (C) 2013, Alfonso Sanchez-Beato, all rights reserved.
 
- // Third party copyrights are property of their respective owners.
 
- //
 
- // Redistribution and use in source and binary forms, with or without modification,
 
- // are permitted provided that the following conditions are met:
 
- //
 
- //   * Redistribution's of source code must retain the above copyright notice,
 
- //     this list of conditions and the following disclaimer.
 
- //
 
- //   * Redistribution's in binary form must reproduce the above copyright notice,
 
- //     this list of conditions and the following disclaimer in the documentation
 
- //     and/or other materials provided with the distribution.
 
- //
 
- //   * The name of the copyright holders may not be used to endorse or promote products
 
- //     derived from this software without specific prior written permission.
 
- //
 
- // This software is provided by the copyright holders and contributors "as is" and
 
- // any express or implied warranties, including, but not limited to, the implied
 
- // warranties of merchantability and fitness for a particular purpose are disclaimed.
 
- // In no event shall the contributors be liable for any direct,
 
- // indirect, incidental, special, exemplary, or consequential damages
 
- // (including, but not limited to, procurement of substitute goods or services;
 
- // loss of use, data, or profits; or business interruption) however caused
 
- // and on any theory of liability, whether in contract, strict liability,
 
- // or tort (including negligence or otherwise) arising in any way out of
 
- // the use of this software, even if advised of the possibility of such damage.
 
- //
 
- //M*/
 
- #ifndef MAP_H_
 
- #define MAP_H_
 
- #include <opencv2/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
 
- /** @defgroup reg Image Registration
 
- The Registration module implements parametric image registration. The implemented method is direct
 
- alignment, that is, it uses directly the pixel values for calculating the registration between a
 
- pair of images, as opposed to feature-based registration. The implementation follows essentially the
 
- corresponding part of @cite Szeliski06 .
 
- Feature based methods have some advantages over pixel based methods when we are trying to register
 
- pictures that have been shoot under different lighting conditions or exposition times, or when the
 
- images overlap only partially. On the other hand, the main advantage of pixel-based methods when
 
- compared to feature based methods is their better precision for some pictures (those shoot under
 
- similar lighting conditions and that have a significative overlap), due to the fact that we are
 
- using all the information available in the image, which allows us to achieve subpixel accuracy. This
 
- is particularly important for certain applications like multi-frame denoising or super-resolution.
 
- In fact, pixel and feature registration methods can complement each other: an application could
 
- first obtain a coarse registration using features and then refine the registration using a pixel
 
- based method on the overlapping area of the images. The code developed allows this use case.
 
- The module implements classes derived from the abstract classes cv::reg::Map or cv::reg::Mapper. The
 
- former models a coordinate transformation between two reference frames, while the later encapsulates
 
- a way of invoking a method that calculates a Map between two images. Although the objective has been
 
- to implement pixel based methods, the module can be extended to support other methods that can
 
- calculate transformations between images (feature methods, optical flow, etc.).
 
- Each class derived from Map implements a motion model, as follows:
 
- -   MapShift: Models a simple translation
 
- -   MapAffine: Models an affine transformation
 
- -   MapProjec: Models a projective transformation
 
- MapProject can also be used to model affine motion or translations, but some operations on it are
 
- more costly, and that is the reason for defining the other two classes.
 
- The classes derived from Mapper are
 
- -   MapperGradShift: Gradient based alignment for calculating translations. It produces a MapShift
 
-     (two parameters that correspond to the shift vector).
 
- -   MapperGradEuclid: Gradient based alignment for euclidean motions, that is, rotations and
 
-     translations. It calculates three parameters (angle and shift vector), although the result is
 
-     stored in a MapAffine object for convenience.
 
- -   MapperGradSimilar: Gradient based alignment for calculating similarities, which adds scaling to
 
-     the euclidean motion. It calculates four parameters (two for the anti-symmetric matrix and two
 
-     for the shift vector), although the result is stored in a MapAffine object for better
 
-     convenience.
 
- -   MapperGradAffine: Gradient based alignment for an affine motion model. The number of parameters
 
-     is six and the result is stored in a MapAffine object.
 
- -   MapperGradProj: Gradient based alignment for calculating projective transformations. The number
 
-     of parameters is eight and the result is stored in a MapProject object.
 
- -   MapperPyramid: It implements hyerarchical motion estimation using a Gaussian pyramid. Its
 
-     constructor accepts as argument any other object that implements the Mapper interface, and it is
 
-     that mapper the one called by MapperPyramid for each scale of the pyramid.
 
- If the motion between the images is not very small, the normal way of using these classes is to
 
- create a MapperGrad\* object and use it as input to create a MapperPyramid, which in turn is called
 
- to perform the calculation. However, if the motion between the images is small enough, we can use
 
- directly the MapperGrad\* classes. Another possibility is to use first a feature based method to
 
- perform a coarse registration and then do a refinement through MapperPyramid or directly a
 
- MapperGrad\* object. The "calculate" method of the mappers accepts an initial estimation of the
 
- motion as input.
 
- When deciding which MapperGrad to use we must take into account that mappers with more parameters
 
- can handle more complex motions, but involve more calculations and are therefore slower. Also, if we
 
- are confident on the motion model that is followed by the sequence, increasing the number of
 
- parameters beyond what we need will decrease the accuracy: it is better to use the least number of
 
- degrees of freedom that we can.
 
- In the module tests there are examples that show how to register a pair of images using any of the
 
- implemented mappers.
 
- */
 
- namespace cv {
 
- namespace reg {
 
- //! @addtogroup reg
 
- //! @{
 
- /** @brief Base class for modelling a Map between two images.
 
- The class is only used to define the common interface for any possible map.
 
-  */
 
- class CV_EXPORTS_W Map
 
- {
 
- public:
 
-     /*!
 
-      * Virtual destructor
 
-      */
 
-     virtual ~Map();
 
-     /*!
 
-      * Warps image to a new coordinate frame. The calculation is img2(x)=img1(T^{-1}(x)), as we
 
-      * have to apply the inverse transformation to the points to move them to were the values
 
-      * of img2 are.
 
-      * \param[in] img1 Original image
 
-      * \param[out] img2 Warped image
 
-      */
 
-     CV_WRAP virtual void warp(InputArray img1, OutputArray img2) const;
 
-     /*!
 
-      * Warps image to a new coordinate frame. The calculation is img2(x)=img1(T(x)), so in fact
 
-      * this is the inverse warping as we are taking the value of img1 with the forward
 
-      * transformation of the points.
 
-      * \param[in] img1 Original image
 
-      * \param[out] img2 Warped image
 
-      */
 
-     CV_WRAP virtual void inverseWarp(InputArray img1, OutputArray img2) const = 0;
 
-     /*!
 
-      * Calculates the inverse map
 
-      * \return Inverse map
 
-      */
 
-     CV_WRAP virtual cv::Ptr<Map> inverseMap() const = 0;
 
-     /*!
 
-      * Changes the map composing the current transformation with the one provided in the call.
 
-      * The order is first the current transformation, then the input argument.
 
-      * \param[in] map Transformation to compose with.
 
-      */
 
-     CV_WRAP virtual void compose(cv::Ptr<Map> map) = 0;
 
-     /*!
 
-      * Scales the map by a given factor as if the coordinates system is expanded/compressed
 
-      * by that factor.
 
-      * \param[in] factor Expansion if bigger than one, compression if smaller than one
 
-      */
 
-     CV_WRAP virtual void scale(double factor) = 0;
 
- };
 
- //! @}
 
- }}  // namespace cv::reg
 
- #endif  // MAP_H_
 
 
  |