~paparazzi-uav/paparazzi/v5.0-manual

« back to all changes in this revision

Viewing changes to sw/ext/opencv_bebop/opencv/modules/core/include/opencv2/core/types.hpp

  • Committer: Paparazzi buildbot
  • Date: 2016-05-18 15:00:29 UTC
  • Revision ID: felix.ruess+docbot@gmail.com-20160518150029-e8lgzi5kvb4p7un9
Manual import commit 4b8bbb730080dac23cf816b98908dacfabe2a8ec from v5.0 branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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__