Home | History | Annotate | Download | only in core
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                          License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
     16 // Third party copyrights are property of their respective owners.
     17 //
     18 // Redistribution and use in source and binary forms, with or without modification,
     19 // are permitted provided that the following conditions are met:
     20 //
     21 //   * Redistribution's of source code must retain the above copyright notice,
     22 //     this list of conditions and the following disclaimer.
     23 //
     24 //   * Redistribution's in binary form must reproduce the above copyright notice,
     25 //     this list of conditions and the following disclaimer in the documentation
     26 //     and/or other materials provided with the distribution.
     27 //
     28 //   * The name of the copyright holders may not be used to endorse or promote products
     29 //     derived from this software without specific prior written permission.
     30 //
     31 // This software is provided by the copyright holders and contributors "as is" and
     32 // any express or implied warranties, including, but not limited to, the implied
     33 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     34 // In no event shall the Intel Corporation or contributors be liable for any direct,
     35 // indirect, incidental, special, exemplary, or consequential damages
     36 // (including, but not limited to, procurement of substitute goods or services;
     37 // loss of use, data, or profits; or business interruption) however caused
     38 // and on any theory of liability, whether in contract, strict liability,
     39 // or tort (including negligence or otherwise) arising in any way out of
     40 // the use of this software, even if advised of the possibility of such damage.
     41 //
     42 //M*/
     43 
     44 #ifndef __OPENCV_CORE_TYPES_HPP__
     45 #define __OPENCV_CORE_TYPES_HPP__
     46 
     47 #ifndef __cplusplus
     48 #  error types.hpp header must be compiled as C++
     49 #endif
     50 
     51 #include <climits>
     52 #include <cfloat>
     53 #include <vector>
     54 
     55 #include "opencv2/core/cvdef.h"
     56 #include "opencv2/core/cvstd.hpp"
     57 #include "opencv2/core/matx.hpp"
     58 
     59 namespace cv
     60 {
     61 
     62 //! @addtogroup core_basic
     63 //! @{
     64 
     65 //////////////////////////////// Complex //////////////////////////////
     66 
     67 /** @brief  A complex number class.
     68 
     69   The template class is similar and compatible with std::complex, however it provides slightly
     70   more convenient access to the real and imaginary parts using through the simple field access, as opposite
     71   to std::complex::real() and std::complex::imag().
     72 */
     73 template<typename _Tp> class Complex
     74 {
     75 public:
     76 
     77     //! constructors
     78     Complex();
     79     Complex( _Tp _re, _Tp _im = 0 );
     80 
     81     //! conversion to another data type
     82     template<typename T2> operator Complex<T2>() const;
     83     //! conjugation
     84     Complex conj() const;
     85 
     86     _Tp re, im; //< the real and the imaginary parts
     87 };
     88 
     89 typedef Complex<float> Complexf;
     90 typedef Complex<double> Complexd;
     91 
     92 template<typename _Tp> class DataType< Complex<_Tp> >
     93 {
     94 public:
     95     typedef Complex<_Tp> value_type;
     96     typedef value_type   work_type;
     97     typedef _Tp          channel_type;
     98 
     99     enum { generic_type = 0,
    100            depth        = DataType<channel_type>::depth,
    101            channels     = 2,
    102            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    103            type         = CV_MAKETYPE(depth, channels) };
    104 
    105     typedef Vec<channel_type, channels> vec_type;
    106 };
    107 
    108 
    109 
    110 //////////////////////////////// Point_ ////////////////////////////////
    111 
    112 /** @brief Template class for 2D points specified by its coordinates `x` and `y`.
    113 
    114 An instance of the class is interchangeable with C structures, CvPoint and CvPoint2D32f . There is
    115 also a cast operator to convert point coordinates to the specified type. The conversion from
    116 floating-point coordinates to integer coordinates is done by rounding. Commonly, the conversion
    117 uses this operation for each of the coordinates. Besides the class members listed in the
    118 declaration above, the following operations on points are implemented:
    119 @code
    120     pt1 = pt2 + pt3;
    121     pt1 = pt2 - pt3;
    122     pt1 = pt2 * a;
    123     pt1 = a * pt2;
    124     pt1 = pt2 / a;
    125     pt1 += pt2;
    126     pt1 -= pt2;
    127     pt1 *= a;
    128     pt1 /= a;
    129     double value = norm(pt); // L2 norm
    130     pt1 == pt2;
    131     pt1 != pt2;
    132 @endcode
    133 For your convenience, the following type aliases are defined:
    134 @code
    135     typedef Point_<int> Point2i;
    136     typedef Point2i Point;
    137     typedef Point_<float> Point2f;
    138     typedef Point_<double> Point2d;
    139 @endcode
    140 Example:
    141 @code
    142     Point2f a(0.3f, 0.f), b(0.f, 0.4f);
    143     Point pt = (a + b)*10.f;
    144     cout << pt.x << ", " << pt.y << endl;
    145 @endcode
    146 */
    147 template<typename _Tp> class Point_
    148 {
    149 public:
    150     typedef _Tp value_type;
    151 
    152     // various constructors
    153     Point_();
    154     Point_(_Tp _x, _Tp _y);
    155     Point_(const Point_& pt);
    156     Point_(const Size_<_Tp>& sz);
    157     Point_(const Vec<_Tp, 2>& v);
    158 
    159     Point_& operator = (const Point_& pt);
    160     //! conversion to another data type
    161     template<typename _Tp2> operator Point_<_Tp2>() const;
    162 
    163     //! conversion to the old-style C structures
    164     operator Vec<_Tp, 2>() const;
    165 
    166     //! dot product
    167     _Tp dot(const Point_& pt) const;
    168     //! dot product computed in double-precision arithmetics
    169     double ddot(const Point_& pt) const;
    170     //! cross-product
    171     double cross(const Point_& pt) const;
    172     //! checks whether the point is inside the specified rectangle
    173     bool inside(const Rect_<_Tp>& r) const;
    174 
    175     _Tp x, y; //< the point coordinates
    176 };
    177 
    178 typedef Point_<int> Point2i;
    179 typedef Point_<float> Point2f;
    180 typedef Point_<double> Point2d;
    181 typedef Point2i Point;
    182 
    183 template<typename _Tp> class DataType< Point_<_Tp> >
    184 {
    185 public:
    186     typedef Point_<_Tp>                               value_type;
    187     typedef Point_<typename DataType<_Tp>::work_type> work_type;
    188     typedef _Tp                                       channel_type;
    189 
    190     enum { generic_type = 0,
    191            depth        = DataType<channel_type>::depth,
    192            channels     = 2,
    193            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    194            type         = CV_MAKETYPE(depth, channels)
    195          };
    196 
    197     typedef Vec<channel_type, channels> vec_type;
    198 };
    199 
    200 
    201 
    202 //////////////////////////////// Point3_ ////////////////////////////////
    203 
    204 /** @brief Template class for 3D points specified by its coordinates `x`, `y` and `z`.
    205 
    206 An instance of the class is interchangeable with the C structure CvPoint2D32f . Similarly to
    207 Point_ , the coordinates of 3D points can be converted to another type. The vector arithmetic and
    208 comparison operations are also supported.
    209 
    210 The following Point3_\<\> aliases are available:
    211 @code
    212     typedef Point3_<int> Point3i;
    213     typedef Point3_<float> Point3f;
    214     typedef Point3_<double> Point3d;
    215 @endcode
    216 @see cv::Point3i, cv::Point3f and cv::Point3d
    217 */
    218 template<typename _Tp> class Point3_
    219 {
    220 public:
    221     typedef _Tp value_type;
    222 
    223     // various constructors
    224     Point3_();
    225     Point3_(_Tp _x, _Tp _y, _Tp _z);
    226     Point3_(const Point3_& pt);
    227     explicit Point3_(const Point_<_Tp>& pt);
    228     Point3_(const Vec<_Tp, 3>& v);
    229 
    230     Point3_& operator = (const Point3_& pt);
    231     //! conversion to another data type
    232     template<typename _Tp2> operator Point3_<_Tp2>() const;
    233     //! conversion to cv::Vec<>
    234     operator Vec<_Tp, 3>() const;
    235 
    236     //! dot product
    237     _Tp dot(const Point3_& pt) const;
    238     //! dot product computed in double-precision arithmetics
    239     double ddot(const Point3_& pt) const;
    240     //! cross product of the 2 3D points
    241     Point3_ cross(const Point3_& pt) const;
    242 
    243     _Tp x, y, z; //< the point coordinates
    244 };
    245 
    246 typedef Point3_<int> Point3i;
    247 typedef Point3_<float> Point3f;
    248 typedef Point3_<double> Point3d;
    249 
    250 template<typename _Tp> class DataType< Point3_<_Tp> >
    251 {
    252 public:
    253     typedef Point3_<_Tp>                               value_type;
    254     typedef Point3_<typename DataType<_Tp>::work_type> work_type;
    255     typedef _Tp                                        channel_type;
    256 
    257     enum { generic_type = 0,
    258            depth        = DataType<channel_type>::depth,
    259            channels     = 3,
    260            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    261            type         = CV_MAKETYPE(depth, channels)
    262          };
    263 
    264     typedef Vec<channel_type, channels> vec_type;
    265 };
    266 
    267 
    268 
    269 //////////////////////////////// Size_ ////////////////////////////////
    270 
    271 /** @brief Template class for specifying the size of an image or rectangle.
    272 
    273 The class includes two members called width and height. The structure can be converted to and from
    274 the old OpenCV structures CvSize and CvSize2D32f . The same set of arithmetic and comparison
    275 operations as for Point_ is available.
    276 
    277 OpenCV defines the following Size_\<\> aliases:
    278 @code
    279     typedef Size_<int> Size2i;
    280     typedef Size2i Size;
    281     typedef Size_<float> Size2f;
    282 @endcode
    283 */
    284 template<typename _Tp> class Size_
    285 {
    286 public:
    287     typedef _Tp value_type;
    288 
    289     //! various constructors
    290     Size_();
    291     Size_(_Tp _width, _Tp _height);
    292     Size_(const Size_& sz);
    293     Size_(const Point_<_Tp>& pt);
    294 
    295     Size_& operator = (const Size_& sz);
    296     //! the area (width*height)
    297     _Tp area() const;
    298 
    299     //! conversion of another data type.
    300     template<typename _Tp2> operator Size_<_Tp2>() const;
    301 
    302     _Tp width, height; // the width and the height
    303 };
    304 
    305 typedef Size_<int> Size2i;
    306 typedef Size_<float> Size2f;
    307 typedef Size_<double> Size2d;
    308 typedef Size2i Size;
    309 
    310 template<typename _Tp> class DataType< Size_<_Tp> >
    311 {
    312 public:
    313     typedef Size_<_Tp>                               value_type;
    314     typedef Size_<typename DataType<_Tp>::work_type> work_type;
    315     typedef _Tp                                      channel_type;
    316 
    317     enum { generic_type = 0,
    318            depth        = DataType<channel_type>::depth,
    319            channels     = 2,
    320            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    321            type         = CV_MAKETYPE(depth, channels)
    322          };
    323 
    324     typedef Vec<channel_type, channels> vec_type;
    325 };
    326 
    327 
    328 
    329 //////////////////////////////// Rect_ ////////////////////////////////
    330 
    331 /** @brief Template class for 2D rectangles
    332 
    333 described by the following parameters:
    334 -   Coordinates of the top-left corner. This is a default interpretation of Rect_::x and Rect_::y
    335     in OpenCV. Though, in your algorithms you may count x and y from the bottom-left corner.
    336 -   Rectangle width and height.
    337 
    338 OpenCV typically assumes that the top and left boundary of the rectangle are inclusive, while the
    339 right and bottom boundaries are not. For example, the method Rect_::contains returns true if
    340 
    341 \f[x  \leq pt.x < x+width,
    342       y  \leq pt.y < y+height\f]
    343 
    344 Virtually every loop over an image ROI in OpenCV (where ROI is specified by Rect_\<int\> ) is
    345 implemented as:
    346 @code
    347     for(int y = roi.y; y < roi.y + roi.height; y++)
    348         for(int x = roi.x; x < roi.x + roi.width; x++)
    349         {
    350             // ...
    351         }
    352 @endcode
    353 In addition to the class members, the following operations on rectangles are implemented:
    354 -   \f$\texttt{rect} = \texttt{rect} \pm \texttt{point}\f$ (shifting a rectangle by a certain offset)
    355 -   \f$\texttt{rect} = \texttt{rect} \pm \texttt{size}\f$ (expanding or shrinking a rectangle by a
    356     certain amount)
    357 -   rect += point, rect -= point, rect += size, rect -= size (augmenting operations)
    358 -   rect = rect1 & rect2 (rectangle intersection)
    359 -   rect = rect1 | rect2 (minimum area rectangle containing rect1 and rect2 )
    360 -   rect &= rect1, rect |= rect1 (and the corresponding augmenting operations)
    361 -   rect == rect1, rect != rect1 (rectangle comparison)
    362 
    363 This is an example how the partial ordering on rectangles can be established (rect1 \f$\subseteq\f$
    364 rect2):
    365 @code
    366     template<typename _Tp> inline bool
    367     operator <= (const Rect_<_Tp>& r1, const Rect_<_Tp>& r2)
    368     {
    369         return (r1 & r2) == r1;
    370     }
    371 @endcode
    372 For your convenience, the Rect_\<\> alias is available: cv::Rect
    373 */
    374 template<typename _Tp> class Rect_
    375 {
    376 public:
    377     typedef _Tp value_type;
    378 
    379     //! various constructors
    380     Rect_();
    381     Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
    382     Rect_(const Rect_& r);
    383     Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
    384     Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);
    385 
    386     Rect_& operator = ( const Rect_& r );
    387     //! the top-left corner
    388     Point_<_Tp> tl() const;
    389     //! the bottom-right corner
    390     Point_<_Tp> br() const;
    391 
    392     //! size (width, height) of the rectangle
    393     Size_<_Tp> size() const;
    394     //! area (width*height) of the rectangle
    395     _Tp area() const;
    396 
    397     //! conversion to another data type
    398     template<typename _Tp2> operator Rect_<_Tp2>() const;
    399 
    400     //! checks whether the rectangle contains the point
    401     bool contains(const Point_<_Tp>& pt) const;
    402 
    403     _Tp x, y, width, height; //< the top-left corner, as well as width and height of the rectangle
    404 };
    405 
    406 typedef Rect_<int> Rect2i;
    407 typedef Rect_<float> Rect2f;
    408 typedef Rect_<double> Rect2d;
    409 typedef Rect2i Rect;
    410 
    411 template<typename _Tp> class DataType< Rect_<_Tp> >
    412 {
    413 public:
    414     typedef Rect_<_Tp>                               value_type;
    415     typedef Rect_<typename DataType<_Tp>::work_type> work_type;
    416     typedef _Tp                                      channel_type;
    417 
    418     enum { generic_type = 0,
    419            depth        = DataType<channel_type>::depth,
    420            channels     = 4,
    421            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    422            type         = CV_MAKETYPE(depth, channels)
    423          };
    424 
    425     typedef Vec<channel_type, channels> vec_type;
    426 };
    427 
    428 
    429 
    430 ///////////////////////////// RotatedRect /////////////////////////////
    431 
    432 /** @brief The class represents rotated (i.e. not up-right) rectangles on a plane.
    433 
    434 Each rectangle is specified by the center point (mass center), length of each side (represented by
    435 cv::Size2f structure) and the rotation angle in degrees.
    436 
    437 The sample below demonstrates how to use RotatedRect:
    438 @code
    439     Mat image(200, 200, CV_8UC3, Scalar(0));
    440     RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30);
    441 
    442     Point2f vertices[4];
    443     rRect.points(vertices);
    444     for (int i = 0; i < 4; i++)
    445         line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));
    446 
    447     Rect brect = rRect.boundingRect();
    448     rectangle(image, brect, Scalar(255,0,0));
    449 
    450     imshow("rectangles", image);
    451     waitKey(0);
    452 @endcode
    453 ![image](pics/rotatedrect.png)
    454 
    455 @sa CamShift, fitEllipse, minAreaRect, CvBox2D
    456 */
    457 class CV_EXPORTS RotatedRect
    458 {
    459 public:
    460     //! various constructors
    461     RotatedRect();
    462     /**
    463     @param center The rectangle mass center.
    464     @param size Width and height of the rectangle.
    465     @param angle The rotation angle in a clockwise direction. When the angle is 0, 90, 180, 270 etc.,
    466     the rectangle becomes an up-right rectangle.
    467     */
    468     RotatedRect(const Point2f& center, const Size2f& size, float angle);
    469     /**
    470     Any 3 end points of the RotatedRect. They must be given in order (either clockwise or
    471     anticlockwise).
    472      */
    473     RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);
    474 
    475     /** returns 4 vertices of the rectangle
    476     @param pts The points array for storing rectangle vertices.
    477     */
    478     void points(Point2f pts[]) const;
    479     //! returns the minimal up-right rectangle containing the rotated rectangle
    480     Rect boundingRect() const;
    481 
    482     Point2f center; //< the rectangle mass center
    483     Size2f size;    //< width and height of the rectangle
    484     float angle;    //< the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle.
    485 };
    486 
    487 template<> class DataType< RotatedRect >
    488 {
    489 public:
    490     typedef RotatedRect  value_type;
    491     typedef value_type   work_type;
    492     typedef float        channel_type;
    493 
    494     enum { generic_type = 0,
    495            depth        = DataType<channel_type>::depth,
    496            channels     = (int)sizeof(value_type)/sizeof(channel_type), // 5
    497            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    498            type         = CV_MAKETYPE(depth, channels)
    499          };
    500 
    501     typedef Vec<channel_type, channels> vec_type;
    502 };
    503 
    504 
    505 
    506 //////////////////////////////// Range /////////////////////////////////
    507 
    508 /** @brief Template class specifying a continuous subsequence (slice) of a sequence.
    509 
    510 The class is used to specify a row or a column span in a matrix ( Mat ) and for many other purposes.
    511 Range(a,b) is basically the same as a:b in Matlab or a..b in Python. As in Python, start is an
    512 inclusive left boundary of the range and end is an exclusive right boundary of the range. Such a
    513 half-opened interval is usually denoted as \f$[start,end)\f$ .
    514 
    515 The static method Range::all() returns a special variable that means "the whole sequence" or "the
    516 whole range", just like " : " in Matlab or " ... " in Python. All the methods and functions in
    517 OpenCV that take Range support this special Range::all() value. But, of course, in case of your own
    518 custom processing, you will probably have to check and handle it explicitly:
    519 @code
    520     void my_function(..., const Range& r, ....)
    521     {
    522         if(r == Range::all()) {
    523             // process all the data
    524         }
    525         else {
    526             // process [r.start, r.end)
    527         }
    528     }
    529 @endcode
    530 */
    531 class CV_EXPORTS Range
    532 {
    533 public:
    534     Range();
    535     Range(int _start, int _end);
    536     int size() const;
    537     bool empty() const;
    538     static Range all();
    539 
    540     int start, end;
    541 };
    542 
    543 template<> class DataType<Range>
    544 {
    545 public:
    546     typedef Range      value_type;
    547     typedef value_type work_type;
    548     typedef int        channel_type;
    549 
    550     enum { generic_type = 0,
    551            depth        = DataType<channel_type>::depth,
    552            channels     = 2,
    553            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    554            type         = CV_MAKETYPE(depth, channels)
    555          };
    556 
    557     typedef Vec<channel_type, channels> vec_type;
    558 };
    559 
    560 
    561 
    562 //////////////////////////////// Scalar_ ///////////////////////////////
    563 
    564 /** @brief Template class for a 4-element vector derived from Vec.
    565 
    566 Being derived from Vec\<_Tp, 4\> , Scalar_ and Scalar can be used just as typical 4-element
    567 vectors. In addition, they can be converted to/from CvScalar . The type Scalar is widely used in
    568 OpenCV to pass pixel values.
    569 */
    570 template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
    571 {
    572 public:
    573     //! various constructors
    574     Scalar_();
    575     Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);
    576     Scalar_(_Tp v0);
    577 
    578     template<typename _Tp2, int cn>
    579     Scalar_(const Vec<_Tp2, cn>& v);
    580 
    581     //! returns a scalar with all elements set to v0
    582     static Scalar_<_Tp> all(_Tp v0);
    583 
    584     //! conversion to another data type
    585     template<typename T2> operator Scalar_<T2>() const;
    586 
    587     //! per-element product
    588     Scalar_<_Tp> mul(const Scalar_<_Tp>& a, double scale=1 ) const;
    589 
    590     // returns (v0, -v1, -v2, -v3)
    591     Scalar_<_Tp> conj() const;
    592 
    593     // returns true iff v1 == v2 == v3 == 0
    594     bool isReal() const;
    595 };
    596 
    597 typedef Scalar_<double> Scalar;
    598 
    599 template<typename _Tp> class DataType< Scalar_<_Tp> >
    600 {
    601 public:
    602     typedef Scalar_<_Tp>                               value_type;
    603     typedef Scalar_<typename DataType<_Tp>::work_type> work_type;
    604     typedef _Tp                                        channel_type;
    605 
    606     enum { generic_type = 0,
    607            depth        = DataType<channel_type>::depth,
    608            channels     = 4,
    609            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    610            type         = CV_MAKETYPE(depth, channels)
    611          };
    612 
    613     typedef Vec<channel_type, channels> vec_type;
    614 };
    615 
    616 
    617 
    618 /////////////////////////////// KeyPoint ////////////////////////////////
    619 
    620 /** @brief Data structure for salient point detectors.
    621 
    622 The class instance stores a keypoint, i.e. a point feature found by one of many available keypoint
    623 detectors, such as Harris corner detector, cv::FAST, cv::StarDetector, cv::SURF, cv::SIFT,
    624 cv::LDetector etc.
    625 
    626 The keypoint is characterized by the 2D position, scale (proportional to the diameter of the
    627 neighborhood that needs to be taken into account), orientation and some other parameters. The
    628 keypoint neighborhood is then analyzed by another algorithm that builds a descriptor (usually
    629 represented as a feature vector). The keypoints representing the same object in different images
    630 can then be matched using cv::KDTree or another method.
    631 */
    632 class CV_EXPORTS_W_SIMPLE KeyPoint
    633 {
    634 public:
    635     //! the default constructor
    636     CV_WRAP KeyPoint();
    637     /**
    638     @param _pt x & y coordinates of the keypoint
    639     @param _size keypoint diameter
    640     @param _angle keypoint orientation
    641     @param _response keypoint detector response on the keypoint (that is, strength of the keypoint)
    642     @param _octave pyramid octave in which the keypoint has been detected
    643     @param _class_id object id
    644      */
    645     KeyPoint(Point2f _pt, float _size, float _angle=-1, float _response=0, int _octave=0, int _class_id=-1);
    646     /**
    647     @param x x-coordinate of the keypoint
    648     @param y y-coordinate of the keypoint
    649     @param _size keypoint diameter
    650     @param _angle keypoint orientation
    651     @param _response keypoint detector response on the keypoint (that is, strength of the keypoint)
    652     @param _octave pyramid octave in which the keypoint has been detected
    653     @param _class_id object id
    654      */
    655     CV_WRAP KeyPoint(float x, float y, float _size, float _angle=-1, float _response=0, int _octave=0, int _class_id=-1);
    656 
    657     size_t hash() const;
    658 
    659     /**
    660     This method converts vector of keypoints to vector of points or the reverse, where each keypoint is
    661     assigned the same size and the same orientation.
    662 
    663     @param keypoints Keypoints obtained from any feature detection algorithm like SIFT/SURF/ORB
    664     @param points2f Array of (x,y) coordinates of each keypoint
    665     @param keypointIndexes Array of indexes of keypoints to be converted to points. (Acts like a mask to
    666     convert only specified keypoints)
    667     */
    668     CV_WRAP static void convert(const std::vector<KeyPoint>& keypoints,
    669                                 CV_OUT std::vector<Point2f>& points2f,
    670                                 const std::vector<int>& keypointIndexes=std::vector<int>());
    671     /** @overload
    672     @param points2f Array of (x,y) coordinates of each keypoint
    673     @param keypoints Keypoints obtained from any feature detection algorithm like SIFT/SURF/ORB
    674     @param size keypoint diameter
    675     @param response keypoint detector response on the keypoint (that is, strength of the keypoint)
    676     @param octave pyramid octave in which the keypoint has been detected
    677     @param class_id object id
    678     */
    679     CV_WRAP static void convert(const std::vector<Point2f>& points2f,
    680                                 CV_OUT std::vector<KeyPoint>& keypoints,
    681                                 float size=1, float response=1, int octave=0, int class_id=-1);
    682 
    683     /**
    684     This method computes overlap for pair of keypoints. Overlap is the ratio between area of keypoint
    685     regions' intersection and area of keypoint regions' union (considering keypoint region as circle).
    686     If they don't overlap, we get zero. If they coincide at same location with same size, we get 1.
    687     @param kp1 First keypoint
    688     @param kp2 Second keypoint
    689     */
    690     CV_WRAP static float overlap(const KeyPoint& kp1, const KeyPoint& kp2);
    691 
    692     CV_PROP_RW Point2f pt; //!< coordinates of the keypoints
    693     CV_PROP_RW float size; //!< diameter of the meaningful keypoint neighborhood
    694     CV_PROP_RW float angle; //!< computed orientation of the keypoint (-1 if not applicable);
    695                             //!< it's in [0,360) degrees and measured relative to
    696                             //!< image coordinate system, ie in clockwise.
    697     CV_PROP_RW float response; //!< the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling
    698     CV_PROP_RW int octave; //!< octave (pyramid layer) from which the keypoint has been extracted
    699     CV_PROP_RW int class_id; //!< object class (if the keypoints need to be clustered by an object they belong to)
    700 };
    701 
    702 template<> class DataType<KeyPoint>
    703 {
    704 public:
    705     typedef KeyPoint      value_type;
    706     typedef float         work_type;
    707     typedef float         channel_type;
    708 
    709     enum { generic_type = 0,
    710            depth        = DataType<channel_type>::depth,
    711            channels     = (int)(sizeof(value_type)/sizeof(channel_type)), // 7
    712            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    713            type         = CV_MAKETYPE(depth, channels)
    714          };
    715 
    716     typedef Vec<channel_type, channels> vec_type;
    717 };
    718 
    719 
    720 
    721 //////////////////////////////// DMatch /////////////////////////////////
    722 
    723 /** @brief Class for matching keypoint descriptors
    724 
    725 query descriptor index, train descriptor index, train image index, and distance between
    726 descriptors.
    727 */
    728 class CV_EXPORTS_W_SIMPLE DMatch
    729 {
    730 public:
    731     CV_WRAP DMatch();
    732     CV_WRAP DMatch(int _queryIdx, int _trainIdx, float _distance);
    733     CV_WRAP DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance);
    734 
    735     CV_PROP_RW int queryIdx; // query descriptor index
    736     CV_PROP_RW int trainIdx; // train descriptor index
    737     CV_PROP_RW int imgIdx;   // train image index
    738 
    739     CV_PROP_RW float distance;
    740 
    741     // less is better
    742     bool operator<(const DMatch &m) const;
    743 };
    744 
    745 template<> class DataType<DMatch>
    746 {
    747 public:
    748     typedef DMatch      value_type;
    749     typedef int         work_type;
    750     typedef int         channel_type;
    751 
    752     enum { generic_type = 0,
    753            depth        = DataType<channel_type>::depth,
    754            channels     = (int)(sizeof(value_type)/sizeof(channel_type)), // 4
    755            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    756            type         = CV_MAKETYPE(depth, channels)
    757          };
    758 
    759     typedef Vec<channel_type, channels> vec_type;
    760 };
    761 
    762 
    763 
    764 ///////////////////////////// TermCriteria //////////////////////////////
    765 
    766 /** @brief The class defining termination criteria for iterative algorithms.
    767 
    768 You can initialize it by default constructor and then override any parameters, or the structure may
    769 be fully initialized using the advanced variant of the constructor.
    770 */
    771 class CV_EXPORTS TermCriteria
    772 {
    773 public:
    774     /**
    775       Criteria type, can be one of: COUNT, EPS or COUNT + EPS
    776     */
    777     enum Type
    778     {
    779         COUNT=1, //!< the maximum number of iterations or elements to compute
    780         MAX_ITER=COUNT, //!< ditto
    781         EPS=2 //!< the desired accuracy or change in parameters at which the iterative algorithm stops
    782     };
    783 
    784     //! default constructor
    785     TermCriteria();
    786     /**
    787     @param type The type of termination criteria, one of TermCriteria::Type
    788     @param maxCount The maximum number of iterations or elements to compute.
    789     @param epsilon The desired accuracy or change in parameters at which the iterative algorithm stops.
    790     */
    791     TermCriteria(int type, int maxCount, double epsilon);
    792 
    793     int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS
    794     int maxCount; // the maximum number of iterations/elements
    795     double epsilon; // the desired accuracy
    796 };
    797 
    798 
    799 //! @} core_basic
    800 
    801 ///////////////////////// raster image moments //////////////////////////
    802 
    803 //! @addtogroup imgproc_shape
    804 //! @{
    805 
    806 /** @brief struct returned by cv::moments
    807 
    808 The spatial moments \f$\texttt{Moments::m}_{ji}\f$ are computed as:
    809 
    810 \f[\texttt{m} _{ji}= \sum _{x,y}  \left ( \texttt{array} (x,y)  \cdot x^j  \cdot y^i \right )\f]
    811 
    812 The central moments \f$\texttt{Moments::mu}_{ji}\f$ are computed as:
    813 
    814 \f[\texttt{mu} _{ji}= \sum _{x,y}  \left ( \texttt{array} (x,y)  \cdot (x -  \bar{x} )^j  \cdot (y -  \bar{y} )^i \right )\f]
    815 
    816 where \f$(\bar{x}, \bar{y})\f$ is the mass center:
    817 
    818 \f[\bar{x} = \frac{\texttt{m}_{10}}{\texttt{m}_{00}} , \; \bar{y} = \frac{\texttt{m}_{01}}{\texttt{m}_{00}}\f]
    819 
    820 The normalized central moments \f$\texttt{Moments::nu}_{ij}\f$ are computed as:
    821 
    822 \f[\texttt{nu} _{ji}= \frac{\texttt{mu}_{ji}}{\texttt{m}_{00}^{(i+j)/2+1}} .\f]
    823 
    824 @note
    825 \f$\texttt{mu}_{00}=\texttt{m}_{00}\f$, \f$\texttt{nu}_{00}=1\f$
    826 \f$\texttt{nu}_{10}=\texttt{mu}_{10}=\texttt{mu}_{01}=\texttt{mu}_{10}=0\f$ , hence the values are not
    827 stored.
    828 
    829 The moments of a contour are defined in the same way but computed using the Green's formula (see
    830 <http://en.wikipedia.org/wiki/Green_theorem>). So, due to a limited raster resolution, the moments
    831 computed for a contour are slightly different from the moments computed for the same rasterized
    832 contour.
    833 
    834 @note
    835 Since the contour moments are computed using Green formula, you may get seemingly odd results for
    836 contours with self-intersections, e.g. a zero area (m00) for butterfly-shaped contours.
    837  */
    838 class CV_EXPORTS_W_MAP Moments
    839 {
    840 public:
    841     //! the default constructor
    842     Moments();
    843     //! the full constructor
    844     Moments(double m00, double m10, double m01, double m20, double m11,
    845             double m02, double m30, double m21, double m12, double m03 );
    846     ////! the conversion from CvMoments
    847     //Moments( const CvMoments& moments );
    848     ////! the conversion to CvMoments
    849     //operator CvMoments() const;
    850 
    851     //! @name spatial moments
    852     //! @{
    853     CV_PROP_RW double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
    854     //! @}
    855 
    856     //! @name central moments
    857     //! @{
    858     CV_PROP_RW double  mu20, mu11, mu02, mu30, mu21, mu12, mu03;
    859     //! @}
    860 
    861     //! @name central normalized moments
    862     //! @{
    863     CV_PROP_RW double  nu20, nu11, nu02, nu30, nu21, nu12, nu03;
    864     //! @}
    865 };
    866 
    867 template<> class DataType<Moments>
    868 {
    869 public:
    870     typedef Moments     value_type;
    871     typedef double      work_type;
    872     typedef double      channel_type;
    873 
    874     enum { generic_type = 0,
    875            depth        = DataType<channel_type>::depth,
    876            channels     = (int)(sizeof(value_type)/sizeof(channel_type)), // 24
    877            fmt          = DataType<channel_type>::fmt + ((channels - 1) << 8),
    878            type         = CV_MAKETYPE(depth, channels)
    879          };
    880 
    881     typedef Vec<channel_type, channels> vec_type;
    882 };
    883 
    884 //! @} imgproc_shape
    885 
    886 //! @cond IGNORED
    887 
    888 /////////////////////////////////////////////////////////////////////////
    889 ///////////////////////////// Implementation ////////////////////////////
    890 /////////////////////////////////////////////////////////////////////////
    891 
    892 //////////////////////////////// Complex ////////////////////////////////
    893 
    894 template<typename _Tp> inline
    895 Complex<_Tp>::Complex()
    896     : re(0), im(0) {}
    897 
    898 template<typename _Tp> inline
    899 Complex<_Tp>::Complex( _Tp _re, _Tp _im )
    900     : re(_re), im(_im) {}
    901 
    902 template<typename _Tp> template<typename T2> inline
    903 Complex<_Tp>::operator Complex<T2>() const
    904 {
    905     return Complex<T2>(saturate_cast<T2>(re), saturate_cast<T2>(im));
    906 }
    907 
    908 template<typename _Tp> inline
    909 Complex<_Tp> Complex<_Tp>::conj() const
    910 {
    911     return Complex<_Tp>(re, -im);
    912 }
    913 
    914 
    915 template<typename _Tp> static inline
    916 bool operator == (const Complex<_Tp>& a, const Complex<_Tp>& b)
    917 {
    918     return a.re == b.re && a.im == b.im;
    919 }
    920 
    921 template<typename _Tp> static inline
    922 bool operator != (const Complex<_Tp>& a, const Complex<_Tp>& b)
    923 {
    924     return a.re != b.re || a.im != b.im;
    925 }
    926 
    927 template<typename _Tp> static inline
    928 Complex<_Tp> operator + (const Complex<_Tp>& a, const Complex<_Tp>& b)
    929 {
    930     return Complex<_Tp>( a.re + b.re, a.im + b.im );
    931 }
    932 
    933 template<typename _Tp> static inline
    934 Complex<_Tp>& operator += (Complex<_Tp>& a, const Complex<_Tp>& b)
    935 {
    936     a.re += b.re; a.im += b.im;
    937     return a;
    938 }
    939 
    940 template<typename _Tp> static inline
    941 Complex<_Tp> operator - (const Complex<_Tp>& a, const Complex<_Tp>& b)
    942 {
    943     return Complex<_Tp>( a.re - b.re, a.im - b.im );
    944 }
    945 
    946 template<typename _Tp> static inline
    947 Complex<_Tp>& operator -= (Complex<_Tp>& a, const Complex<_Tp>& b)
    948 {
    949     a.re -= b.re; a.im -= b.im;
    950     return a;
    951 }
    952 
    953 template<typename _Tp> static inline
    954 Complex<_Tp> operator - (const Complex<_Tp>& a)
    955 {
    956     return Complex<_Tp>(-a.re, -a.im);
    957 }
    958 
    959 template<typename _Tp> static inline
    960 Complex<_Tp> operator * (const Complex<_Tp>& a, const Complex<_Tp>& b)
    961 {
    962     return Complex<_Tp>( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re );
    963 }
    964 
    965 template<typename _Tp> static inline
    966 Complex<_Tp> operator * (const Complex<_Tp>& a, _Tp b)
    967 {
    968     return Complex<_Tp>( a.re*b, a.im*b );
    969 }
    970 
    971 template<typename _Tp> static inline
    972 Complex<_Tp> operator * (_Tp b, const Complex<_Tp>& a)
    973 {
    974     return Complex<_Tp>( a.re*b, a.im*b );
    975 }
    976 
    977 template<typename _Tp> static inline
    978 Complex<_Tp> operator + (const Complex<_Tp>& a, _Tp b)
    979 {
    980     return Complex<_Tp>( a.re + b, a.im );
    981 }
    982 
    983 template<typename _Tp> static inline
    984 Complex<_Tp> operator - (const Complex<_Tp>& a, _Tp b)
    985 { return Complex<_Tp>( a.re - b, a.im ); }
    986 
    987 template<typename _Tp> static inline
    988 Complex<_Tp> operator + (_Tp b, const Complex<_Tp>& a)
    989 {
    990     return Complex<_Tp>( a.re + b, a.im );
    991 }
    992 
    993 template<typename _Tp> static inline
    994 Complex<_Tp> operator - (_Tp b, const Complex<_Tp>& a)
    995 {
    996     return Complex<_Tp>( b - a.re, -a.im );
    997 }
    998 
    999 template<typename _Tp> static inline
   1000 Complex<_Tp>& operator += (Complex<_Tp>& a, _Tp b)
   1001 {
   1002     a.re += b; return a;
   1003 }
   1004 
   1005 template<typename _Tp> static inline
   1006 Complex<_Tp>& operator -= (Complex<_Tp>& a, _Tp b)
   1007 {
   1008     a.re -= b; return a;
   1009 }
   1010 
   1011 template<typename _Tp> static inline
   1012 Complex<_Tp>& operator *= (Complex<_Tp>& a, _Tp b)
   1013 {
   1014     a.re *= b; a.im *= b; return a;
   1015 }
   1016 
   1017 template<typename _Tp> static inline
   1018 double abs(const Complex<_Tp>& a)
   1019 {
   1020     return std::sqrt( (double)a.re*a.re + (double)a.im*a.im);
   1021 }
   1022 
   1023 template<typename _Tp> static inline
   1024 Complex<_Tp> operator / (const Complex<_Tp>& a, const Complex<_Tp>& b)
   1025 {
   1026     double t = 1./((double)b.re*b.re + (double)b.im*b.im);
   1027     return Complex<_Tp>( (_Tp)((a.re*b.re + a.im*b.im)*t),
   1028                         (_Tp)((-a.re*b.im + a.im*b.re)*t) );
   1029 }
   1030 
   1031 template<typename _Tp> static inline
   1032 Complex<_Tp>& operator /= (Complex<_Tp>& a, const Complex<_Tp>& b)
   1033 {
   1034     return (a = a / b);
   1035 }
   1036 
   1037 template<typename _Tp> static inline
   1038 Complex<_Tp> operator / (const Complex<_Tp>& a, _Tp b)
   1039 {
   1040     _Tp t = (_Tp)1/b;
   1041     return Complex<_Tp>( a.re*t, a.im*t );
   1042 }
   1043 
   1044 template<typename _Tp> static inline
   1045 Complex<_Tp> operator / (_Tp b, const Complex<_Tp>& a)
   1046 {
   1047     return Complex<_Tp>(b)/a;
   1048 }
   1049 
   1050 template<typename _Tp> static inline
   1051 Complex<_Tp> operator /= (const Complex<_Tp>& a, _Tp b)
   1052 {
   1053     _Tp t = (_Tp)1/b;
   1054     a.re *= t; a.im *= t; return a;
   1055 }
   1056 
   1057 
   1058 
   1059 //////////////////////////////// 2D Point ///////////////////////////////
   1060 
   1061 template<typename _Tp> inline
   1062 Point_<_Tp>::Point_()
   1063     : x(0), y(0) {}
   1064 
   1065 template<typename _Tp> inline
   1066 Point_<_Tp>::Point_(_Tp _x, _Tp _y)
   1067     : x(_x), y(_y) {}
   1068 
   1069 template<typename _Tp> inline
   1070 Point_<_Tp>::Point_(const Point_& pt)
   1071     : x(pt.x), y(pt.y) {}
   1072 
   1073 template<typename _Tp> inline
   1074 Point_<_Tp>::Point_(const Size_<_Tp>& sz)
   1075     : x(sz.width), y(sz.height) {}
   1076 
   1077 template<typename _Tp> inline
   1078 Point_<_Tp>::Point_(const Vec<_Tp,2>& v)
   1079     : x(v[0]), y(v[1]) {}
   1080 
   1081 template<typename _Tp> inline
   1082 Point_<_Tp>& Point_<_Tp>::operator = (const Point_& pt)
   1083 {
   1084     x = pt.x; y = pt.y;
   1085     return *this;
   1086 }
   1087 
   1088 template<typename _Tp> template<typename _Tp2> inline
   1089 Point_<_Tp>::operator Point_<_Tp2>() const
   1090 {
   1091     return Point_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y));
   1092 }
   1093 
   1094 template<typename _Tp> inline
   1095 Point_<_Tp>::operator Vec<_Tp, 2>() const
   1096 {
   1097     return Vec<_Tp, 2>(x, y);
   1098 }
   1099 
   1100 template<typename _Tp> inline
   1101 _Tp Point_<_Tp>::dot(const Point_& pt) const
   1102 {
   1103     return saturate_cast<_Tp>(x*pt.x + y*pt.y);
   1104 }
   1105 
   1106 template<typename _Tp> inline
   1107 double Point_<_Tp>::ddot(const Point_& pt) const
   1108 {
   1109     return (double)x*pt.x + (double)y*pt.y;
   1110 }
   1111 
   1112 template<typename _Tp> inline
   1113 double Point_<_Tp>::cross(const Point_& pt) const
   1114 {
   1115     return (double)x*pt.y - (double)y*pt.x;
   1116 }
   1117 
   1118 template<typename _Tp> inline bool
   1119 Point_<_Tp>::inside( const Rect_<_Tp>& r ) const
   1120 {
   1121     return r.contains(*this);
   1122 }
   1123 
   1124 
   1125 template<typename _Tp> static inline
   1126 Point_<_Tp>& operator += (Point_<_Tp>& a, const Point_<_Tp>& b)
   1127 {
   1128     a.x += b.x;
   1129     a.y += b.y;
   1130     return a;
   1131 }
   1132 
   1133 template<typename _Tp> static inline
   1134 Point_<_Tp>& operator -= (Point_<_Tp>& a, const Point_<_Tp>& b)
   1135 {
   1136     a.x -= b.x;
   1137     a.y -= b.y;
   1138     return a;
   1139 }
   1140 
   1141 template<typename _Tp> static inline
   1142 Point_<_Tp>& operator *= (Point_<_Tp>& a, int b)
   1143 {
   1144     a.x = saturate_cast<_Tp>(a.x * b);
   1145     a.y = saturate_cast<_Tp>(a.y * b);
   1146     return a;
   1147 }
   1148 
   1149 template<typename _Tp> static inline
   1150 Point_<_Tp>& operator *= (Point_<_Tp>& a, float b)
   1151 {
   1152     a.x = saturate_cast<_Tp>(a.x * b);
   1153     a.y = saturate_cast<_Tp>(a.y * b);
   1154     return a;
   1155 }
   1156 
   1157 template<typename _Tp> static inline
   1158 Point_<_Tp>& operator *= (Point_<_Tp>& a, double b)
   1159 {
   1160     a.x = saturate_cast<_Tp>(a.x * b);
   1161     a.y = saturate_cast<_Tp>(a.y * b);
   1162     return a;
   1163 }
   1164 
   1165 template<typename _Tp> static inline
   1166 Point_<_Tp>& operator /= (Point_<_Tp>& a, int b)
   1167 {
   1168     a.x = saturate_cast<_Tp>(a.x / b);
   1169     a.y = saturate_cast<_Tp>(a.y / b);
   1170     return a;
   1171 }
   1172 
   1173 template<typename _Tp> static inline
   1174 Point_<_Tp>& operator /= (Point_<_Tp>& a, float b)
   1175 {
   1176     a.x = saturate_cast<_Tp>(a.x / b);
   1177     a.y = saturate_cast<_Tp>(a.y / b);
   1178     return a;
   1179 }
   1180 
   1181 template<typename _Tp> static inline
   1182 Point_<_Tp>& operator /= (Point_<_Tp>& a, double b)
   1183 {
   1184     a.x = saturate_cast<_Tp>(a.x / b);
   1185     a.y = saturate_cast<_Tp>(a.y / b);
   1186     return a;
   1187 }
   1188 
   1189 template<typename _Tp> static inline
   1190 double norm(const Point_<_Tp>& pt)
   1191 {
   1192     return std::sqrt((double)pt.x*pt.x + (double)pt.y*pt.y);
   1193 }
   1194 
   1195 template<typename _Tp> static inline
   1196 bool operator == (const Point_<_Tp>& a, const Point_<_Tp>& b)
   1197 {
   1198     return a.x == b.x && a.y == b.y;
   1199 }
   1200 
   1201 template<typename _Tp> static inline
   1202 bool operator != (const Point_<_Tp>& a, const Point_<_Tp>& b)
   1203 {
   1204     return a.x != b.x || a.y != b.y;
   1205 }
   1206 
   1207 template<typename _Tp> static inline
   1208 Point_<_Tp> operator + (const Point_<_Tp>& a, const Point_<_Tp>& b)
   1209 {
   1210     return Point_<_Tp>( saturate_cast<_Tp>(a.x + b.x), saturate_cast<_Tp>(a.y + b.y) );
   1211 }
   1212 
   1213 template<typename _Tp> static inline
   1214 Point_<_Tp> operator - (const Point_<_Tp>& a, const Point_<_Tp>& b)
   1215 {
   1216     return Point_<_Tp>( saturate_cast<_Tp>(a.x - b.x), saturate_cast<_Tp>(a.y - b.y) );
   1217 }
   1218 
   1219 template<typename _Tp> static inline
   1220 Point_<_Tp> operator - (const Point_<_Tp>& a)
   1221 {
   1222     return Point_<_Tp>( saturate_cast<_Tp>(-a.x), saturate_cast<_Tp>(-a.y) );
   1223 }
   1224 
   1225 template<typename _Tp> static inline
   1226 Point_<_Tp> operator * (const Point_<_Tp>& a, int b)
   1227 {
   1228     return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) );
   1229 }
   1230 
   1231 template<typename _Tp> static inline
   1232 Point_<_Tp> operator * (int a, const Point_<_Tp>& b)
   1233 {
   1234     return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) );
   1235 }
   1236 
   1237 template<typename _Tp> static inline
   1238 Point_<_Tp> operator * (const Point_<_Tp>& a, float b)
   1239 {
   1240     return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) );
   1241 }
   1242 
   1243 template<typename _Tp> static inline
   1244 Point_<_Tp> operator * (float a, const Point_<_Tp>& b)
   1245 {
   1246     return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) );
   1247 }
   1248 
   1249 template<typename _Tp> static inline
   1250 Point_<_Tp> operator * (const Point_<_Tp>& a, double b)
   1251 {
   1252     return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) );
   1253 }
   1254 
   1255 template<typename _Tp> static inline
   1256 Point_<_Tp> operator * (double a, const Point_<_Tp>& b)
   1257 {
   1258     return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) );
   1259 }
   1260 
   1261 template<typename _Tp> static inline
   1262 Point_<_Tp> operator * (const Matx<_Tp, 2, 2>& a, const Point_<_Tp>& b)
   1263 {
   1264     Matx<_Tp, 2, 1> tmp = a * Vec<_Tp,2>(b.x, b.y);
   1265     return Point_<_Tp>(tmp.val[0], tmp.val[1]);
   1266 }
   1267 
   1268 template<typename _Tp> static inline
   1269 Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point_<_Tp>& b)
   1270 {
   1271     Matx<_Tp, 3, 1> tmp = a * Vec<_Tp,3>(b.x, b.y, 1);
   1272     return Point3_<_Tp>(tmp.val[0], tmp.val[1], tmp.val[2]);
   1273 }
   1274 
   1275 template<typename _Tp> static inline
   1276 Point_<_Tp> operator / (const Point_<_Tp>& a, int b)
   1277 {
   1278     Point_<_Tp> tmp(a);
   1279     tmp /= b;
   1280     return tmp;
   1281 }
   1282 
   1283 template<typename _Tp> static inline
   1284 Point_<_Tp> operator / (const Point_<_Tp>& a, float b)
   1285 {
   1286     Point_<_Tp> tmp(a);
   1287     tmp /= b;
   1288     return tmp;
   1289 }
   1290 
   1291 template<typename _Tp> static inline
   1292 Point_<_Tp> operator / (const Point_<_Tp>& a, double b)
   1293 {
   1294     Point_<_Tp> tmp(a);
   1295     tmp /= b;
   1296     return tmp;
   1297 }
   1298 
   1299 
   1300 
   1301 //////////////////////////////// 3D Point ///////////////////////////////
   1302 
   1303 template<typename _Tp> inline
   1304 Point3_<_Tp>::Point3_()
   1305     : x(0), y(0), z(0) {}
   1306 
   1307 template<typename _Tp> inline
   1308 Point3_<_Tp>::Point3_(_Tp _x, _Tp _y, _Tp _z)
   1309     : x(_x), y(_y), z(_z) {}
   1310 
   1311 template<typename _Tp> inline
   1312 Point3_<_Tp>::Point3_(const Point3_& pt)
   1313     : x(pt.x), y(pt.y), z(pt.z) {}
   1314 
   1315 template<typename _Tp> inline
   1316 Point3_<_Tp>::Point3_(const Point_<_Tp>& pt)
   1317     : x(pt.x), y(pt.y), z(_Tp()) {}
   1318 
   1319 template<typename _Tp> inline
   1320 Point3_<_Tp>::Point3_(const Vec<_Tp, 3>& v)
   1321     : x(v[0]), y(v[1]), z(v[2]) {}
   1322 
   1323 template<typename _Tp> template<typename _Tp2> inline
   1324 Point3_<_Tp>::operator Point3_<_Tp2>() const
   1325 {
   1326     return Point3_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y), saturate_cast<_Tp2>(z));
   1327 }
   1328 
   1329 template<typename _Tp> inline
   1330 Point3_<_Tp>::operator Vec<_Tp, 3>() const
   1331 {
   1332     return Vec<_Tp, 3>(x, y, z);
   1333 }
   1334 
   1335 template<typename _Tp> inline
   1336 Point3_<_Tp>& Point3_<_Tp>::operator = (const Point3_& pt)
   1337 {
   1338     x = pt.x; y = pt.y; z = pt.z;
   1339     return *this;
   1340 }
   1341 
   1342 template<typename _Tp> inline
   1343 _Tp Point3_<_Tp>::dot(const Point3_& pt) const
   1344 {
   1345     return saturate_cast<_Tp>(x*pt.x + y*pt.y + z*pt.z);
   1346 }
   1347 
   1348 template<typename _Tp> inline
   1349 double Point3_<_Tp>::ddot(const Point3_& pt) const
   1350 {
   1351     return (double)x*pt.x + (double)y*pt.y + (double)z*pt.z;
   1352 }
   1353 
   1354 template<typename _Tp> inline
   1355 Point3_<_Tp> Point3_<_Tp>::cross(const Point3_<_Tp>& pt) const
   1356 {
   1357     return Point3_<_Tp>(y*pt.z - z*pt.y, z*pt.x - x*pt.z, x*pt.y - y*pt.x);
   1358 }
   1359 
   1360 
   1361 template<typename _Tp> static inline
   1362 Point3_<_Tp>& operator += (Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1363 {
   1364     a.x += b.x;
   1365     a.y += b.y;
   1366     a.z += b.z;
   1367     return a;
   1368 }
   1369 
   1370 template<typename _Tp> static inline
   1371 Point3_<_Tp>& operator -= (Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1372 {
   1373     a.x -= b.x;
   1374     a.y -= b.y;
   1375     a.z -= b.z;
   1376     return a;
   1377 }
   1378 
   1379 template<typename _Tp> static inline
   1380 Point3_<_Tp>& operator *= (Point3_<_Tp>& a, int b)
   1381 {
   1382     a.x = saturate_cast<_Tp>(a.x * b);
   1383     a.y = saturate_cast<_Tp>(a.y * b);
   1384     a.z = saturate_cast<_Tp>(a.z * b);
   1385     return a;
   1386 }
   1387 
   1388 template<typename _Tp> static inline
   1389 Point3_<_Tp>& operator *= (Point3_<_Tp>& a, float b)
   1390 {
   1391     a.x = saturate_cast<_Tp>(a.x * b);
   1392     a.y = saturate_cast<_Tp>(a.y * b);
   1393     a.z = saturate_cast<_Tp>(a.z * b);
   1394     return a;
   1395 }
   1396 
   1397 template<typename _Tp> static inline
   1398 Point3_<_Tp>& operator *= (Point3_<_Tp>& a, double b)
   1399 {
   1400     a.x = saturate_cast<_Tp>(a.x * b);
   1401     a.y = saturate_cast<_Tp>(a.y * b);
   1402     a.z = saturate_cast<_Tp>(a.z * b);
   1403     return a;
   1404 }
   1405 
   1406 template<typename _Tp> static inline
   1407 Point3_<_Tp>& operator /= (Point3_<_Tp>& a, int b)
   1408 {
   1409     a.x = saturate_cast<_Tp>(a.x / b);
   1410     a.y = saturate_cast<_Tp>(a.y / b);
   1411     a.z = saturate_cast<_Tp>(a.z / b);
   1412     return a;
   1413 }
   1414 
   1415 template<typename _Tp> static inline
   1416 Point3_<_Tp>& operator /= (Point3_<_Tp>& a, float b)
   1417 {
   1418     a.x = saturate_cast<_Tp>(a.x / b);
   1419     a.y = saturate_cast<_Tp>(a.y / b);
   1420     a.z = saturate_cast<_Tp>(a.z / b);
   1421     return a;
   1422 }
   1423 
   1424 template<typename _Tp> static inline
   1425 Point3_<_Tp>& operator /= (Point3_<_Tp>& a, double b)
   1426 {
   1427     a.x = saturate_cast<_Tp>(a.x / b);
   1428     a.y = saturate_cast<_Tp>(a.y / b);
   1429     a.z = saturate_cast<_Tp>(a.z / b);
   1430     return a;
   1431 }
   1432 
   1433 template<typename _Tp> static inline
   1434 double norm(const Point3_<_Tp>& pt)
   1435 {
   1436     return std::sqrt((double)pt.x*pt.x + (double)pt.y*pt.y + (double)pt.z*pt.z);
   1437 }
   1438 
   1439 template<typename _Tp> static inline
   1440 bool operator == (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1441 {
   1442     return a.x == b.x && a.y == b.y && a.z == b.z;
   1443 }
   1444 
   1445 template<typename _Tp> static inline
   1446 bool operator != (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1447 {
   1448     return a.x != b.x || a.y != b.y || a.z != b.z;
   1449 }
   1450 
   1451 template<typename _Tp> static inline
   1452 Point3_<_Tp> operator + (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1453 {
   1454     return Point3_<_Tp>( saturate_cast<_Tp>(a.x + b.x), saturate_cast<_Tp>(a.y + b.y), saturate_cast<_Tp>(a.z + b.z));
   1455 }
   1456 
   1457 template<typename _Tp> static inline
   1458 Point3_<_Tp> operator - (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
   1459 {
   1460     return Point3_<_Tp>( saturate_cast<_Tp>(a.x - b.x), saturate_cast<_Tp>(a.y - b.y), saturate_cast<_Tp>(a.z - b.z));
   1461 }
   1462 
   1463 template<typename _Tp> static inline
   1464 Point3_<_Tp> operator - (const Point3_<_Tp>& a)
   1465 {
   1466     return Point3_<_Tp>( saturate_cast<_Tp>(-a.x), saturate_cast<_Tp>(-a.y), saturate_cast<_Tp>(-a.z) );
   1467 }
   1468 
   1469 template<typename _Tp> static inline
   1470 Point3_<_Tp> operator * (const Point3_<_Tp>& a, int b)
   1471 {
   1472     return Point3_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b), saturate_cast<_Tp>(a.z*b) );
   1473 }
   1474 
   1475 template<typename _Tp> static inline
   1476 Point3_<_Tp> operator * (int a, const Point3_<_Tp>& b)
   1477 {
   1478     return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) );
   1479 }
   1480 
   1481 template<typename _Tp> static inline
   1482 Point3_<_Tp> operator * (const Point3_<_Tp>& a, float b)
   1483 {
   1484     return Point3_<_Tp>( saturate_cast<_Tp>(a.x * b), saturate_cast<_Tp>(a.y * b), saturate_cast<_Tp>(a.z * b) );
   1485 }
   1486 
   1487 template<typename _Tp> static inline
   1488 Point3_<_Tp> operator * (float a, const Point3_<_Tp>& b)
   1489 {
   1490     return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) );
   1491 }
   1492 
   1493 template<typename _Tp> static inline
   1494 Point3_<_Tp> operator * (const Point3_<_Tp>& a, double b)
   1495 {
   1496     return Point3_<_Tp>( saturate_cast<_Tp>(a.x * b), saturate_cast<_Tp>(a.y * b), saturate_cast<_Tp>(a.z * b) );
   1497 }
   1498 
   1499 template<typename _Tp> static inline
   1500 Point3_<_Tp> operator * (double a, const Point3_<_Tp>& b)
   1501 {
   1502     return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) );
   1503 }
   1504 
   1505 template<typename _Tp> static inline
   1506 Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point3_<_Tp>& b)
   1507 {
   1508     Matx<_Tp, 3, 1> tmp = a * Vec<_Tp,3>(b.x, b.y, b.z);
   1509     return Point3_<_Tp>(tmp.val[0], tmp.val[1], tmp.val[2]);
   1510 }
   1511 
   1512 template<typename _Tp> static inline
   1513 Matx<_Tp, 4, 1> operator * (const Matx<_Tp, 4, 4>& a, const Point3_<_Tp>& b)
   1514 {
   1515     return a * Matx<_Tp, 4, 1>(b.x, b.y, b.z, 1);
   1516 }
   1517 
   1518 template<typename _Tp> static inline
   1519 Point3_<_Tp> operator / (const Point3_<_Tp>& a, int b)
   1520 {
   1521     Point3_<_Tp> tmp(a);
   1522     tmp /= b;
   1523     return tmp;
   1524 }
   1525 
   1526 template<typename _Tp> static inline
   1527 Point3_<_Tp> operator / (const Point3_<_Tp>& a, float b)
   1528 {
   1529     Point3_<_Tp> tmp(a);
   1530     tmp /= b;
   1531     return tmp;
   1532 }
   1533 
   1534 template<typename _Tp> static inline
   1535 Point3_<_Tp> operator / (const Point3_<_Tp>& a, double b)
   1536 {
   1537     Point3_<_Tp> tmp(a);
   1538     tmp /= b;
   1539     return tmp;
   1540 }
   1541 
   1542 
   1543 
   1544 ////////////////////////////////// Size /////////////////////////////////
   1545 
   1546 template<typename _Tp> inline
   1547 Size_<_Tp>::Size_()
   1548     : width(0), height(0) {}
   1549 
   1550 template<typename _Tp> inline
   1551 Size_<_Tp>::Size_(_Tp _width, _Tp _height)
   1552     : width(_width), height(_height) {}
   1553 
   1554 template<typename _Tp> inline
   1555 Size_<_Tp>::Size_(const Size_& sz)
   1556     : width(sz.width), height(sz.height) {}
   1557 
   1558 template<typename _Tp> inline
   1559 Size_<_Tp>::Size_(const Point_<_Tp>& pt)
   1560     : width(pt.x), height(pt.y) {}
   1561 
   1562 template<typename _Tp> template<typename _Tp2> inline
   1563 Size_<_Tp>::operator Size_<_Tp2>() const
   1564 {
   1565     return Size_<_Tp2>(saturate_cast<_Tp2>(width), saturate_cast<_Tp2>(height));
   1566 }
   1567 
   1568 template<typename _Tp> inline
   1569 Size_<_Tp>& Size_<_Tp>::operator = (const Size_<_Tp>& sz)
   1570 {
   1571     width = sz.width; height = sz.height;
   1572     return *this;
   1573 }
   1574 
   1575 template<typename _Tp> inline
   1576 _Tp Size_<_Tp>::area() const
   1577 {
   1578     return width * height;
   1579 }
   1580 
   1581 template<typename _Tp> static inline
   1582 Size_<_Tp>& operator *= (Size_<_Tp>& a, _Tp b)
   1583 {
   1584     a.width *= b;
   1585     a.height *= b;
   1586     return a;
   1587 }
   1588 
   1589 template<typename _Tp> static inline
   1590 Size_<_Tp> operator * (const Size_<_Tp>& a, _Tp b)
   1591 {
   1592     Size_<_Tp> tmp(a);
   1593     tmp *= b;
   1594     return tmp;
   1595 }
   1596 
   1597 template<typename _Tp> static inline
   1598 Size_<_Tp>& operator /= (Size_<_Tp>& a, _Tp b)
   1599 {
   1600     a.width /= b;
   1601     a.height /= b;
   1602     return a;
   1603 }
   1604 
   1605 template<typename _Tp> static inline
   1606 Size_<_Tp> operator / (const Size_<_Tp>& a, _Tp b)
   1607 {
   1608     Size_<_Tp> tmp(a);
   1609     tmp /= b;
   1610     return tmp;
   1611 }
   1612 
   1613 template<typename _Tp> static inline
   1614 Size_<_Tp>& operator += (Size_<_Tp>& a, const Size_<_Tp>& b)
   1615 {
   1616     a.width += b.width;
   1617     a.height += b.height;
   1618     return a;
   1619 }
   1620 
   1621 template<typename _Tp> static inline
   1622 Size_<_Tp> operator + (const Size_<_Tp>& a, const Size_<_Tp>& b)
   1623 {
   1624     Size_<_Tp> tmp(a);
   1625     tmp += b;
   1626     return tmp;
   1627 }
   1628 
   1629 template<typename _Tp> static inline
   1630 Size_<_Tp>& operator -= (Size_<_Tp>& a, const Size_<_Tp>& b)
   1631 {
   1632     a.width -= b.width;
   1633     a.height -= b.height;
   1634     return a;
   1635 }
   1636 
   1637 template<typename _Tp> static inline
   1638 Size_<_Tp> operator - (const Size_<_Tp>& a, const Size_<_Tp>& b)
   1639 {
   1640     Size_<_Tp> tmp(a);
   1641     tmp -= b;
   1642     return tmp;
   1643 }
   1644 
   1645 template<typename _Tp> static inline
   1646 bool operator == (const Size_<_Tp>& a, const Size_<_Tp>& b)
   1647 {
   1648     return a.width == b.width && a.height == b.height;
   1649 }
   1650 
   1651 template<typename _Tp> static inline
   1652 bool operator != (const Size_<_Tp>& a, const Size_<_Tp>& b)
   1653 {
   1654     return !(a == b);
   1655 }
   1656 
   1657 
   1658 
   1659 ////////////////////////////////// Rect /////////////////////////////////
   1660 
   1661 template<typename _Tp> inline
   1662 Rect_<_Tp>::Rect_()
   1663     : x(0), y(0), width(0), height(0) {}
   1664 
   1665 template<typename _Tp> inline
   1666 Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height)
   1667     : x(_x), y(_y), width(_width), height(_height) {}
   1668 
   1669 template<typename _Tp> inline
   1670 Rect_<_Tp>::Rect_(const Rect_<_Tp>& r)
   1671     : x(r.x), y(r.y), width(r.width), height(r.height) {}
   1672 
   1673 template<typename _Tp> inline
   1674 Rect_<_Tp>::Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz)
   1675     : x(org.x), y(org.y), width(sz.width), height(sz.height) {}
   1676 
   1677 template<typename _Tp> inline
   1678 Rect_<_Tp>::Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2)
   1679 {
   1680     x = std::min(pt1.x, pt2.x);
   1681     y = std::min(pt1.y, pt2.y);
   1682     width = std::max(pt1.x, pt2.x) - x;
   1683     height = std::max(pt1.y, pt2.y) - y;
   1684 }
   1685 
   1686 template<typename _Tp> inline
   1687 Rect_<_Tp>& Rect_<_Tp>::operator = ( const Rect_<_Tp>& r )
   1688 {
   1689     x = r.x;
   1690     y = r.y;
   1691     width = r.width;
   1692     height = r.height;
   1693     return *this;
   1694 }
   1695 
   1696 template<typename _Tp> inline
   1697 Point_<_Tp> Rect_<_Tp>::tl() const
   1698 {
   1699     return Point_<_Tp>(x,y);
   1700 }
   1701 
   1702 template<typename _Tp> inline
   1703 Point_<_Tp> Rect_<_Tp>::br() const
   1704 {
   1705     return Point_<_Tp>(x + width, y + height);
   1706 }
   1707 
   1708 template<typename _Tp> inline
   1709 Size_<_Tp> Rect_<_Tp>::size() const
   1710 {
   1711     return Size_<_Tp>(width, height);
   1712 }
   1713 
   1714 template<typename _Tp> inline
   1715 _Tp Rect_<_Tp>::area() const
   1716 {
   1717     return width * height;
   1718 }
   1719 
   1720 template<typename _Tp> template<typename _Tp2> inline
   1721 Rect_<_Tp>::operator Rect_<_Tp2>() const
   1722 {
   1723     return Rect_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y), saturate_cast<_Tp2>(width), saturate_cast<_Tp2>(height));
   1724 }
   1725 
   1726 template<typename _Tp> inline
   1727 bool Rect_<_Tp>::contains(const Point_<_Tp>& pt) const
   1728 {
   1729     return x <= pt.x && pt.x < x + width && y <= pt.y && pt.y < y + height;
   1730 }
   1731 
   1732 
   1733 template<typename _Tp> static inline
   1734 Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Point_<_Tp>& b )
   1735 {
   1736     a.x += b.x;
   1737     a.y += b.y;
   1738     return a;
   1739 }
   1740 
   1741 template<typename _Tp> static inline
   1742 Rect_<_Tp>& operator -= ( Rect_<_Tp>& a, const Point_<_Tp>& b )
   1743 {
   1744     a.x -= b.x;
   1745     a.y -= b.y;
   1746     return a;
   1747 }
   1748 
   1749 template<typename _Tp> static inline
   1750 Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Size_<_Tp>& b )
   1751 {
   1752     a.width += b.width;
   1753     a.height += b.height;
   1754     return a;
   1755 }
   1756 
   1757 template<typename _Tp> static inline
   1758 Rect_<_Tp>& operator -= ( Rect_<_Tp>& a, const Size_<_Tp>& b )
   1759 {
   1760     a.width -= b.width;
   1761     a.height -= b.height;
   1762     return a;
   1763 }
   1764 
   1765 template<typename _Tp> static inline
   1766 Rect_<_Tp>& operator &= ( Rect_<_Tp>& a, const Rect_<_Tp>& b )
   1767 {
   1768     _Tp x1 = std::max(a.x, b.x);
   1769     _Tp y1 = std::max(a.y, b.y);
   1770     a.width = std::min(a.x + a.width, b.x + b.width) - x1;
   1771     a.height = std::min(a.y + a.height, b.y + b.height) - y1;
   1772     a.x = x1;
   1773     a.y = y1;
   1774     if( a.width <= 0 || a.height <= 0 )
   1775         a = Rect();
   1776     return a;
   1777 }
   1778 
   1779 template<typename _Tp> static inline
   1780 Rect_<_Tp>& operator |= ( Rect_<_Tp>& a, const Rect_<_Tp>& b )
   1781 {
   1782     _Tp x1 = std::min(a.x, b.x);
   1783     _Tp y1 = std::min(a.y, b.y);
   1784     a.width = std::max(a.x + a.width, b.x + b.width) - x1;
   1785     a.height = std::max(a.y + a.height, b.y + b.height) - y1;
   1786     a.x = x1;
   1787     a.y = y1;
   1788     return a;
   1789 }
   1790 
   1791 template<typename _Tp> static inline
   1792 bool operator == (const Rect_<_Tp>& a, const Rect_<_Tp>& b)
   1793 {
   1794     return a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height;
   1795 }
   1796 
   1797 template<typename _Tp> static inline
   1798 bool operator != (const Rect_<_Tp>& a, const Rect_<_Tp>& b)
   1799 {
   1800     return a.x != b.x || a.y != b.y || a.width != b.width || a.height != b.height;
   1801 }
   1802 
   1803 template<typename _Tp> static inline
   1804 Rect_<_Tp> operator + (const Rect_<_Tp>& a, const Point_<_Tp>& b)
   1805 {
   1806     return Rect_<_Tp>( a.x + b.x, a.y + b.y, a.width, a.height );
   1807 }
   1808 
   1809 template<typename _Tp> static inline
   1810 Rect_<_Tp> operator - (const Rect_<_Tp>& a, const Point_<_Tp>& b)
   1811 {
   1812     return Rect_<_Tp>( a.x - b.x, a.y - b.y, a.width, a.height );
   1813 }
   1814 
   1815 template<typename _Tp> static inline
   1816 Rect_<_Tp> operator + (const Rect_<_Tp>& a, const Size_<_Tp>& b)
   1817 {
   1818     return Rect_<_Tp>( a.x, a.y, a.width + b.width, a.height + b.height );
   1819 }
   1820 
   1821 template<typename _Tp> static inline
   1822 Rect_<_Tp> operator & (const Rect_<_Tp>& a, const Rect_<_Tp>& b)
   1823 {
   1824     Rect_<_Tp> c = a;
   1825     return c &= b;
   1826 }
   1827 
   1828 template<typename _Tp> static inline
   1829 Rect_<_Tp> operator | (const Rect_<_Tp>& a, const Rect_<_Tp>& b)
   1830 {
   1831     Rect_<_Tp> c = a;
   1832     return c |= b;
   1833 }
   1834 
   1835 
   1836 
   1837 ////////////////////////////// RotatedRect //////////////////////////////
   1838 
   1839 inline
   1840 RotatedRect::RotatedRect()
   1841     : center(), size(), angle(0) {}
   1842 
   1843 inline
   1844 RotatedRect::RotatedRect(const Point2f& _center, const Size2f& _size, float _angle)
   1845     : center(_center), size(_size), angle(_angle) {}
   1846 
   1847 
   1848 
   1849 ///////////////////////////////// Range /////////////////////////////////
   1850 
   1851 inline
   1852 Range::Range()
   1853     : start(0), end(0) {}
   1854 
   1855 inline
   1856 Range::Range(int _start, int _end)
   1857     : start(_start), end(_end) {}
   1858 
   1859 inline
   1860 int Range::size() const
   1861 {
   1862     return end - start;
   1863 }
   1864 
   1865 inline
   1866 bool Range::empty() const
   1867 {
   1868     return start == end;
   1869 }
   1870 
   1871 inline
   1872 Range Range::all()
   1873 {
   1874     return Range(INT_MIN, INT_MAX);
   1875 }
   1876 
   1877 
   1878 static inline
   1879 bool operator == (const Range& r1, const Range& r2)
   1880 {
   1881     return r1.start == r2.start && r1.end == r2.end;
   1882 }
   1883 
   1884 static inline
   1885 bool operator != (const Range& r1, const Range& r2)
   1886 {
   1887     return !(r1 == r2);
   1888 }
   1889 
   1890 static inline
   1891 bool operator !(const Range& r)
   1892 {
   1893     return r.start == r.end;
   1894 }
   1895 
   1896 static inline
   1897 Range operator & (const Range& r1, const Range& r2)
   1898 {
   1899     Range r(std::max(r1.start, r2.start), std::min(r1.end, r2.end));
   1900     r.end = std::max(r.end, r.start);
   1901     return r;
   1902 }
   1903 
   1904 static inline
   1905 Range& operator &= (Range& r1, const Range& r2)
   1906 {
   1907     r1 = r1 & r2;
   1908     return r1;
   1909 }
   1910 
   1911 static inline
   1912 Range operator + (const Range& r1, int delta)
   1913 {
   1914     return Range(r1.start + delta, r1.end + delta);
   1915 }
   1916 
   1917 static inline
   1918 Range operator + (int delta, const Range& r1)
   1919 {
   1920     return Range(r1.start + delta, r1.end + delta);
   1921 }
   1922 
   1923 static inline
   1924 Range operator - (const Range& r1, int delta)
   1925 {
   1926     return r1 + (-delta);
   1927 }
   1928 
   1929 
   1930 
   1931 ///////////////////////////////// Scalar ////////////////////////////////
   1932 
   1933 template<typename _Tp> inline
   1934 Scalar_<_Tp>::Scalar_()
   1935 {
   1936     this->val[0] = this->val[1] = this->val[2] = this->val[3] = 0;
   1937 }
   1938 
   1939 template<typename _Tp> inline
   1940 Scalar_<_Tp>::Scalar_(_Tp v0, _Tp v1, _Tp v2, _Tp v3)
   1941 {
   1942     this->val[0] = v0;
   1943     this->val[1] = v1;
   1944     this->val[2] = v2;
   1945     this->val[3] = v3;
   1946 }
   1947 
   1948 template<typename _Tp> template<typename _Tp2, int cn> inline
   1949 Scalar_<_Tp>::Scalar_(const Vec<_Tp2, cn>& v)
   1950 {
   1951     int i;
   1952     for( i = 0; i < (cn < 4 ? cn : 4); i++ )
   1953         this->val[i] = cv::saturate_cast<_Tp>(v.val[i]);
   1954     for( ; i < 4; i++ )
   1955         this->val[i] = 0;
   1956 }
   1957 
   1958 template<typename _Tp> inline
   1959 Scalar_<_Tp>::Scalar_(_Tp v0)
   1960 {
   1961     this->val[0] = v0;
   1962     this->val[1] = this->val[2] = this->val[3] = 0;
   1963 }
   1964 
   1965 template<typename _Tp> inline
   1966 Scalar_<_Tp> Scalar_<_Tp>::all(_Tp v0)
   1967 {
   1968     return Scalar_<_Tp>(v0, v0, v0, v0);
   1969 }
   1970 
   1971 
   1972 template<typename _Tp> inline
   1973 Scalar_<_Tp> Scalar_<_Tp>::mul(const Scalar_<_Tp>& a, double scale ) const
   1974 {
   1975     return Scalar_<_Tp>(saturate_cast<_Tp>(this->val[0] * a.val[0] * scale),
   1976                         saturate_cast<_Tp>(this->val[1] * a.val[1] * scale),
   1977                         saturate_cast<_Tp>(this->val[2] * a.val[2] * scale),
   1978                         saturate_cast<_Tp>(this->val[3] * a.val[3] * scale));
   1979 }
   1980 
   1981 template<typename _Tp> inline
   1982 Scalar_<_Tp> Scalar_<_Tp>::conj() const
   1983 {
   1984     return Scalar_<_Tp>(saturate_cast<_Tp>( this->val[0]),
   1985                         saturate_cast<_Tp>(-this->val[1]),
   1986                         saturate_cast<_Tp>(-this->val[2]),
   1987                         saturate_cast<_Tp>(-this->val[3]));
   1988 }
   1989 
   1990 template<typename _Tp> inline
   1991 bool Scalar_<_Tp>::isReal() const
   1992 {
   1993     return this->val[1] == 0 && this->val[2] == 0 && this->val[3] == 0;
   1994 }
   1995 
   1996 
   1997 template<typename _Tp> template<typename T2> inline
   1998 Scalar_<_Tp>::operator Scalar_<T2>() const
   1999 {
   2000     return Scalar_<T2>(saturate_cast<T2>(this->val[0]),
   2001                        saturate_cast<T2>(this->val[1]),
   2002                        saturate_cast<T2>(this->val[2]),
   2003                        saturate_cast<T2>(this->val[3]));
   2004 }
   2005 
   2006 
   2007 template<typename _Tp> static inline
   2008 Scalar_<_Tp>& operator += (Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2009 {
   2010     a.val[0] += b.val[0];
   2011     a.val[1] += b.val[1];
   2012     a.val[2] += b.val[2];
   2013     a.val[3] += b.val[3];
   2014     return a;
   2015 }
   2016 
   2017 template<typename _Tp> static inline
   2018 Scalar_<_Tp>& operator -= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2019 {
   2020     a.val[0] -= b.val[0];
   2021     a.val[1] -= b.val[1];
   2022     a.val[2] -= b.val[2];
   2023     a.val[3] -= b.val[3];
   2024     return a;
   2025 }
   2026 
   2027 template<typename _Tp> static inline
   2028 Scalar_<_Tp>& operator *= ( Scalar_<_Tp>& a, _Tp v )
   2029 {
   2030     a.val[0] *= v;
   2031     a.val[1] *= v;
   2032     a.val[2] *= v;
   2033     a.val[3] *= v;
   2034     return a;
   2035 }
   2036 
   2037 template<typename _Tp> static inline
   2038 bool operator == ( const Scalar_<_Tp>& a, const Scalar_<_Tp>& b )
   2039 {
   2040     return a.val[0] == b.val[0] && a.val[1] == b.val[1] &&
   2041            a.val[2] == b.val[2] && a.val[3] == b.val[3];
   2042 }
   2043 
   2044 template<typename _Tp> static inline
   2045 bool operator != ( const Scalar_<_Tp>& a, const Scalar_<_Tp>& b )
   2046 {
   2047     return a.val[0] != b.val[0] || a.val[1] != b.val[1] ||
   2048            a.val[2] != b.val[2] || a.val[3] != b.val[3];
   2049 }
   2050 
   2051 template<typename _Tp> static inline
   2052 Scalar_<_Tp> operator + (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2053 {
   2054     return Scalar_<_Tp>(a.val[0] + b.val[0],
   2055                         a.val[1] + b.val[1],
   2056                         a.val[2] + b.val[2],
   2057                         a.val[3] + b.val[3]);
   2058 }
   2059 
   2060 template<typename _Tp> static inline
   2061 Scalar_<_Tp> operator - (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2062 {
   2063     return Scalar_<_Tp>(saturate_cast<_Tp>(a.val[0] - b.val[0]),
   2064                         saturate_cast<_Tp>(a.val[1] - b.val[1]),
   2065                         saturate_cast<_Tp>(a.val[2] - b.val[2]),
   2066                         saturate_cast<_Tp>(a.val[3] - b.val[3]));
   2067 }
   2068 
   2069 template<typename _Tp> static inline
   2070 Scalar_<_Tp> operator * (const Scalar_<_Tp>& a, _Tp alpha)
   2071 {
   2072     return Scalar_<_Tp>(a.val[0] * alpha,
   2073                         a.val[1] * alpha,
   2074                         a.val[2] * alpha,
   2075                         a.val[3] * alpha);
   2076 }
   2077 
   2078 template<typename _Tp> static inline
   2079 Scalar_<_Tp> operator * (_Tp alpha, const Scalar_<_Tp>& a)
   2080 {
   2081     return a*alpha;
   2082 }
   2083 
   2084 template<typename _Tp> static inline
   2085 Scalar_<_Tp> operator - (const Scalar_<_Tp>& a)
   2086 {
   2087     return Scalar_<_Tp>(saturate_cast<_Tp>(-a.val[0]),
   2088                         saturate_cast<_Tp>(-a.val[1]),
   2089                         saturate_cast<_Tp>(-a.val[2]),
   2090                         saturate_cast<_Tp>(-a.val[3]));
   2091 }
   2092 
   2093 
   2094 template<typename _Tp> static inline
   2095 Scalar_<_Tp> operator * (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2096 {
   2097     return Scalar_<_Tp>(saturate_cast<_Tp>(a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3]),
   2098                         saturate_cast<_Tp>(a[0]*b[1] + a[1]*b[0] + a[2]*b[3] - a[3]*b[2]),
   2099                         saturate_cast<_Tp>(a[0]*b[2] - a[1]*b[3] + a[2]*b[0] + a[3]*b[1]),
   2100                         saturate_cast<_Tp>(a[0]*b[3] + a[1]*b[2] - a[2]*b[1] + a[3]*b[0]));
   2101 }
   2102 
   2103 template<typename _Tp> static inline
   2104 Scalar_<_Tp>& operator *= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2105 {
   2106     a = a * b;
   2107     return a;
   2108 }
   2109 
   2110 template<typename _Tp> static inline
   2111 Scalar_<_Tp> operator / (const Scalar_<_Tp>& a, _Tp alpha)
   2112 {
   2113     return Scalar_<_Tp>(a.val[0] / alpha,
   2114                         a.val[1] / alpha,
   2115                         a.val[2] / alpha,
   2116                         a.val[3] / alpha);
   2117 }
   2118 
   2119 template<typename _Tp> static inline
   2120 Scalar_<float> operator / (const Scalar_<float>& a, float alpha)
   2121 {
   2122     float s = 1 / alpha;
   2123     return Scalar_<float>(a.val[0] * s, a.val[1] * s, a.val[2] * s, a.val[3] * s);
   2124 }
   2125 
   2126 template<typename _Tp> static inline
   2127 Scalar_<double> operator / (const Scalar_<double>& a, double alpha)
   2128 {
   2129     double s = 1 / alpha;
   2130     return Scalar_<double>(a.val[0] * s, a.val[1] * s, a.val[2] * s, a.val[3] * s);
   2131 }
   2132 
   2133 template<typename _Tp> static inline
   2134 Scalar_<_Tp>& operator /= (Scalar_<_Tp>& a, _Tp alpha)
   2135 {
   2136     a = a / alpha;
   2137     return a;
   2138 }
   2139 
   2140 template<typename _Tp> static inline
   2141 Scalar_<_Tp> operator / (_Tp a, const Scalar_<_Tp>& b)
   2142 {
   2143     _Tp s = a / (b[0]*b[0] + b[1]*b[1] + b[2]*b[2] + b[3]*b[3]);
   2144     return b.conj() * s;
   2145 }
   2146 
   2147 template<typename _Tp> static inline
   2148 Scalar_<_Tp> operator / (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2149 {
   2150     return a * ((_Tp)1 / b);
   2151 }
   2152 
   2153 template<typename _Tp> static inline
   2154 Scalar_<_Tp>& operator /= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
   2155 {
   2156     a = a / b;
   2157     return a;
   2158 }
   2159 
   2160 template<typename _Tp> static inline
   2161 Scalar operator * (const Matx<_Tp, 4, 4>& a, const Scalar& b)
   2162 {
   2163     Matx<double, 4, 1> c((Matx<double, 4, 4>)a, b, Matx_MatMulOp());
   2164     return reinterpret_cast<const Scalar&>(c);
   2165 }
   2166 
   2167 template<> inline
   2168 Scalar operator * (const Matx<double, 4, 4>& a, const Scalar& b)
   2169 {
   2170     Matx<double, 4, 1> c(a, b, Matx_MatMulOp());
   2171     return reinterpret_cast<const Scalar&>(c);
   2172 }
   2173 
   2174 
   2175 
   2176 //////////////////////////////// KeyPoint ///////////////////////////////
   2177 
   2178 inline
   2179 KeyPoint::KeyPoint()
   2180     : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {}
   2181 
   2182 inline
   2183 KeyPoint::KeyPoint(Point2f _pt, float _size, float _angle, float _response, int _octave, int _class_id)
   2184     : pt(_pt), size(_size), angle(_angle), response(_response), octave(_octave), class_id(_class_id) {}
   2185 
   2186 inline
   2187 KeyPoint::KeyPoint(float x, float y, float _size, float _angle, float _response, int _octave, int _class_id)
   2188     : pt(x, y), size(_size), angle(_angle), response(_response), octave(_octave), class_id(_class_id) {}
   2189 
   2190 
   2191 
   2192 ///////////////////////////////// DMatch ////////////////////////////////
   2193 
   2194 inline
   2195 DMatch::DMatch()
   2196     : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(FLT_MAX) {}
   2197 
   2198 inline
   2199 DMatch::DMatch(int _queryIdx, int _trainIdx, float _distance)
   2200     : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {}
   2201 
   2202 inline
   2203 DMatch::DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance)
   2204     : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {}
   2205 
   2206 inline
   2207 bool DMatch::operator < (const DMatch &m) const
   2208 {
   2209     return distance < m.distance;
   2210 }
   2211 
   2212 
   2213 
   2214 ////////////////////////////// TermCriteria /////////////////////////////
   2215 
   2216 inline
   2217 TermCriteria::TermCriteria()
   2218     : type(0), maxCount(0), epsilon(0) {}
   2219 
   2220 inline
   2221 TermCriteria::TermCriteria(int _type, int _maxCount, double _epsilon)
   2222     : type(_type), maxCount(_maxCount), epsilon(_epsilon) {}
   2223 
   2224 //! @endcond
   2225 
   2226 } // cv
   2227 
   2228 #endif //__OPENCV_CORE_TYPES_HPP__
   2229