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_MAT_HPP__
     45 #define __OPENCV_CORE_MAT_HPP__
     46 
     47 #ifndef __cplusplus
     48 #  error mat.hpp header must be compiled as C++
     49 #endif
     50 
     51 #include "opencv2/core/matx.hpp"
     52 #include "opencv2/core/types.hpp"
     53 
     54 #include "opencv2/core/bufferpool.hpp"
     55 
     56 namespace cv
     57 {
     58 
     59 //! @addtogroup core_basic
     60 //! @{
     61 
     62 enum { ACCESS_READ=1<<24, ACCESS_WRITE=1<<25,
     63     ACCESS_RW=3<<24, ACCESS_MASK=ACCESS_RW, ACCESS_FAST=1<<26 };
     64 
     65 class CV_EXPORTS _OutputArray;
     66 
     67 //////////////////////// Input/Output Array Arguments /////////////////////////////////
     68 
     69 /** @brief This is the proxy class for passing read-only input arrays into OpenCV functions.
     70 
     71 It is defined as:
     72 @code
     73     typedef const _InputArray& InputArray;
     74 @endcode
     75 where _InputArray is a class that can be constructed from `Mat`, `Mat_<T>`, `Matx<T, m, n>`,
     76 `std::vector<T>`, `std::vector<std::vector<T> >` or `std::vector<Mat>`. It can also be constructed
     77 from a matrix expression.
     78 
     79 Since this is mostly implementation-level class, and its interface may change in future versions, we
     80 do not describe it in details. There are a few key things, though, that should be kept in mind:
     81 
     82 -   When you see in the reference manual or in OpenCV source code a function that takes
     83     InputArray, it means that you can actually pass `Mat`, `Matx`, `vector<T>` etc. (see above the
     84     complete list).
     85 -   Optional input arguments: If some of the input arrays may be empty, pass cv::noArray() (or
     86     simply cv::Mat() as you probably did before).
     87 -   The class is designed solely for passing parameters. That is, normally you *should not*
     88     declare class members, local and global variables of this type.
     89 -   If you want to design your own function or a class method that can operate of arrays of
     90     multiple types, you can use InputArray (or OutputArray) for the respective parameters. Inside
     91     a function you should use _InputArray::getMat() method to construct a matrix header for the
     92     array (without copying data). _InputArray::kind() can be used to distinguish Mat from
     93     `vector<>` etc., but normally it is not needed.
     94 
     95 Here is how you can use a function that takes InputArray :
     96 @code
     97     std::vector<Point2f> vec;
     98     // points or a circle
     99     for( int i = 0; i < 30; i++ )
    100         vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)),
    101                               (float)(100 - 30*sin(i*CV_PI*2/5))));
    102     cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20));
    103 @endcode
    104 That is, we form an STL vector containing points, and apply in-place affine transformation to the
    105 vector using the 2x3 matrix created inline as `Matx<float, 2, 3>` instance.
    106 
    107 Here is how such a function can be implemented (for simplicity, we implement a very specific case of
    108 it, according to the assertion statement inside) :
    109 @code
    110     void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)
    111     {
    112         // get Mat headers for input arrays. This is O(1) operation,
    113         // unless _src and/or _m are matrix expressions.
    114         Mat src = _src.getMat(), m = _m.getMat();
    115         CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );
    116 
    117         // [re]create the output array so that it has the proper size and type.
    118         // In case of Mat it calls Mat::create, in case of STL vector it calls vector::resize.
    119         _dst.create(src.size(), src.type());
    120         Mat dst = _dst.getMat();
    121 
    122         for( int i = 0; i < src.rows; i++ )
    123             for( int j = 0; j < src.cols; j++ )
    124             {
    125                 Point2f pt = src.at<Point2f>(i, j);
    126                 dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0)*pt.x +
    127                                                 m.at<float>(0, 1)*pt.y +
    128                                                 m.at<float>(0, 2),
    129                                                 m.at<float>(1, 0)*pt.x +
    130                                                 m.at<float>(1, 1)*pt.y +
    131                                                 m.at<float>(1, 2));
    132             }
    133     }
    134 @endcode
    135 There is another related type, InputArrayOfArrays, which is currently defined as a synonym for
    136 InputArray:
    137 @code
    138     typedef InputArray InputArrayOfArrays;
    139 @endcode
    140 It denotes function arguments that are either vectors of vectors or vectors of matrices. A separate
    141 synonym is needed to generate Python/Java etc. wrappers properly. At the function implementation
    142 level their use is similar, but _InputArray::getMat(idx) should be used to get header for the
    143 idx-th component of the outer vector and _InputArray::size().area() should be used to find the
    144 number of components (vectors/matrices) of the outer vector.
    145  */
    146 class CV_EXPORTS _InputArray
    147 {
    148 public:
    149     enum {
    150         KIND_SHIFT = 16,
    151         FIXED_TYPE = 0x8000 << KIND_SHIFT,
    152         FIXED_SIZE = 0x4000 << KIND_SHIFT,
    153         KIND_MASK = 31 << KIND_SHIFT,
    154 
    155         NONE              = 0 << KIND_SHIFT,
    156         MAT               = 1 << KIND_SHIFT,
    157         MATX              = 2 << KIND_SHIFT,
    158         STD_VECTOR        = 3 << KIND_SHIFT,
    159         STD_VECTOR_VECTOR = 4 << KIND_SHIFT,
    160         STD_VECTOR_MAT    = 5 << KIND_SHIFT,
    161         EXPR              = 6 << KIND_SHIFT,
    162         OPENGL_BUFFER     = 7 << KIND_SHIFT,
    163         CUDA_HOST_MEM     = 8 << KIND_SHIFT,
    164         CUDA_GPU_MAT      = 9 << KIND_SHIFT,
    165         UMAT              =10 << KIND_SHIFT,
    166         STD_VECTOR_UMAT   =11 << KIND_SHIFT,
    167         STD_BOOL_VECTOR   =12 << KIND_SHIFT
    168     };
    169 
    170     _InputArray();
    171     _InputArray(int _flags, void* _obj);
    172     _InputArray(const Mat& m);
    173     _InputArray(const MatExpr& expr);
    174     _InputArray(const std::vector<Mat>& vec);
    175     template<typename _Tp> _InputArray(const Mat_<_Tp>& m);
    176     template<typename _Tp> _InputArray(const std::vector<_Tp>& vec);
    177     _InputArray(const std::vector<bool>& vec);
    178     template<typename _Tp> _InputArray(const std::vector<std::vector<_Tp> >& vec);
    179     template<typename _Tp> _InputArray(const std::vector<Mat_<_Tp> >& vec);
    180     template<typename _Tp> _InputArray(const _Tp* vec, int n);
    181     template<typename _Tp, int m, int n> _InputArray(const Matx<_Tp, m, n>& matx);
    182     _InputArray(const double& val);
    183     _InputArray(const cuda::GpuMat& d_mat);
    184     _InputArray(const ogl::Buffer& buf);
    185     _InputArray(const cuda::HostMem& cuda_mem);
    186     template<typename _Tp> _InputArray(const cudev::GpuMat_<_Tp>& m);
    187     _InputArray(const UMat& um);
    188     _InputArray(const std::vector<UMat>& umv);
    189 
    190     Mat getMat(int idx=-1) const;
    191     Mat getMat_(int idx=-1) const;
    192     UMat getUMat(int idx=-1) const;
    193     void getMatVector(std::vector<Mat>& mv) const;
    194     void getUMatVector(std::vector<UMat>& umv) const;
    195     cuda::GpuMat getGpuMat() const;
    196     ogl::Buffer getOGlBuffer() const;
    197 
    198     int getFlags() const;
    199     void* getObj() const;
    200     Size getSz() const;
    201 
    202     int kind() const;
    203     int dims(int i=-1) const;
    204     int cols(int i=-1) const;
    205     int rows(int i=-1) const;
    206     Size size(int i=-1) const;
    207     int sizend(int* sz, int i=-1) const;
    208     bool sameSize(const _InputArray& arr) const;
    209     size_t total(int i=-1) const;
    210     int type(int i=-1) const;
    211     int depth(int i=-1) const;
    212     int channels(int i=-1) const;
    213     bool isContinuous(int i=-1) const;
    214     bool isSubmatrix(int i=-1) const;
    215     bool empty() const;
    216     void copyTo(const _OutputArray& arr) const;
    217     void copyTo(const _OutputArray& arr, const _InputArray & mask) const;
    218     size_t offset(int i=-1) const;
    219     size_t step(int i=-1) const;
    220     bool isMat() const;
    221     bool isUMat() const;
    222     bool isMatVector() const;
    223     bool isUMatVector() const;
    224     bool isMatx() const;
    225 
    226     ~_InputArray();
    227 
    228 protected:
    229     int flags;
    230     void* obj;
    231     Size sz;
    232 
    233     void init(int _flags, const void* _obj);
    234     void init(int _flags, const void* _obj, Size _sz);
    235 };
    236 
    237 
    238 /** @brief This type is very similar to InputArray except that it is used for input/output and output function
    239 parameters.
    240 
    241 Just like with InputArray, OpenCV users should not care about OutputArray, they just pass `Mat`,
    242 `vector<T>` etc. to the functions. The same limitation as for `InputArray`: *Do not explicitly
    243 create OutputArray instances* applies here too.
    244 
    245 If you want to make your function polymorphic (i.e. accept different arrays as output parameters),
    246 it is also not very difficult. Take the sample above as the reference. Note that
    247 _OutputArray::create() needs to be called before _OutputArray::getMat(). This way you guarantee
    248 that the output array is properly allocated.
    249 
    250 Optional output parameters. If you do not need certain output array to be computed and returned to
    251 you, pass cv::noArray(), just like you would in the case of optional input array. At the
    252 implementation level, use _OutputArray::needed() to check if certain output array needs to be
    253 computed or not.
    254 
    255 There are several synonyms for OutputArray that are used to assist automatic Python/Java/... wrapper
    256 generators:
    257 @code
    258     typedef OutputArray OutputArrayOfArrays;
    259     typedef OutputArray InputOutputArray;
    260     typedef OutputArray InputOutputArrayOfArrays;
    261 @endcode
    262  */
    263 class CV_EXPORTS _OutputArray : public _InputArray
    264 {
    265 public:
    266     enum
    267     {
    268         DEPTH_MASK_8U = 1 << CV_8U,
    269         DEPTH_MASK_8S = 1 << CV_8S,
    270         DEPTH_MASK_16U = 1 << CV_16U,
    271         DEPTH_MASK_16S = 1 << CV_16S,
    272         DEPTH_MASK_32S = 1 << CV_32S,
    273         DEPTH_MASK_32F = 1 << CV_32F,
    274         DEPTH_MASK_64F = 1 << CV_64F,
    275         DEPTH_MASK_ALL = (DEPTH_MASK_64F<<1)-1,
    276         DEPTH_MASK_ALL_BUT_8S = DEPTH_MASK_ALL & ~DEPTH_MASK_8S,
    277         DEPTH_MASK_FLT = DEPTH_MASK_32F + DEPTH_MASK_64F
    278     };
    279 
    280     _OutputArray();
    281     _OutputArray(int _flags, void* _obj);
    282     _OutputArray(Mat& m);
    283     _OutputArray(std::vector<Mat>& vec);
    284     _OutputArray(cuda::GpuMat& d_mat);
    285     _OutputArray(ogl::Buffer& buf);
    286     _OutputArray(cuda::HostMem& cuda_mem);
    287     template<typename _Tp> _OutputArray(cudev::GpuMat_<_Tp>& m);
    288     template<typename _Tp> _OutputArray(std::vector<_Tp>& vec);
    289     _OutputArray(std::vector<bool>& vec);
    290     template<typename _Tp> _OutputArray(std::vector<std::vector<_Tp> >& vec);
    291     template<typename _Tp> _OutputArray(std::vector<Mat_<_Tp> >& vec);
    292     template<typename _Tp> _OutputArray(Mat_<_Tp>& m);
    293     template<typename _Tp> _OutputArray(_Tp* vec, int n);
    294     template<typename _Tp, int m, int n> _OutputArray(Matx<_Tp, m, n>& matx);
    295     _OutputArray(UMat& m);
    296     _OutputArray(std::vector<UMat>& vec);
    297 
    298     _OutputArray(const Mat& m);
    299     _OutputArray(const std::vector<Mat>& vec);
    300     _OutputArray(const cuda::GpuMat& d_mat);
    301     _OutputArray(const ogl::Buffer& buf);
    302     _OutputArray(const cuda::HostMem& cuda_mem);
    303     template<typename _Tp> _OutputArray(const cudev::GpuMat_<_Tp>& m);
    304     template<typename _Tp> _OutputArray(const std::vector<_Tp>& vec);
    305     template<typename _Tp> _OutputArray(const std::vector<std::vector<_Tp> >& vec);
    306     template<typename _Tp> _OutputArray(const std::vector<Mat_<_Tp> >& vec);
    307     template<typename _Tp> _OutputArray(const Mat_<_Tp>& m);
    308     template<typename _Tp> _OutputArray(const _Tp* vec, int n);
    309     template<typename _Tp, int m, int n> _OutputArray(const Matx<_Tp, m, n>& matx);
    310     _OutputArray(const UMat& m);
    311     _OutputArray(const std::vector<UMat>& vec);
    312 
    313     bool fixedSize() const;
    314     bool fixedType() const;
    315     bool needed() const;
    316     Mat& getMatRef(int i=-1) const;
    317     UMat& getUMatRef(int i=-1) const;
    318     cuda::GpuMat& getGpuMatRef() const;
    319     ogl::Buffer& getOGlBufferRef() const;
    320     cuda::HostMem& getHostMemRef() const;
    321     void create(Size sz, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const;
    322     void create(int rows, int cols, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const;
    323     void create(int dims, const int* size, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const;
    324     void createSameSize(const _InputArray& arr, int mtype) const;
    325     void release() const;
    326     void clear() const;
    327     void setTo(const _InputArray& value, const _InputArray & mask = _InputArray()) const;
    328 
    329     void assign(const UMat& u) const;
    330     void assign(const Mat& m) const;
    331 };
    332 
    333 
    334 class CV_EXPORTS _InputOutputArray : public _OutputArray
    335 {
    336 public:
    337     _InputOutputArray();
    338     _InputOutputArray(int _flags, void* _obj);
    339     _InputOutputArray(Mat& m);
    340     _InputOutputArray(std::vector<Mat>& vec);
    341     _InputOutputArray(cuda::GpuMat& d_mat);
    342     _InputOutputArray(ogl::Buffer& buf);
    343     _InputOutputArray(cuda::HostMem& cuda_mem);
    344     template<typename _Tp> _InputOutputArray(cudev::GpuMat_<_Tp>& m);
    345     template<typename _Tp> _InputOutputArray(std::vector<_Tp>& vec);
    346     _InputOutputArray(std::vector<bool>& vec);
    347     template<typename _Tp> _InputOutputArray(std::vector<std::vector<_Tp> >& vec);
    348     template<typename _Tp> _InputOutputArray(std::vector<Mat_<_Tp> >& vec);
    349     template<typename _Tp> _InputOutputArray(Mat_<_Tp>& m);
    350     template<typename _Tp> _InputOutputArray(_Tp* vec, int n);
    351     template<typename _Tp, int m, int n> _InputOutputArray(Matx<_Tp, m, n>& matx);
    352     _InputOutputArray(UMat& m);
    353     _InputOutputArray(std::vector<UMat>& vec);
    354 
    355     _InputOutputArray(const Mat& m);
    356     _InputOutputArray(const std::vector<Mat>& vec);
    357     _InputOutputArray(const cuda::GpuMat& d_mat);
    358     _InputOutputArray(const ogl::Buffer& buf);
    359     _InputOutputArray(const cuda::HostMem& cuda_mem);
    360     template<typename _Tp> _InputOutputArray(const cudev::GpuMat_<_Tp>& m);
    361     template<typename _Tp> _InputOutputArray(const std::vector<_Tp>& vec);
    362     template<typename _Tp> _InputOutputArray(const std::vector<std::vector<_Tp> >& vec);
    363     template<typename _Tp> _InputOutputArray(const std::vector<Mat_<_Tp> >& vec);
    364     template<typename _Tp> _InputOutputArray(const Mat_<_Tp>& m);
    365     template<typename _Tp> _InputOutputArray(const _Tp* vec, int n);
    366     template<typename _Tp, int m, int n> _InputOutputArray(const Matx<_Tp, m, n>& matx);
    367     _InputOutputArray(const UMat& m);
    368     _InputOutputArray(const std::vector<UMat>& vec);
    369 };
    370 
    371 typedef const _InputArray& InputArray;
    372 typedef InputArray InputArrayOfArrays;
    373 typedef const _OutputArray& OutputArray;
    374 typedef OutputArray OutputArrayOfArrays;
    375 typedef const _InputOutputArray& InputOutputArray;
    376 typedef InputOutputArray InputOutputArrayOfArrays;
    377 
    378 CV_EXPORTS InputOutputArray noArray();
    379 
    380 /////////////////////////////////// MatAllocator //////////////////////////////////////
    381 
    382 //! Usage flags for allocator
    383 enum UMatUsageFlags
    384 {
    385     USAGE_DEFAULT = 0,
    386 
    387     // buffer allocation policy is platform and usage specific
    388     USAGE_ALLOCATE_HOST_MEMORY = 1 << 0,
    389     USAGE_ALLOCATE_DEVICE_MEMORY = 1 << 1,
    390     USAGE_ALLOCATE_SHARED_MEMORY = 1 << 2, // It is not equal to: USAGE_ALLOCATE_HOST_MEMORY | USAGE_ALLOCATE_DEVICE_MEMORY
    391 
    392     __UMAT_USAGE_FLAGS_32BIT = 0x7fffffff // Binary compatibility hint
    393 };
    394 
    395 struct CV_EXPORTS UMatData;
    396 
    397 /** @brief  Custom array allocator
    398 */
    399 class CV_EXPORTS MatAllocator
    400 {
    401 public:
    402     MatAllocator() {}
    403     virtual ~MatAllocator() {}
    404 
    405     // let's comment it off for now to detect and fix all the uses of allocator
    406     //virtual void allocate(int dims, const int* sizes, int type, int*& refcount,
    407     //                      uchar*& datastart, uchar*& data, size_t* step) = 0;
    408     //virtual void deallocate(int* refcount, uchar* datastart, uchar* data) = 0;
    409     virtual UMatData* allocate(int dims, const int* sizes, int type,
    410                                void* data, size_t* step, int flags, UMatUsageFlags usageFlags) const = 0;
    411     virtual bool allocate(UMatData* data, int accessflags, UMatUsageFlags usageFlags) const = 0;
    412     virtual void deallocate(UMatData* data) const = 0;
    413     virtual void map(UMatData* data, int accessflags) const;
    414     virtual void unmap(UMatData* data) const;
    415     virtual void download(UMatData* data, void* dst, int dims, const size_t sz[],
    416                           const size_t srcofs[], const size_t srcstep[],
    417                           const size_t dststep[]) const;
    418     virtual void upload(UMatData* data, const void* src, int dims, const size_t sz[],
    419                         const size_t dstofs[], const size_t dststep[],
    420                         const size_t srcstep[]) const;
    421     virtual void copy(UMatData* srcdata, UMatData* dstdata, int dims, const size_t sz[],
    422                       const size_t srcofs[], const size_t srcstep[],
    423                       const size_t dstofs[], const size_t dststep[], bool sync) const;
    424 
    425     // default implementation returns DummyBufferPoolController
    426     virtual BufferPoolController* getBufferPoolController(const char* id = NULL) const;
    427 };
    428 
    429 
    430 //////////////////////////////// MatCommaInitializer //////////////////////////////////
    431 
    432 /** @brief  Comma-separated Matrix Initializer
    433 
    434  The class instances are usually not created explicitly.
    435  Instead, they are created on "matrix << firstValue" operator.
    436 
    437  The sample below initializes 2x2 rotation matrix:
    438 
    439  \code
    440  double angle = 30, a = cos(angle*CV_PI/180), b = sin(angle*CV_PI/180);
    441  Mat R = (Mat_<double>(2,2) << a, -b, b, a);
    442  \endcode
    443 */
    444 template<typename _Tp> class MatCommaInitializer_
    445 {
    446 public:
    447     //! the constructor, created by "matrix << firstValue" operator, where matrix is cv::Mat
    448     MatCommaInitializer_(Mat_<_Tp>* _m);
    449     //! the operator that takes the next value and put it to the matrix
    450     template<typename T2> MatCommaInitializer_<_Tp>& operator , (T2 v);
    451     //! another form of conversion operator
    452     operator Mat_<_Tp>() const;
    453 protected:
    454     MatIterator_<_Tp> it;
    455 };
    456 
    457 
    458 /////////////////////////////////////// Mat ///////////////////////////////////////////
    459 
    460 // note that umatdata might be allocated together
    461 // with the matrix data, not as a separate object.
    462 // therefore, it does not have constructor or destructor;
    463 // it should be explicitly initialized using init().
    464 struct CV_EXPORTS UMatData
    465 {
    466     enum { COPY_ON_MAP=1, HOST_COPY_OBSOLETE=2,
    467         DEVICE_COPY_OBSOLETE=4, TEMP_UMAT=8, TEMP_COPIED_UMAT=24,
    468         USER_ALLOCATED=32, DEVICE_MEM_MAPPED=64};
    469     UMatData(const MatAllocator* allocator);
    470     ~UMatData();
    471 
    472     // provide atomic access to the structure
    473     void lock();
    474     void unlock();
    475 
    476     bool hostCopyObsolete() const;
    477     bool deviceCopyObsolete() const;
    478     bool deviceMemMapped() const;
    479     bool copyOnMap() const;
    480     bool tempUMat() const;
    481     bool tempCopiedUMat() const;
    482     void markHostCopyObsolete(bool flag);
    483     void markDeviceCopyObsolete(bool flag);
    484     void markDeviceMemMapped(bool flag);
    485 
    486     const MatAllocator* prevAllocator;
    487     const MatAllocator* currAllocator;
    488     int urefcount;
    489     int refcount;
    490     uchar* data;
    491     uchar* origdata;
    492     size_t size;
    493 
    494     int flags;
    495     void* handle;
    496     void* userdata;
    497     int allocatorFlags_;
    498 };
    499 
    500 
    501 struct CV_EXPORTS UMatDataAutoLock
    502 {
    503     explicit UMatDataAutoLock(UMatData* u);
    504     ~UMatDataAutoLock();
    505     UMatData* u;
    506 };
    507 
    508 
    509 struct CV_EXPORTS MatSize
    510 {
    511     explicit MatSize(int* _p);
    512     Size operator()() const;
    513     const int& operator[](int i) const;
    514     int& operator[](int i);
    515     operator const int*() const;
    516     bool operator == (const MatSize& sz) const;
    517     bool operator != (const MatSize& sz) const;
    518 
    519     int* p;
    520 };
    521 
    522 struct CV_EXPORTS MatStep
    523 {
    524     MatStep();
    525     explicit MatStep(size_t s);
    526     const size_t& operator[](int i) const;
    527     size_t& operator[](int i);
    528     operator size_t() const;
    529     MatStep& operator = (size_t s);
    530 
    531     size_t* p;
    532     size_t buf[2];
    533 protected:
    534     MatStep& operator = (const MatStep&);
    535 };
    536 
    537 /** @example cout_mat.cpp
    538 An example demonstrating the serial out capabilities of cv::Mat
    539 */
    540 
    541  /** @brief n-dimensional dense array class
    542 
    543 The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It
    544 can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel
    545 volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms
    546 may be better stored in a SparseMat ). The data layout of the array `M` is defined by the array
    547 `M.step[]`, so that the address of element \f$(i_0,...,i_{M.dims-1})\f$, where \f$0\leq i_k<M.size[k]\f$, is
    548 computed as:
    549 \f[addr(M_{i_0,...,i_{M.dims-1}}) = M.data + M.step[0]*i_0 + M.step[1]*i_1 + ... + M.step[M.dims-1]*i_{M.dims-1}\f]
    550 In case of a 2-dimensional array, the above formula is reduced to:
    551 \f[addr(M_{i,j}) = M.data + M.step[0]*i + M.step[1]*j\f]
    552 Note that `M.step[i] >= M.step[i+1]` (in fact, `M.step[i] >= M.step[i+1]*M.size[i+1]` ). This means
    553 that 2-dimensional matrices are stored row-by-row, 3-dimensional matrices are stored plane-by-plane,
    554 and so on. M.step[M.dims-1] is minimal and always equal to the element size M.elemSize() .
    555 
    556 So, the data layout in Mat is fully compatible with CvMat, IplImage, and CvMatND types from OpenCV
    557 1.x. It is also compatible with the majority of dense array types from the standard toolkits and
    558 SDKs, such as Numpy (ndarray), Win32 (independent device bitmaps), and others, that is, with any
    559 array that uses *steps* (or *strides*) to compute the position of a pixel. Due to this
    560 compatibility, it is possible to make a Mat header for user-allocated data and process it in-place
    561 using OpenCV functions.
    562 
    563 There are many different ways to create a Mat object. The most popular options are listed below:
    564 
    565 - Use the create(nrows, ncols, type) method or the similar Mat(nrows, ncols, type[, fillValue])
    566 constructor. A new array of the specified size and type is allocated. type has the same meaning as
    567 in the cvCreateMat method. For example, CV_8UC1 means a 8-bit single-channel array, CV_32FC2
    568 means a 2-channel (complex) floating-point array, and so on.
    569 @code
    570     // make a 7x7 complex matrix filled with 1+3j.
    571     Mat M(7,7,CV_32FC2,Scalar(1,3));
    572     // and now turn M to a 100x60 15-channel 8-bit matrix.
    573     // The old content will be deallocated
    574     M.create(100,60,CV_8UC(15));
    575 @endcode
    576 As noted in the introduction to this chapter, create() allocates only a new array when the shape
    577 or type of the current array are different from the specified ones.
    578 
    579 - Create a multi-dimensional array:
    580 @code
    581     // create a 100x100x100 8-bit array
    582     int sz[] = {100, 100, 100};
    583     Mat bigCube(3, sz, CV_8U, Scalar::all(0));
    584 @endcode
    585 It passes the number of dimensions =1 to the Mat constructor but the created array will be
    586 2-dimensional with the number of columns set to 1. So, Mat::dims is always \>= 2 (can also be 0
    587 when the array is empty).
    588 
    589 - Use a copy constructor or assignment operator where there can be an array or expression on the
    590 right side (see below). As noted in the introduction, the array assignment is an O(1) operation
    591 because it only copies the header and increases the reference counter. The Mat::clone() method can
    592 be used to get a full (deep) copy of the array when you need it.
    593 
    594 - Construct a header for a part of another array. It can be a single row, single column, several
    595 rows, several columns, rectangular region in the array (called a *minor* in algebra) or a
    596 diagonal. Such operations are also O(1) because the new header references the same data. You can
    597 actually modify a part of the array using this feature, for example:
    598 @code
    599     // add the 5-th row, multiplied by 3 to the 3rd row
    600     M.row(3) = M.row(3) + M.row(5)*3;
    601     // now copy the 7-th column to the 1-st column
    602     // M.col(1) = M.col(7); // this will not work
    603     Mat M1 = M.col(1);
    604     M.col(7).copyTo(M1);
    605     // create a new 320x240 image
    606     Mat img(Size(320,240),CV_8UC3);
    607     // select a ROI
    608     Mat roi(img, Rect(10,10,100,100));
    609     // fill the ROI with (0,255,0) (which is green in RGB space);
    610     // the original 320x240 image will be modified
    611     roi = Scalar(0,255,0);
    612 @endcode
    613 Due to the additional datastart and dataend members, it is possible to compute a relative
    614 sub-array position in the main *container* array using locateROI():
    615 @code
    616     Mat A = Mat::eye(10, 10, CV_32S);
    617     // extracts A columns, 1 (inclusive) to 3 (exclusive).
    618     Mat B = A(Range::all(), Range(1, 3));
    619     // extracts B rows, 5 (inclusive) to 9 (exclusive).
    620     // that is, C \~ A(Range(5, 9), Range(1, 3))
    621     Mat C = B(Range(5, 9), Range::all());
    622     Size size; Point ofs;
    623     C.locateROI(size, ofs);
    624     // size will be (width=10,height=10) and the ofs will be (x=1, y=5)
    625 @endcode
    626 As in case of whole matrices, if you need a deep copy, use the `clone()` method of the extracted
    627 sub-matrices.
    628 
    629 - Make a header for user-allocated data. It can be useful to do the following:
    630     -# Process "foreign" data using OpenCV (for example, when you implement a DirectShow\* filter or
    631     a processing module for gstreamer, and so on). For example:
    632     @code
    633         void process_video_frame(const unsigned char* pixels,
    634                                  int width, int height, int step)
    635         {
    636             Mat img(height, width, CV_8UC3, pixels, step);
    637             GaussianBlur(img, img, Size(7,7), 1.5, 1.5);
    638         }
    639     @endcode
    640     -# Quickly initialize small matrices and/or get a super-fast element access.
    641     @code
    642         double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
    643         Mat M = Mat(3, 3, CV_64F, m).inv();
    644     @endcode
    645     .
    646     Partial yet very common cases of this *user-allocated data* case are conversions from CvMat and
    647     IplImage to Mat. For this purpose, there is function cv::cvarrToMat taking pointers to CvMat or
    648     IplImage and the optional flag indicating whether to copy the data or not.
    649     @snippet samples/cpp/image.cpp iplimage
    650 
    651 - Use MATLAB-style array initializers, zeros(), ones(), eye(), for example:
    652 @code
    653     // create a double-precision identity martix and add it to M.
    654     M += Mat::eye(M.rows, M.cols, CV_64F);
    655 @endcode
    656 
    657 - Use a comma-separated initializer:
    658 @code
    659     // create a 3x3 double-precision identity matrix
    660     Mat M = (Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
    661 @endcode
    662 With this approach, you first call a constructor of the Mat class with the proper parameters, and
    663 then you just put `<< operator` followed by comma-separated values that can be constants,
    664 variables, expressions, and so on. Also, note the extra parentheses required to avoid compilation
    665 errors.
    666 
    667 Once the array is created, it is automatically managed via a reference-counting mechanism. If the
    668 array header is built on top of user-allocated data, you should handle the data by yourself. The
    669 array data is deallocated when no one points to it. If you want to release the data pointed by a
    670 array header before the array destructor is called, use Mat::release().
    671 
    672 The next important thing to learn about the array class is element access. This manual already
    673 described how to compute an address of each array element. Normally, you are not required to use the
    674 formula directly in the code. If you know the array element type (which can be retrieved using the
    675 method Mat::type() ), you can access the element \f$M_{ij}\f$ of a 2-dimensional array as:
    676 @code
    677     M.at<double>(i,j) += 1.f;
    678 @endcode
    679 assuming that `M` is a double-precision floating-point array. There are several variants of the method
    680 at for a different number of dimensions.
    681 
    682 If you need to process a whole row of a 2D array, the most efficient way is to get the pointer to
    683 the row first, and then just use the plain C operator [] :
    684 @code
    685     // compute sum of positive matrix elements
    686     // (assuming that M isa double-precision matrix)
    687     double sum=0;
    688     for(int i = 0; i < M.rows; i++)
    689     {
    690         const double* Mi = M.ptr<double>(i);
    691         for(int j = 0; j < M.cols; j++)
    692             sum += std::max(Mi[j], 0.);
    693     }
    694 @endcode
    695 Some operations, like the one above, do not actually depend on the array shape. They just process
    696 elements of an array one by one (or elements from multiple arrays that have the same coordinates,
    697 for example, array addition). Such operations are called *element-wise*. It makes sense to check
    698 whether all the input/output arrays are continuous, namely, have no gaps at the end of each row. If
    699 yes, process them as a long single row:
    700 @code
    701     // compute the sum of positive matrix elements, optimized variant
    702     double sum=0;
    703     int cols = M.cols, rows = M.rows;
    704     if(M.isContinuous())
    705     {
    706         cols *= rows;
    707         rows = 1;
    708     }
    709     for(int i = 0; i < rows; i++)
    710     {
    711         const double* Mi = M.ptr<double>(i);
    712         for(int j = 0; j < cols; j++)
    713             sum += std::max(Mi[j], 0.);
    714     }
    715 @endcode
    716 In case of the continuous matrix, the outer loop body is executed just once. So, the overhead is
    717 smaller, which is especially noticeable in case of small matrices.
    718 
    719 Finally, there are STL-style iterators that are smart enough to skip gaps between successive rows:
    720 @code
    721     // compute sum of positive matrix elements, iterator-based variant
    722     double sum=0;
    723     MatConstIterator_<double> it = M.begin<double>(), it_end = M.end<double>();
    724     for(; it != it_end; ++it)
    725         sum += std::max(*it, 0.);
    726 @endcode
    727 The matrix iterators are random-access iterators, so they can be passed to any STL algorithm,
    728 including std::sort().
    729 */
    730 class CV_EXPORTS Mat
    731 {
    732 public:
    733     /**
    734     These are various constructors that form a matrix. As noted in the AutomaticAllocation, often
    735     the default constructor is enough, and the proper matrix will be allocated by an OpenCV function.
    736     The constructed matrix can further be assigned to another matrix or matrix expression or can be
    737     allocated with Mat::create . In the former case, the old content is de-referenced.
    738      */
    739     Mat();
    740 
    741     /** @overload
    742     @param rows Number of rows in a 2D array.
    743     @param cols Number of columns in a 2D array.
    744     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    745     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    746     */
    747     Mat(int rows, int cols, int type);
    748 
    749     /** @overload
    750     @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the
    751     number of columns go in the reverse order.
    752     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    753     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    754       */
    755     Mat(Size size, int type);
    756 
    757     /** @overload
    758     @param rows Number of rows in a 2D array.
    759     @param cols Number of columns in a 2D array.
    760     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    761     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    762     @param s An optional value to initialize each matrix element with. To set all the matrix elements to
    763     the particular value after the construction, use the assignment operator
    764     Mat::operator=(const Scalar& value) .
    765     */
    766     Mat(int rows, int cols, int type, const Scalar& s);
    767 
    768     /** @overload
    769     @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the
    770     number of columns go in the reverse order.
    771     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    772     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    773     @param s An optional value to initialize each matrix element with. To set all the matrix elements to
    774     the particular value after the construction, use the assignment operator
    775     Mat::operator=(const Scalar& value) .
    776       */
    777     Mat(Size size, int type, const Scalar& s);
    778 
    779     /** @overload
    780     @param ndims Array dimensionality.
    781     @param sizes Array of integers specifying an n-dimensional array shape.
    782     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    783     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    784     */
    785     Mat(int ndims, const int* sizes, int type);
    786 
    787     /** @overload
    788     @param ndims Array dimensionality.
    789     @param sizes Array of integers specifying an n-dimensional array shape.
    790     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    791     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    792     @param s An optional value to initialize each matrix element with. To set all the matrix elements to
    793     the particular value after the construction, use the assignment operator
    794     Mat::operator=(const Scalar& value) .
    795     */
    796     Mat(int ndims, const int* sizes, int type, const Scalar& s);
    797 
    798     /** @overload
    799     @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied
    800     by these constructors. Instead, the header pointing to m data or its sub-array is constructed and
    801     associated with it. The reference counter, if any, is incremented. So, when you modify the matrix
    802     formed using such a constructor, you also modify the corresponding elements of m . If you want to
    803     have an independent copy of the sub-array, use Mat::clone() .
    804     */
    805     Mat(const Mat& m);
    806 
    807     /** @overload
    808     @param rows Number of rows in a 2D array.
    809     @param cols Number of columns in a 2D array.
    810     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    811     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    812     @param data Pointer to the user data. Matrix constructors that take data and step parameters do not
    813     allocate matrix data. Instead, they just initialize the matrix header that points to the specified
    814     data, which means that no data is copied. This operation is very efficient and can be used to
    815     process external data using OpenCV functions. The external data is not automatically deallocated, so
    816     you should take care of it.
    817     @param step Number of bytes each matrix row occupies. The value should include the padding bytes at
    818     the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed
    819     and the actual step is calculated as cols*elemSize(). See Mat::elemSize.
    820     */
    821     Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
    822 
    823     /** @overload
    824     @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the
    825     number of columns go in the reverse order.
    826     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    827     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    828     @param data Pointer to the user data. Matrix constructors that take data and step parameters do not
    829     allocate matrix data. Instead, they just initialize the matrix header that points to the specified
    830     data, which means that no data is copied. This operation is very efficient and can be used to
    831     process external data using OpenCV functions. The external data is not automatically deallocated, so
    832     you should take care of it.
    833     @param step Number of bytes each matrix row occupies. The value should include the padding bytes at
    834     the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed
    835     and the actual step is calculated as cols*elemSize(). See Mat::elemSize.
    836     */
    837     Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
    838 
    839     /** @overload
    840     @param ndims Array dimensionality.
    841     @param sizes Array of integers specifying an n-dimensional array shape.
    842     @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    843     CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    844     @param data Pointer to the user data. Matrix constructors that take data and step parameters do not
    845     allocate matrix data. Instead, they just initialize the matrix header that points to the specified
    846     data, which means that no data is copied. This operation is very efficient and can be used to
    847     process external data using OpenCV functions. The external data is not automatically deallocated, so
    848     you should take care of it.
    849     @param steps Array of ndims-1 steps in case of a multi-dimensional array (the last step is always
    850     set to the element size). If not specified, the matrix is assumed to be continuous.
    851     */
    852     Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
    853 
    854     /** @overload
    855     @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied
    856     by these constructors. Instead, the header pointing to m data or its sub-array is constructed and
    857     associated with it. The reference counter, if any, is incremented. So, when you modify the matrix
    858     formed using such a constructor, you also modify the corresponding elements of m . If you want to
    859     have an independent copy of the sub-array, use Mat::clone() .
    860     @param rowRange Range of the m rows to take. As usual, the range start is inclusive and the range
    861     end is exclusive. Use Range::all() to take all the rows.
    862     @param colRange Range of the m columns to take. Use Range::all() to take all the columns.
    863     */
    864     Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all());
    865 
    866     /** @overload
    867     @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied
    868     by these constructors. Instead, the header pointing to m data or its sub-array is constructed and
    869     associated with it. The reference counter, if any, is incremented. So, when you modify the matrix
    870     formed using such a constructor, you also modify the corresponding elements of m . If you want to
    871     have an independent copy of the sub-array, use Mat::clone() .
    872     @param roi Region of interest.
    873     */
    874     Mat(const Mat& m, const Rect& roi);
    875 
    876     /** @overload
    877     @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied
    878     by these constructors. Instead, the header pointing to m data or its sub-array is constructed and
    879     associated with it. The reference counter, if any, is incremented. So, when you modify the matrix
    880     formed using such a constructor, you also modify the corresponding elements of m . If you want to
    881     have an independent copy of the sub-array, use Mat::clone() .
    882     @param ranges Array of selected ranges of m along each dimensionality.
    883     */
    884     Mat(const Mat& m, const Range* ranges);
    885 
    886     /** @overload
    887     @param vec STL vector whose elements form the matrix. The matrix has a single column and the number
    888     of rows equal to the number of vector elements. Type of the matrix matches the type of vector
    889     elements. The constructor can handle arbitrary types, for which there is a properly declared
    890     DataType . This means that the vector elements must be primitive numbers or uni-type numerical
    891     tuples of numbers. Mixed-type structures are not supported. The corresponding constructor is
    892     explicit. Since STL vectors are not automatically converted to Mat instances, you should write
    893     Mat(vec) explicitly. Unless you copy the data into the matrix ( copyData=true ), no new elements
    894     will be added to the vector because it can potentially yield vector data reallocation, and, thus,
    895     the matrix data pointer will be invalid.
    896     @param copyData Flag to specify whether the underlying data of the STL vector should be copied
    897     to (true) or shared with (false) the newly constructed matrix. When the data is copied, the
    898     allocated buffer is managed using Mat reference counting mechanism. While the data is shared,
    899     the reference counter is NULL, and you should not deallocate the data until the matrix is not
    900     destructed.
    901     */
    902     template<typename _Tp> explicit Mat(const std::vector<_Tp>& vec, bool copyData=false);
    903 
    904     /** @overload
    905     */
    906     template<typename _Tp, int n> explicit Mat(const Vec<_Tp, n>& vec, bool copyData=true);
    907 
    908     /** @overload
    909     */
    910     template<typename _Tp, int m, int n> explicit Mat(const Matx<_Tp, m, n>& mtx, bool copyData=true);
    911 
    912     /** @overload
    913     */
    914     template<typename _Tp> explicit Mat(const Point_<_Tp>& pt, bool copyData=true);
    915 
    916     /** @overload
    917     */
    918     template<typename _Tp> explicit Mat(const Point3_<_Tp>& pt, bool copyData=true);
    919 
    920     /** @overload
    921     */
    922     template<typename _Tp> explicit Mat(const MatCommaInitializer_<_Tp>& commaInitializer);
    923 
    924     //! download data from GpuMat
    925     explicit Mat(const cuda::GpuMat& m);
    926 
    927     //! destructor - calls release()
    928     ~Mat();
    929 
    930     /** @brief assignment operators
    931 
    932     These are available assignment operators. Since they all are very different, make sure to read the
    933     operator parameters description.
    934     @param m Assigned, right-hand-side matrix. Matrix assignment is an O(1) operation. This means that
    935     no data is copied but the data is shared and the reference counter, if any, is incremented. Before
    936     assigning new data, the old data is de-referenced via Mat::release .
    937      */
    938     Mat& operator = (const Mat& m);
    939 
    940     /** @overload
    941     @param expr Assigned matrix expression object. As opposite to the first form of the assignment
    942     operation, the second form can reuse already allocated matrix if it has the right size and type to
    943     fit the matrix expression result. It is automatically handled by the real function that the matrix
    944     expressions is expanded to. For example, C=A+B is expanded to add(A, B, C), and add takes care of
    945     automatic C reallocation.
    946     */
    947     Mat& operator = (const MatExpr& expr);
    948 
    949     //! retrieve UMat from Mat
    950     UMat getUMat(int accessFlags, UMatUsageFlags usageFlags = USAGE_DEFAULT) const;
    951 
    952     /** @brief Creates a matrix header for the specified matrix row.
    953 
    954     The method makes a new header for the specified matrix row and returns it. This is an O(1)
    955     operation, regardless of the matrix size. The underlying data of the new matrix is shared with the
    956     original matrix. Here is the example of one of the classical basic matrix processing operations,
    957     axpy, used by LU and many other algorithms:
    958     @code
    959         inline void matrix_axpy(Mat& A, int i, int j, double alpha)
    960         {
    961             A.row(i) += A.row(j)*alpha;
    962         }
    963     @endcode
    964     @note In the current implementation, the following code does not work as expected:
    965     @code
    966         Mat A;
    967         ...
    968         A.row(i) = A.row(j); // will not work
    969     @endcode
    970     This happens because A.row(i) forms a temporary header that is further assigned to another header.
    971     Remember that each of these operations is O(1), that is, no data is copied. Thus, the above
    972     assignment is not true if you may have expected the j-th row to be copied to the i-th row. To
    973     achieve that, you should either turn this simple assignment into an expression or use the
    974     Mat::copyTo method:
    975     @code
    976         Mat A;
    977         ...
    978         // works, but looks a bit obscure.
    979         A.row(i) = A.row(j) + 0;
    980         // this is a bit longer, but the recommended method.
    981         A.row(j).copyTo(A.row(i));
    982     @endcode
    983     @param y A 0-based row index.
    984      */
    985     Mat row(int y) const;
    986 
    987     /** @brief Creates a matrix header for the specified matrix column.
    988 
    989     The method makes a new header for the specified matrix column and returns it. This is an O(1)
    990     operation, regardless of the matrix size. The underlying data of the new matrix is shared with the
    991     original matrix. See also the Mat::row description.
    992     @param x A 0-based column index.
    993      */
    994     Mat col(int x) const;
    995 
    996     /** @brief Creates a matrix header for the specified row span.
    997 
    998     The method makes a new header for the specified row span of the matrix. Similarly to Mat::row and
    999     Mat::col , this is an O(1) operation.
   1000     @param startrow An inclusive 0-based start index of the row span.
   1001     @param endrow An exclusive 0-based ending index of the row span.
   1002      */
   1003     Mat rowRange(int startrow, int endrow) const;
   1004 
   1005     /** @overload
   1006     @param r Range structure containing both the start and the end indices.
   1007     */
   1008     Mat rowRange(const Range& r) const;
   1009 
   1010     /** @brief Creates a matrix header for the specified column span.
   1011 
   1012     The method makes a new header for the specified column span of the matrix. Similarly to Mat::row and
   1013     Mat::col , this is an O(1) operation.
   1014     @param startcol An inclusive 0-based start index of the column span.
   1015     @param endcol An exclusive 0-based ending index of the column span.
   1016      */
   1017     Mat colRange(int startcol, int endcol) const;
   1018 
   1019     /** @overload
   1020     @param r Range structure containing both the start and the end indices.
   1021     */
   1022     Mat colRange(const Range& r) const;
   1023 
   1024     /** @brief Extracts a diagonal from a matrix
   1025 
   1026     The method makes a new header for the specified matrix diagonal. The new matrix is represented as a
   1027     single-column matrix. Similarly to Mat::row and Mat::col, this is an O(1) operation.
   1028     @param d index of the diagonal, with the following values:
   1029     - `d=0` is the main diagonal.
   1030     - `d>0` is a diagonal from the lower half. For example, d=1 means the diagonal is set
   1031       immediately below the main one.
   1032     - `d<0` is a diagonal from the upper half. For example, d=-1 means the diagonal is set
   1033       immediately above the main one.
   1034      */
   1035     Mat diag(int d=0) const;
   1036 
   1037     /** @brief creates a diagonal matrix
   1038 
   1039     The method makes a new header for the specified matrix diagonal. The new matrix is represented as a
   1040     single-column matrix. Similarly to Mat::row and Mat::col, this is an O(1) operation.
   1041     @param d Single-column matrix that forms a diagonal matrix
   1042      */
   1043     static Mat diag(const Mat& d);
   1044 
   1045     /** @brief Creates a full copy of the array and the underlying data.
   1046 
   1047     The method creates a full copy of the array. The original step[] is not taken into account. So, the
   1048     array copy is a continuous array occupying total()*elemSize() bytes.
   1049      */
   1050     Mat clone() const;
   1051 
   1052     /** @brief Copies the matrix to another one.
   1053 
   1054     The method copies the matrix data to another matrix. Before copying the data, the method invokes :
   1055     @code
   1056         m.create(this->size(), this->type());
   1057     @endcode
   1058     so that the destination matrix is reallocated if needed. While m.copyTo(m); works flawlessly, the
   1059     function does not handle the case of a partial overlap between the source and the destination
   1060     matrices.
   1061 
   1062     When the operation mask is specified, if the Mat::create call shown above reallocates the matrix,
   1063     the newly allocated matrix is initialized with all zeros before copying the data.
   1064     @param m Destination matrix. If it does not have a proper size or type before the operation, it is
   1065     reallocated.
   1066      */
   1067     void copyTo( OutputArray m ) const;
   1068 
   1069     /** @overload
   1070     @param m Destination matrix. If it does not have a proper size or type before the operation, it is
   1071     reallocated.
   1072     @param mask Operation mask. Its non-zero elements indicate which matrix elements need to be copied.
   1073     */
   1074     void copyTo( OutputArray m, InputArray mask ) const;
   1075 
   1076     /** @brief Converts an array to another data type with optional scaling.
   1077 
   1078     The method converts source pixel values to the target data type. saturate_cast\<\> is applied at
   1079     the end to avoid possible overflows:
   1080 
   1081     \f[m(x,y) = saturate \_ cast<rType>( \alpha (*this)(x,y) +  \beta )\f]
   1082     @param m output matrix; if it does not have a proper size or type before the operation, it is
   1083     reallocated.
   1084     @param rtype desired output matrix type or, rather, the depth since the number of channels are the
   1085     same as the input has; if rtype is negative, the output matrix will have the same type as the input.
   1086     @param alpha optional scale factor.
   1087     @param beta optional delta added to the scaled values.
   1088      */
   1089     void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
   1090 
   1091     /** @brief Provides a functional form of convertTo.
   1092 
   1093     This is an internally used method called by the @ref MatrixExpressions engine.
   1094     @param m Destination array.
   1095     @param type Desired destination array depth (or -1 if it should be the same as the source type).
   1096      */
   1097     void assignTo( Mat& m, int type=-1 ) const;
   1098 
   1099     /** @brief Sets all or some of the array elements to the specified value.
   1100     @param s Assigned scalar converted to the actual array type.
   1101     */
   1102     Mat& operator = (const Scalar& s);
   1103 
   1104     /** @brief Sets all or some of the array elements to the specified value.
   1105 
   1106     This is an advanced variant of the Mat::operator=(const Scalar& s) operator.
   1107     @param value Assigned scalar converted to the actual array type.
   1108     @param mask Operation mask of the same size as \*this.
   1109      */
   1110     Mat& setTo(InputArray value, InputArray mask=noArray());
   1111 
   1112     /** @brief Changes the shape and/or the number of channels of a 2D matrix without copying the data.
   1113 
   1114     The method makes a new matrix header for \*this elements. The new matrix may have a different size
   1115     and/or different number of channels. Any combination is possible if:
   1116     -   No extra elements are included into the new matrix and no elements are excluded. Consequently,
   1117         the product rows\*cols\*channels() must stay the same after the transformation.
   1118     -   No data is copied. That is, this is an O(1) operation. Consequently, if you change the number of
   1119         rows, or the operation changes the indices of elements row in some other way, the matrix must be
   1120         continuous. See Mat::isContinuous .
   1121 
   1122     For example, if there is a set of 3D points stored as an STL vector, and you want to represent the
   1123     points as a 3xN matrix, do the following:
   1124     @code
   1125         std::vector<Point3f> vec;
   1126         ...
   1127         Mat pointMat = Mat(vec). // convert vector to Mat, O(1) operation
   1128                           reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel.
   1129                                       // Also, an O(1) operation
   1130                              t(); // finally, transpose the Nx3 matrix.
   1131                                   // This involves copying all the elements
   1132     @endcode
   1133     @param cn New number of channels. If the parameter is 0, the number of channels remains the same.
   1134     @param rows New number of rows. If the parameter is 0, the number of rows remains the same.
   1135      */
   1136     Mat reshape(int cn, int rows=0) const;
   1137 
   1138     /** @overload */
   1139     Mat reshape(int cn, int newndims, const int* newsz) const;
   1140 
   1141     /** @brief Transposes a matrix.
   1142 
   1143     The method performs matrix transposition by means of matrix expressions. It does not perform the
   1144     actual transposition but returns a temporary matrix transposition object that can be further used as
   1145     a part of more complex matrix expressions or can be assigned to a matrix:
   1146     @code
   1147         Mat A1 = A + Mat::eye(A.size(), A.type())*lambda;
   1148         Mat C = A1.t()*A1; // compute (A + lambda*I)^t * (A + lamda*I)
   1149     @endcode
   1150      */
   1151     MatExpr t() const;
   1152 
   1153     /** @brief Inverses a matrix.
   1154 
   1155     The method performs a matrix inversion by means of matrix expressions. This means that a temporary
   1156     matrix inversion object is returned by the method and can be used further as a part of more complex
   1157     matrix expressions or can be assigned to a matrix.
   1158     @param method Matrix inversion method. One of cv::DecompTypes
   1159      */
   1160     MatExpr inv(int method=DECOMP_LU) const;
   1161 
   1162     /** @brief Performs an element-wise multiplication or division of the two matrices.
   1163 
   1164     The method returns a temporary object encoding per-element array multiplication, with optional
   1165     scale. Note that this is not a matrix multiplication that corresponds to a simpler "\*" operator.
   1166 
   1167     Example:
   1168     @code
   1169         Mat C = A.mul(5/B); // equivalent to divide(A, B, C, 5)
   1170     @endcode
   1171     @param m Another array of the same type and the same size as \*this, or a matrix expression.
   1172     @param scale Optional scale factor.
   1173      */
   1174     MatExpr mul(InputArray m, double scale=1) const;
   1175 
   1176     /** @brief Computes a cross-product of two 3-element vectors.
   1177 
   1178     The method computes a cross-product of two 3-element vectors. The vectors must be 3-element
   1179     floating-point vectors of the same shape and size. The result is another 3-element vector of the
   1180     same shape and type as operands.
   1181     @param m Another cross-product operand.
   1182      */
   1183     Mat cross(InputArray m) const;
   1184 
   1185     /** @brief Computes a dot-product of two vectors.
   1186 
   1187     The method computes a dot-product of two matrices. If the matrices are not single-column or
   1188     single-row vectors, the top-to-bottom left-to-right scan ordering is used to treat them as 1D
   1189     vectors. The vectors must have the same size and type. If the matrices have more than one channel,
   1190     the dot products from all the channels are summed together.
   1191     @param m another dot-product operand.
   1192      */
   1193     double dot(InputArray m) const;
   1194 
   1195     /** @brief Returns a zero array of the specified size and type.
   1196 
   1197     The method returns a Matlab-style zero array initializer. It can be used to quickly form a constant
   1198     array as a function parameter, part of a matrix expression, or as a matrix initializer. :
   1199     @code
   1200         Mat A;
   1201         A = Mat::zeros(3, 3, CV_32F);
   1202     @endcode
   1203     In the example above, a new matrix is allocated only if A is not a 3x3 floating-point matrix.
   1204     Otherwise, the existing matrix A is filled with zeros.
   1205     @param rows Number of rows.
   1206     @param cols Number of columns.
   1207     @param type Created matrix type.
   1208      */
   1209     static MatExpr zeros(int rows, int cols, int type);
   1210 
   1211     /** @overload
   1212     @param size Alternative to the matrix size specification Size(cols, rows) .
   1213     @param type Created matrix type.
   1214     */
   1215     static MatExpr zeros(Size size, int type);
   1216 
   1217     /** @overload
   1218     @param ndims Array dimensionality.
   1219     @param sz Array of integers specifying the array shape.
   1220     @param type Created matrix type.
   1221     */
   1222     static MatExpr zeros(int ndims, const int* sz, int type);
   1223 
   1224     /** @brief Returns an array of all 1's of the specified size and type.
   1225 
   1226     The method returns a Matlab-style 1's array initializer, similarly to Mat::zeros. Note that using
   1227     this method you can initialize an array with an arbitrary value, using the following Matlab idiom:
   1228     @code
   1229         Mat A = Mat::ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3.
   1230     @endcode
   1231     The above operation does not form a 100x100 matrix of 1's and then multiply it by 3. Instead, it
   1232     just remembers the scale factor (3 in this case) and use it when actually invoking the matrix
   1233     initializer.
   1234     @param rows Number of rows.
   1235     @param cols Number of columns.
   1236     @param type Created matrix type.
   1237      */
   1238     static MatExpr ones(int rows, int cols, int type);
   1239 
   1240     /** @overload
   1241     @param size Alternative to the matrix size specification Size(cols, rows) .
   1242     @param type Created matrix type.
   1243     */
   1244     static MatExpr ones(Size size, int type);
   1245 
   1246     /** @overload
   1247     @param ndims Array dimensionality.
   1248     @param sz Array of integers specifying the array shape.
   1249     @param type Created matrix type.
   1250     */
   1251     static MatExpr ones(int ndims, const int* sz, int type);
   1252 
   1253     /** @brief Returns an identity matrix of the specified size and type.
   1254 
   1255     The method returns a Matlab-style identity matrix initializer, similarly to Mat::zeros. Similarly to
   1256     Mat::ones, you can use a scale operation to create a scaled identity matrix efficiently:
   1257     @code
   1258         // make a 4x4 diagonal matrix with 0.1's on the diagonal.
   1259         Mat A = Mat::eye(4, 4, CV_32F)*0.1;
   1260     @endcode
   1261     @param rows Number of rows.
   1262     @param cols Number of columns.
   1263     @param type Created matrix type.
   1264      */
   1265     static MatExpr eye(int rows, int cols, int type);
   1266 
   1267     /** @overload
   1268     @param size Alternative matrix size specification as Size(cols, rows) .
   1269     @param type Created matrix type.
   1270     */
   1271     static MatExpr eye(Size size, int type);
   1272 
   1273     /** @brief Allocates new array data if needed.
   1274 
   1275     This is one of the key Mat methods. Most new-style OpenCV functions and methods that produce arrays
   1276     call this method for each output array. The method uses the following algorithm:
   1277 
   1278     -# If the current array shape and the type match the new ones, return immediately. Otherwise,
   1279        de-reference the previous data by calling Mat::release.
   1280     -# Initialize the new header.
   1281     -# Allocate the new data of total()\*elemSize() bytes.
   1282     -# Allocate the new, associated with the data, reference counter and set it to 1.
   1283 
   1284     Such a scheme makes the memory management robust and efficient at the same time and helps avoid
   1285     extra typing for you. This means that usually there is no need to explicitly allocate output arrays.
   1286     That is, instead of writing:
   1287     @code
   1288         Mat color;
   1289         ...
   1290         Mat gray(color.rows, color.cols, color.depth());
   1291         cvtColor(color, gray, COLOR_BGR2GRAY);
   1292     @endcode
   1293     you can simply write:
   1294     @code
   1295         Mat color;
   1296         ...
   1297         Mat gray;
   1298         cvtColor(color, gray, COLOR_BGR2GRAY);
   1299     @endcode
   1300     because cvtColor, as well as the most of OpenCV functions, calls Mat::create() for the output array
   1301     internally.
   1302     @param rows New number of rows.
   1303     @param cols New number of columns.
   1304     @param type New matrix type.
   1305      */
   1306     void create(int rows, int cols, int type);
   1307 
   1308     /** @overload
   1309     @param size Alternative new matrix size specification: Size(cols, rows)
   1310     @param type New matrix type.
   1311     */
   1312     void create(Size size, int type);
   1313 
   1314     /** @overload
   1315     @param ndims New array dimensionality.
   1316     @param sizes Array of integers specifying a new array shape.
   1317     @param type New matrix type.
   1318     */
   1319     void create(int ndims, const int* sizes, int type);
   1320 
   1321     /** @brief Increments the reference counter.
   1322 
   1323     The method increments the reference counter associated with the matrix data. If the matrix header
   1324     points to an external data set (see Mat::Mat ), the reference counter is NULL, and the method has no
   1325     effect in this case. Normally, to avoid memory leaks, the method should not be called explicitly. It
   1326     is called implicitly by the matrix assignment operator. The reference counter increment is an atomic
   1327     operation on the platforms that support it. Thus, it is safe to operate on the same matrices
   1328     asynchronously in different threads.
   1329      */
   1330     void addref();
   1331 
   1332     /** @brief Decrements the reference counter and deallocates the matrix if needed.
   1333 
   1334     The method decrements the reference counter associated with the matrix data. When the reference
   1335     counter reaches 0, the matrix data is deallocated and the data and the reference counter pointers
   1336     are set to NULL's. If the matrix header points to an external data set (see Mat::Mat ), the
   1337     reference counter is NULL, and the method has no effect in this case.
   1338 
   1339     This method can be called manually to force the matrix data deallocation. But since this method is
   1340     automatically called in the destructor, or by any other method that changes the data pointer, it is
   1341     usually not needed. The reference counter decrement and check for 0 is an atomic operation on the
   1342     platforms that support it. Thus, it is safe to operate on the same matrices asynchronously in
   1343     different threads.
   1344      */
   1345     void release();
   1346 
   1347     //! deallocates the matrix data
   1348     void deallocate();
   1349     //! internal use function; properly re-allocates _size, _step arrays
   1350     void copySize(const Mat& m);
   1351 
   1352     /** @brief Reserves space for the certain number of rows.
   1353 
   1354     The method reserves space for sz rows. If the matrix already has enough space to store sz rows,
   1355     nothing happens. If the matrix is reallocated, the first Mat::rows rows are preserved. The method
   1356     emulates the corresponding method of the STL vector class.
   1357     @param sz Number of rows.
   1358      */
   1359     void reserve(size_t sz);
   1360 
   1361     /** @brief Changes the number of matrix rows.
   1362 
   1363     The methods change the number of matrix rows. If the matrix is reallocated, the first
   1364     min(Mat::rows, sz) rows are preserved. The methods emulate the corresponding methods of the STL
   1365     vector class.
   1366     @param sz New number of rows.
   1367      */
   1368     void resize(size_t sz);
   1369 
   1370     /** @overload
   1371     @param sz New number of rows.
   1372     @param s Value assigned to the newly added elements.
   1373      */
   1374     void resize(size_t sz, const Scalar& s);
   1375 
   1376     //! internal function
   1377     void push_back_(const void* elem);
   1378 
   1379     /** @brief Adds elements to the bottom of the matrix.
   1380 
   1381     The methods add one or more elements to the bottom of the matrix. They emulate the corresponding
   1382     method of the STL vector class. When elem is Mat , its type and the number of columns must be the
   1383     same as in the container matrix.
   1384     @param elem Added element(s).
   1385      */
   1386     template<typename _Tp> void push_back(const _Tp& elem);
   1387 
   1388     /** @overload
   1389     @param elem Added element(s).
   1390     */
   1391     template<typename _Tp> void push_back(const Mat_<_Tp>& elem);
   1392 
   1393     /** @overload
   1394     @param m Added line(s).
   1395     */
   1396     void push_back(const Mat& m);
   1397 
   1398     /** @brief Removes elements from the bottom of the matrix.
   1399 
   1400     The method removes one or more rows from the bottom of the matrix.
   1401     @param nelems Number of removed rows. If it is greater than the total number of rows, an exception
   1402     is thrown.
   1403      */
   1404     void pop_back(size_t nelems=1);
   1405 
   1406     /** @brief Locates the matrix header within a parent matrix.
   1407 
   1408     After you extracted a submatrix from a matrix using Mat::row, Mat::col, Mat::rowRange,
   1409     Mat::colRange, and others, the resultant submatrix points just to the part of the original big
   1410     matrix. However, each submatrix contains information (represented by datastart and dataend
   1411     fields) that helps reconstruct the original matrix size and the position of the extracted
   1412     submatrix within the original matrix. The method locateROI does exactly that.
   1413     @param wholeSize Output parameter that contains the size of the whole matrix containing *this*
   1414     as a part.
   1415     @param ofs Output parameter that contains an offset of *this* inside the whole matrix.
   1416      */
   1417     void locateROI( Size& wholeSize, Point& ofs ) const;
   1418 
   1419     /** @brief Adjusts a submatrix size and position within the parent matrix.
   1420 
   1421     The method is complimentary to Mat::locateROI . The typical use of these functions is to determine
   1422     the submatrix position within the parent matrix and then shift the position somehow. Typically, it
   1423     can be required for filtering operations when pixels outside of the ROI should be taken into
   1424     account. When all the method parameters are positive, the ROI needs to grow in all directions by the
   1425     specified amount, for example:
   1426     @code
   1427         A.adjustROI(2, 2, 2, 2);
   1428     @endcode
   1429     In this example, the matrix size is increased by 4 elements in each direction. The matrix is shifted
   1430     by 2 elements to the left and 2 elements up, which brings in all the necessary pixels for the
   1431     filtering with the 5x5 kernel.
   1432 
   1433     adjustROI forces the adjusted ROI to be inside of the parent matrix that is boundaries of the
   1434     adjusted ROI are constrained by boundaries of the parent matrix. For example, if the submatrix A is
   1435     located in the first row of a parent matrix and you called A.adjustROI(2, 2, 2, 2) then A will not
   1436     be increased in the upward direction.
   1437 
   1438     The function is used internally by the OpenCV filtering functions, like filter2D , morphological
   1439     operations, and so on.
   1440     @param dtop Shift of the top submatrix boundary upwards.
   1441     @param dbottom Shift of the bottom submatrix boundary downwards.
   1442     @param dleft Shift of the left submatrix boundary to the left.
   1443     @param dright Shift of the right submatrix boundary to the right.
   1444     @sa copyMakeBorder
   1445      */
   1446     Mat& adjustROI( int dtop, int dbottom, int dleft, int dright );
   1447 
   1448     /** @brief Extracts a rectangular submatrix.
   1449 
   1450     The operators make a new header for the specified sub-array of \*this . They are the most
   1451     generalized forms of Mat::row, Mat::col, Mat::rowRange, and Mat::colRange . For example,
   1452     `A(Range(0, 10), Range::all())` is equivalent to `A.rowRange(0, 10)`. Similarly to all of the above,
   1453     the operators are O(1) operations, that is, no matrix data is copied.
   1454     @param rowRange Start and end row of the extracted submatrix. The upper boundary is not included. To
   1455     select all the rows, use Range::all().
   1456     @param colRange Start and end column of the extracted submatrix. The upper boundary is not included.
   1457     To select all the columns, use Range::all().
   1458      */
   1459     Mat operator()( Range rowRange, Range colRange ) const;
   1460 
   1461     /** @overload
   1462     @param roi Extracted submatrix specified as a rectangle.
   1463     */
   1464     Mat operator()( const Rect& roi ) const;
   1465 
   1466     /** @overload
   1467     @param ranges Array of selected ranges along each array dimension.
   1468     */
   1469     Mat operator()( const Range* ranges ) const;
   1470 
   1471     // //! converts header to CvMat; no data is copied
   1472     // operator CvMat() const;
   1473     // //! converts header to CvMatND; no data is copied
   1474     // operator CvMatND() const;
   1475     // //! converts header to IplImage; no data is copied
   1476     // operator IplImage() const;
   1477 
   1478     template<typename _Tp> operator std::vector<_Tp>() const;
   1479     template<typename _Tp, int n> operator Vec<_Tp, n>() const;
   1480     template<typename _Tp, int m, int n> operator Matx<_Tp, m, n>() const;
   1481 
   1482     /** @brief Reports whether the matrix is continuous or not.
   1483 
   1484     The method returns true if the matrix elements are stored continuously without gaps at the end of
   1485     each row. Otherwise, it returns false. Obviously, 1x1 or 1xN matrices are always continuous.
   1486     Matrices created with Mat::create are always continuous. But if you extract a part of the matrix
   1487     using Mat::col, Mat::diag, and so on, or constructed a matrix header for externally allocated data,
   1488     such matrices may no longer have this property.
   1489 
   1490     The continuity flag is stored as a bit in the Mat::flags field and is computed automatically when
   1491     you construct a matrix header. Thus, the continuity check is a very fast operation, though
   1492     theoretically it could be done as follows:
   1493     @code
   1494         // alternative implementation of Mat::isContinuous()
   1495         bool myCheckMatContinuity(const Mat& m)
   1496         {
   1497             //return (m.flags & Mat::CONTINUOUS_FLAG) != 0;
   1498             return m.rows == 1 || m.step == m.cols*m.elemSize();
   1499         }
   1500     @endcode
   1501     The method is used in quite a few of OpenCV functions. The point is that element-wise operations
   1502     (such as arithmetic and logical operations, math functions, alpha blending, color space
   1503     transformations, and others) do not depend on the image geometry. Thus, if all the input and output
   1504     arrays are continuous, the functions can process them as very long single-row vectors. The example
   1505     below illustrates how an alpha-blending function can be implemented:
   1506     @code
   1507         template<typename T>
   1508         void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst)
   1509         {
   1510             const float alpha_scale = (float)std::numeric_limits<T>::max(),
   1511                         inv_scale = 1.f/alpha_scale;
   1512 
   1513             CV_Assert( src1.type() == src2.type() &&
   1514                        src1.type() == CV_MAKETYPE(DataType<T>::depth, 4) &&
   1515                        src1.size() == src2.size());
   1516             Size size = src1.size();
   1517             dst.create(size, src1.type());
   1518 
   1519             // here is the idiom: check the arrays for continuity and,
   1520             // if this is the case,
   1521             // treat the arrays as 1D vectors
   1522             if( src1.isContinuous() && src2.isContinuous() && dst.isContinuous() )
   1523             {
   1524                 size.width *= size.height;
   1525                 size.height = 1;
   1526             }
   1527             size.width *= 4;
   1528 
   1529             for( int i = 0; i < size.height; i++ )
   1530             {
   1531                 // when the arrays are continuous,
   1532                 // the outer loop is executed only once
   1533                 const T* ptr1 = src1.ptr<T>(i);
   1534                 const T* ptr2 = src2.ptr<T>(i);
   1535                 T* dptr = dst.ptr<T>(i);
   1536 
   1537                 for( int j = 0; j < size.width; j += 4 )
   1538                 {
   1539                     float alpha = ptr1[j+3]*inv_scale, beta = ptr2[j+3]*inv_scale;
   1540                     dptr[j] = saturate_cast<T>(ptr1[j]*alpha + ptr2[j]*beta);
   1541                     dptr[j+1] = saturate_cast<T>(ptr1[j+1]*alpha + ptr2[j+1]*beta);
   1542                     dptr[j+2] = saturate_cast<T>(ptr1[j+2]*alpha + ptr2[j+2]*beta);
   1543                     dptr[j+3] = saturate_cast<T>((1 - (1-alpha)*(1-beta))*alpha_scale);
   1544                 }
   1545             }
   1546         }
   1547     @endcode
   1548     This approach, while being very simple, can boost the performance of a simple element-operation by
   1549     10-20 percents, especially if the image is rather small and the operation is quite simple.
   1550 
   1551     Another OpenCV idiom in this function, a call of Mat::create for the destination array, that
   1552     allocates the destination array unless it already has the proper size and type. And while the newly
   1553     allocated arrays are always continuous, you still need to check the destination array because
   1554     Mat::create does not always allocate a new matrix.
   1555      */
   1556     bool isContinuous() const;
   1557 
   1558     //! returns true if the matrix is a submatrix of another matrix
   1559     bool isSubmatrix() const;
   1560 
   1561     /** @brief Returns the matrix element size in bytes.
   1562 
   1563     The method returns the matrix element size in bytes. For example, if the matrix type is CV_16SC3 ,
   1564     the method returns 3\*sizeof(short) or 6.
   1565      */
   1566     size_t elemSize() const;
   1567 
   1568     /** @brief Returns the size of each matrix element channel in bytes.
   1569 
   1570     The method returns the matrix element channel size in bytes, that is, it ignores the number of
   1571     channels. For example, if the matrix type is CV_16SC3 , the method returns sizeof(short) or 2.
   1572      */
   1573     size_t elemSize1() const;
   1574 
   1575     /** @brief Returns the type of a matrix element.
   1576 
   1577     The method returns a matrix element type. This is an identifier compatible with the CvMat type
   1578     system, like CV_16SC3 or 16-bit signed 3-channel array, and so on.
   1579      */
   1580     int type() const;
   1581 
   1582     /** @brief Returns the depth of a matrix element.
   1583 
   1584     The method returns the identifier of the matrix element depth (the type of each individual channel).
   1585     For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of
   1586     matrix types contains the following values:
   1587     -   CV_8U - 8-bit unsigned integers ( 0..255 )
   1588     -   CV_8S - 8-bit signed integers ( -128..127 )
   1589     -   CV_16U - 16-bit unsigned integers ( 0..65535 )
   1590     -   CV_16S - 16-bit signed integers ( -32768..32767 )
   1591     -   CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
   1592     -   CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
   1593     -   CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
   1594      */
   1595     int depth() const;
   1596 
   1597     /** @brief Returns the number of matrix channels.
   1598 
   1599     The method returns the number of matrix channels.
   1600      */
   1601     int channels() const;
   1602 
   1603     /** @brief Returns a normalized step.
   1604 
   1605     The method returns a matrix step divided by Mat::elemSize1() . It can be useful to quickly access an
   1606     arbitrary matrix element.
   1607      */
   1608     size_t step1(int i=0) const;
   1609 
   1610     /** @brief Returns true if the array has no elements.
   1611 
   1612     The method returns true if Mat::total() is 0 or if Mat::data is NULL. Because of pop_back() and
   1613     resize() methods `M.total() == 0` does not imply that `M.data == NULL`.
   1614      */
   1615     bool empty() const;
   1616 
   1617     /** @brief Returns the total number of array elements.
   1618 
   1619     The method returns the number of array elements (a number of pixels if the array represents an
   1620     image).
   1621      */
   1622     size_t total() const;
   1623 
   1624     //! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
   1625     int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const;
   1626 
   1627     /** @brief Returns a pointer to the specified matrix row.
   1628 
   1629     The methods return `uchar*` or typed pointer to the specified matrix row. See the sample in
   1630     Mat::isContinuous to know how to use these methods.
   1631     @param i0 A 0-based row index.
   1632      */
   1633     uchar* ptr(int i0=0);
   1634     /** @overload */
   1635     const uchar* ptr(int i0=0) const;
   1636 
   1637     /** @overload */
   1638     uchar* ptr(int i0, int i1);
   1639     /** @overload */
   1640     const uchar* ptr(int i0, int i1) const;
   1641 
   1642     /** @overload */
   1643     uchar* ptr(int i0, int i1, int i2);
   1644     /** @overload */
   1645     const uchar* ptr(int i0, int i1, int i2) const;
   1646 
   1647     /** @overload */
   1648     uchar* ptr(const int* idx);
   1649     /** @overload */
   1650     const uchar* ptr(const int* idx) const;
   1651     /** @overload */
   1652     template<int n> uchar* ptr(const Vec<int, n>& idx);
   1653     /** @overload */
   1654     template<int n> const uchar* ptr(const Vec<int, n>& idx) const;
   1655 
   1656     /** @overload */
   1657     template<typename _Tp> _Tp* ptr(int i0=0);
   1658     /** @overload */
   1659     template<typename _Tp> const _Tp* ptr(int i0=0) const;
   1660     /** @overload */
   1661     template<typename _Tp> _Tp* ptr(int i0, int i1);
   1662     /** @overload */
   1663     template<typename _Tp> const _Tp* ptr(int i0, int i1) const;
   1664     /** @overload */
   1665     template<typename _Tp> _Tp* ptr(int i0, int i1, int i2);
   1666     /** @overload */
   1667     template<typename _Tp> const _Tp* ptr(int i0, int i1, int i2) const;
   1668     /** @overload */
   1669     template<typename _Tp> _Tp* ptr(const int* idx);
   1670     /** @overload */
   1671     template<typename _Tp> const _Tp* ptr(const int* idx) const;
   1672     /** @overload */
   1673     template<typename _Tp, int n> _Tp* ptr(const Vec<int, n>& idx);
   1674     /** @overload */
   1675     template<typename _Tp, int n> const _Tp* ptr(const Vec<int, n>& idx) const;
   1676 
   1677     /** @brief Returns a reference to the specified array element.
   1678 
   1679     The template methods return a reference to the specified array element. For the sake of higher
   1680     performance, the index range checks are only performed in the Debug configuration.
   1681 
   1682     Note that the variants with a single index (i) can be used to access elements of single-row or
   1683     single-column 2-dimensional arrays. That is, if, for example, A is a 1 x N floating-point matrix and
   1684     B is an M x 1 integer matrix, you can simply write `A.at<float>(k+4)` and `B.at<int>(2*i+1)`
   1685     instead of `A.at<float>(0,k+4)` and `B.at<int>(2*i+1,0)`, respectively.
   1686 
   1687     The example below initializes a Hilbert matrix:
   1688     @code
   1689         Mat H(100, 100, CV_64F);
   1690         for(int i = 0; i < H.rows; i++)
   1691             for(int j = 0; j < H.cols; j++)
   1692                 H.at<double>(i,j)=1./(i+j+1);
   1693     @endcode
   1694     @param i0 Index along the dimension 0
   1695      */
   1696     template<typename _Tp> _Tp& at(int i0=0);
   1697     /** @overload
   1698     @param i0 Index along the dimension 0
   1699     */
   1700     template<typename _Tp> const _Tp& at(int i0=0) const;
   1701     /** @overload
   1702     @param i0 Index along the dimension 0
   1703     @param i1 Index along the dimension 1
   1704     */
   1705     template<typename _Tp> _Tp& at(int i0, int i1);
   1706     /** @overload
   1707     @param i0 Index along the dimension 0
   1708     @param i1 Index along the dimension 1
   1709     */
   1710     template<typename _Tp> const _Tp& at(int i0, int i1) const;
   1711 
   1712     /** @overload
   1713     @param i0 Index along the dimension 0
   1714     @param i1 Index along the dimension 1
   1715     @param i2 Index along the dimension 2
   1716     */
   1717     template<typename _Tp> _Tp& at(int i0, int i1, int i2);
   1718     /** @overload
   1719     @param i0 Index along the dimension 0
   1720     @param i1 Index along the dimension 1
   1721     @param i2 Index along the dimension 2
   1722     */
   1723     template<typename _Tp> const _Tp& at(int i0, int i1, int i2) const;
   1724 
   1725     /** @overload
   1726     @param idx Array of Mat::dims indices.
   1727     */
   1728     template<typename _Tp> _Tp& at(const int* idx);
   1729     /** @overload
   1730     @param idx Array of Mat::dims indices.
   1731     */
   1732     template<typename _Tp> const _Tp& at(const int* idx) const;
   1733 
   1734     /** @overload */
   1735     template<typename _Tp, int n> _Tp& at(const Vec<int, n>& idx);
   1736     /** @overload */
   1737     template<typename _Tp, int n> const _Tp& at(const Vec<int, n>& idx) const;
   1738 
   1739     /** @overload
   1740     special versions for 2D arrays (especially convenient for referencing image pixels)
   1741     @param pt Element position specified as Point(j,i) .
   1742     */
   1743     template<typename _Tp> _Tp& at(Point pt);
   1744     /** @overload
   1745     special versions for 2D arrays (especially convenient for referencing image pixels)
   1746     @param pt Element position specified as Point(j,i) .
   1747     */
   1748     template<typename _Tp> const _Tp& at(Point pt) const;
   1749 
   1750     /** @brief Returns the matrix iterator and sets it to the first matrix element.
   1751 
   1752     The methods return the matrix read-only or read-write iterators. The use of matrix iterators is very
   1753     similar to the use of bi-directional STL iterators. In the example below, the alpha blending
   1754     function is rewritten using the matrix iterators:
   1755     @code
   1756         template<typename T>
   1757         void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst)
   1758         {
   1759             typedef Vec<T, 4> VT;
   1760 
   1761             const float alpha_scale = (float)std::numeric_limits<T>::max(),
   1762                         inv_scale = 1.f/alpha_scale;
   1763 
   1764             CV_Assert( src1.type() == src2.type() &&
   1765                        src1.type() == DataType<VT>::type &&
   1766                        src1.size() == src2.size());
   1767             Size size = src1.size();
   1768             dst.create(size, src1.type());
   1769 
   1770             MatConstIterator_<VT> it1 = src1.begin<VT>(), it1_end = src1.end<VT>();
   1771             MatConstIterator_<VT> it2 = src2.begin<VT>();
   1772             MatIterator_<VT> dst_it = dst.begin<VT>();
   1773 
   1774             for( ; it1 != it1_end; ++it1, ++it2, ++dst_it )
   1775             {
   1776                 VT pix1 = *it1, pix2 = *it2;
   1777                 float alpha = pix1[3]*inv_scale, beta = pix2[3]*inv_scale;
   1778                 *dst_it = VT(saturate_cast<T>(pix1[0]*alpha + pix2[0]*beta),
   1779                              saturate_cast<T>(pix1[1]*alpha + pix2[1]*beta),
   1780                              saturate_cast<T>(pix1[2]*alpha + pix2[2]*beta),
   1781                              saturate_cast<T>((1 - (1-alpha)*(1-beta))*alpha_scale));
   1782             }
   1783         }
   1784     @endcode
   1785      */
   1786     template<typename _Tp> MatIterator_<_Tp> begin();
   1787     template<typename _Tp> MatConstIterator_<_Tp> begin() const;
   1788 
   1789     /** @brief Returns the matrix iterator and sets it to the after-last matrix element.
   1790 
   1791     The methods return the matrix read-only or read-write iterators, set to the point following the last
   1792     matrix element.
   1793      */
   1794     template<typename _Tp> MatIterator_<_Tp> end();
   1795     template<typename _Tp> MatConstIterator_<_Tp> end() const;
   1796 
   1797     /** @brief Invoke with arguments functor, and runs the functor over all matrix element.
   1798 
   1799     The methos runs operation in parallel. Operation is passed by arguments. Operation have to be a
   1800     function pointer, a function object or a lambda(C++11).
   1801 
   1802     All of below operation is equal. Put 0xFF to first channel of all matrix elements:
   1803     @code
   1804         Mat image(1920, 1080, CV_8UC3);
   1805         typedef cv::Point3_<uint8_t> Pixel;
   1806 
   1807         // first. raw pointer access.
   1808         for (int r = 0; r < image.rows; ++r) {
   1809             Pixel* ptr = image.ptr<Pixel>(0, r);
   1810             const Pixel* ptr_end = ptr + image.cols;
   1811             for (; ptr != ptr_end; ++ptr) {
   1812                 ptr->x = 255;
   1813             }
   1814         }
   1815 
   1816         // Using MatIterator. (Simple but there are a Iterator's overhead)
   1817         for (Pixel &p : cv::Mat_<Pixel>(image)) {
   1818             p.x = 255;
   1819         }
   1820 
   1821         // Parallel execution with function object.
   1822         struct Operator {
   1823             void operator ()(Pixel &pixel, const int * position) {
   1824                 pixel.x = 255;
   1825             }
   1826         };
   1827         image.forEach<Pixel>(Operator());
   1828 
   1829         // Parallel execution using C++11 lambda.
   1830         image.forEach<Pixel>([](Pixel &p, const int * position) -> void {
   1831             p.x = 255;
   1832         });
   1833     @endcode
   1834     position parameter is index of current pixel:
   1835     @code
   1836         // Creating 3D matrix (255 x 255 x 255) typed uint8_t,
   1837         //  and initialize all elements by the value which equals elements position.
   1838         //  i.e. pixels (x,y,z) = (1,2,3) is (b,g,r) = (1,2,3).
   1839 
   1840         int sizes[] = { 255, 255, 255 };
   1841         typedef cv::Point3_<uint8_t> Pixel;
   1842 
   1843         Mat_<Pixel> image = Mat::zeros(3, sizes, CV_8UC3);
   1844 
   1845         image.forEachWithPosition([&](Pixel& pixel, const int position[]) -> void{
   1846             pixel.x = position[0];
   1847             pixel.y = position[1];
   1848             pixel.z = position[2];
   1849         });
   1850     @endcode
   1851      */
   1852     template<typename _Tp, typename Functor> void forEach(const Functor& operation);
   1853     /** @overload */
   1854     template<typename _Tp, typename Functor> void forEach(const Functor& operation) const;
   1855 
   1856     enum { MAGIC_VAL  = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG };
   1857     enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 };
   1858 
   1859     /*! includes several bit-fields:
   1860          - the magic signature
   1861          - continuity flag
   1862          - depth
   1863          - number of channels
   1864      */
   1865     int flags;
   1866     //! the matrix dimensionality, >= 2
   1867     int dims;
   1868     //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
   1869     int rows, cols;
   1870     //! pointer to the data
   1871     uchar* data;
   1872 
   1873     //! helper fields used in locateROI and adjustROI
   1874     const uchar* datastart;
   1875     const uchar* dataend;
   1876     const uchar* datalimit;
   1877 
   1878     //! custom allocator
   1879     MatAllocator* allocator;
   1880     //! and the standard allocator
   1881     static MatAllocator* getStdAllocator();
   1882 
   1883     //! interaction with UMat
   1884     UMatData* u;
   1885 
   1886     MatSize size;
   1887     MatStep step;
   1888 
   1889 protected:
   1890     template<typename _Tp, typename Functor> void forEach_impl(const Functor& operation);
   1891 };
   1892 
   1893 
   1894 ///////////////////////////////// Mat_<_Tp> ////////////////////////////////////
   1895 
   1896 /** @brief Template matrix class derived from Mat
   1897 
   1898 @code
   1899     template<typename _Tp> class Mat_ : public Mat
   1900     {
   1901     public:
   1902         // ... some specific methods
   1903         //         and
   1904         // no new extra fields
   1905     };
   1906 @endcode
   1907 The class `Mat_<_Tp>` is a *thin* template wrapper on top of the Mat class. It does not have any
   1908 extra data fields. Nor this class nor Mat has any virtual methods. Thus, references or pointers to
   1909 these two classes can be freely but carefully converted one to another. For example:
   1910 @code
   1911     // create a 100x100 8-bit matrix
   1912     Mat M(100,100,CV_8U);
   1913     // this will be compiled fine. no any data conversion will be done.
   1914     Mat_<float>& M1 = (Mat_<float>&)M;
   1915     // the program is likely to crash at the statement below
   1916     M1(99,99) = 1.f;
   1917 @endcode
   1918 While Mat is sufficient in most cases, Mat_ can be more convenient if you use a lot of element
   1919 access operations and if you know matrix type at the compilation time. Note that
   1920 `Mat::at(int y,int x)` and `Mat_::operator()(int y,int x)` do absolutely the same
   1921 and run at the same speed, but the latter is certainly shorter:
   1922 @code
   1923     Mat_<double> M(20,20);
   1924     for(int i = 0; i < M.rows; i++)
   1925         for(int j = 0; j < M.cols; j++)
   1926             M(i,j) = 1./(i+j+1);
   1927     Mat E, V;
   1928     eigen(M,E,V);
   1929     cout << E.at<double>(0,0)/E.at<double>(M.rows-1,0);
   1930 @endcode
   1931 To use Mat_ for multi-channel images/matrices, pass Vec as a Mat_ parameter:
   1932 @code
   1933     // allocate a 320x240 color image and fill it with green (in RGB space)
   1934     Mat_<Vec3b> img(240, 320, Vec3b(0,255,0));
   1935     // now draw a diagonal white line
   1936     for(int i = 0; i < 100; i++)
   1937         img(i,i)=Vec3b(255,255,255);
   1938     // and now scramble the 2nd (red) channel of each pixel
   1939     for(int i = 0; i < img.rows; i++)
   1940         for(int j = 0; j < img.cols; j++)
   1941             img(i,j)[2] ^= (uchar)(i ^ j);
   1942 @endcode
   1943  */
   1944 template<typename _Tp> class Mat_ : public Mat
   1945 {
   1946 public:
   1947     typedef _Tp value_type;
   1948     typedef typename DataType<_Tp>::channel_type channel_type;
   1949     typedef MatIterator_<_Tp> iterator;
   1950     typedef MatConstIterator_<_Tp> const_iterator;
   1951 
   1952     //! default constructor
   1953     Mat_();
   1954     //! equivalent to Mat(_rows, _cols, DataType<_Tp>::type)
   1955     Mat_(int _rows, int _cols);
   1956     //! constructor that sets each matrix element to specified value
   1957     Mat_(int _rows, int _cols, const _Tp& value);
   1958     //! equivalent to Mat(_size, DataType<_Tp>::type)
   1959     explicit Mat_(Size _size);
   1960     //! constructor that sets each matrix element to specified value
   1961     Mat_(Size _size, const _Tp& value);
   1962     //! n-dim array constructor
   1963     Mat_(int _ndims, const int* _sizes);
   1964     //! n-dim array constructor that sets each matrix element to specified value
   1965     Mat_(int _ndims, const int* _sizes, const _Tp& value);
   1966     //! copy/conversion contructor. If m is of different type, it's converted
   1967     Mat_(const Mat& m);
   1968     //! copy constructor
   1969     Mat_(const Mat_& m);
   1970     //! constructs a matrix on top of user-allocated data. step is in bytes(!!!), regardless of the type
   1971     Mat_(int _rows, int _cols, _Tp* _data, size_t _step=AUTO_STEP);
   1972     //! constructs n-dim matrix on top of user-allocated data. steps are in bytes(!!!), regardless of the type
   1973     Mat_(int _ndims, const int* _sizes, _Tp* _data, const size_t* _steps=0);
   1974     //! selects a submatrix
   1975     Mat_(const Mat_& m, const Range& rowRange, const Range& colRange=Range::all());
   1976     //! selects a submatrix
   1977     Mat_(const Mat_& m, const Rect& roi);
   1978     //! selects a submatrix, n-dim version
   1979     Mat_(const Mat_& m, const Range* ranges);
   1980     //! from a matrix expression
   1981     explicit Mat_(const MatExpr& e);
   1982     //! makes a matrix out of Vec, std::vector, Point_ or Point3_. The matrix will have a single column
   1983     explicit Mat_(const std::vector<_Tp>& vec, bool copyData=false);
   1984     template<int n> explicit Mat_(const Vec<typename DataType<_Tp>::channel_type, n>& vec, bool copyData=true);
   1985     template<int m, int n> explicit Mat_(const Matx<typename DataType<_Tp>::channel_type, m, n>& mtx, bool copyData=true);
   1986     explicit Mat_(const Point_<typename DataType<_Tp>::channel_type>& pt, bool copyData=true);
   1987     explicit Mat_(const Point3_<typename DataType<_Tp>::channel_type>& pt, bool copyData=true);
   1988     explicit Mat_(const MatCommaInitializer_<_Tp>& commaInitializer);
   1989 
   1990     Mat_& operator = (const Mat& m);
   1991     Mat_& operator = (const Mat_& m);
   1992     //! set all the elements to s.
   1993     Mat_& operator = (const _Tp& s);
   1994     //! assign a matrix expression
   1995     Mat_& operator = (const MatExpr& e);
   1996 
   1997     //! iterators; they are smart enough to skip gaps in the end of rows
   1998     iterator begin();
   1999     iterator end();
   2000     const_iterator begin() const;
   2001     const_iterator end() const;
   2002 
   2003     //! template methods for for operation over all matrix elements.
   2004     // the operations take care of skipping gaps in the end of rows (if any)
   2005     template<typename Functor> void forEach(const Functor& operation);
   2006     template<typename Functor> void forEach(const Functor& operation) const;
   2007 
   2008     //! equivalent to Mat::create(_rows, _cols, DataType<_Tp>::type)
   2009     void create(int _rows, int _cols);
   2010     //! equivalent to Mat::create(_size, DataType<_Tp>::type)
   2011     void create(Size _size);
   2012     //! equivalent to Mat::create(_ndims, _sizes, DatType<_Tp>::type)
   2013     void create(int _ndims, const int* _sizes);
   2014     //! cross-product
   2015     Mat_ cross(const Mat_& m) const;
   2016     //! data type conversion
   2017     template<typename T2> operator Mat_<T2>() const;
   2018     //! overridden forms of Mat::row() etc.
   2019     Mat_ row(int y) const;
   2020     Mat_ col(int x) const;
   2021     Mat_ diag(int d=0) const;
   2022     Mat_ clone() const;
   2023 
   2024     //! overridden forms of Mat::elemSize() etc.
   2025     size_t elemSize() const;
   2026     size_t elemSize1() const;
   2027     int type() const;
   2028     int depth() const;
   2029     int channels() const;
   2030     size_t step1(int i=0) const;
   2031     //! returns step()/sizeof(_Tp)
   2032     size_t stepT(int i=0) const;
   2033 
   2034     //! overridden forms of Mat::zeros() etc. Data type is omitted, of course
   2035     static MatExpr zeros(int rows, int cols);
   2036     static MatExpr zeros(Size size);
   2037     static MatExpr zeros(int _ndims, const int* _sizes);
   2038     static MatExpr ones(int rows, int cols);
   2039     static MatExpr ones(Size size);
   2040     static MatExpr ones(int _ndims, const int* _sizes);
   2041     static MatExpr eye(int rows, int cols);
   2042     static MatExpr eye(Size size);
   2043 
   2044     //! some more overriden methods
   2045     Mat_& adjustROI( int dtop, int dbottom, int dleft, int dright );
   2046     Mat_ operator()( const Range& rowRange, const Range& colRange ) const;
   2047     Mat_ operator()( const Rect& roi ) const;
   2048     Mat_ operator()( const Range* ranges ) const;
   2049 
   2050     //! more convenient forms of row and element access operators
   2051     _Tp* operator [](int y);
   2052     const _Tp* operator [](int y) const;
   2053 
   2054     //! returns reference to the specified element
   2055     _Tp& operator ()(const int* idx);
   2056     //! returns read-only reference to the specified element
   2057     const _Tp& operator ()(const int* idx) const;
   2058 
   2059     //! returns reference to the specified element
   2060     template<int n> _Tp& operator ()(const Vec<int, n>& idx);
   2061     //! returns read-only reference to the specified element
   2062     template<int n> const _Tp& operator ()(const Vec<int, n>& idx) const;
   2063 
   2064     //! returns reference to the specified element (1D case)
   2065     _Tp& operator ()(int idx0);
   2066     //! returns read-only reference to the specified element (1D case)
   2067     const _Tp& operator ()(int idx0) const;
   2068     //! returns reference to the specified element (2D case)
   2069     _Tp& operator ()(int idx0, int idx1);
   2070     //! returns read-only reference to the specified element (2D case)
   2071     const _Tp& operator ()(int idx0, int idx1) const;
   2072     //! returns reference to the specified element (3D case)
   2073     _Tp& operator ()(int idx0, int idx1, int idx2);
   2074     //! returns read-only reference to the specified element (3D case)
   2075     const _Tp& operator ()(int idx0, int idx1, int idx2) const;
   2076 
   2077     _Tp& operator ()(Point pt);
   2078     const _Tp& operator ()(Point pt) const;
   2079 
   2080     //! conversion to vector.
   2081     operator std::vector<_Tp>() const;
   2082     //! conversion to Vec
   2083     template<int n> operator Vec<typename DataType<_Tp>::channel_type, n>() const;
   2084     //! conversion to Matx
   2085     template<int m, int n> operator Matx<typename DataType<_Tp>::channel_type, m, n>() const;
   2086 };
   2087 
   2088 typedef Mat_<uchar> Mat1b;
   2089 typedef Mat_<Vec2b> Mat2b;
   2090 typedef Mat_<Vec3b> Mat3b;
   2091 typedef Mat_<Vec4b> Mat4b;
   2092 
   2093 typedef Mat_<short> Mat1s;
   2094 typedef Mat_<Vec2s> Mat2s;
   2095 typedef Mat_<Vec3s> Mat3s;
   2096 typedef Mat_<Vec4s> Mat4s;
   2097 
   2098 typedef Mat_<ushort> Mat1w;
   2099 typedef Mat_<Vec2w> Mat2w;
   2100 typedef Mat_<Vec3w> Mat3w;
   2101 typedef Mat_<Vec4w> Mat4w;
   2102 
   2103 typedef Mat_<int>   Mat1i;
   2104 typedef Mat_<Vec2i> Mat2i;
   2105 typedef Mat_<Vec3i> Mat3i;
   2106 typedef Mat_<Vec4i> Mat4i;
   2107 
   2108 typedef Mat_<float> Mat1f;
   2109 typedef Mat_<Vec2f> Mat2f;
   2110 typedef Mat_<Vec3f> Mat3f;
   2111 typedef Mat_<Vec4f> Mat4f;
   2112 
   2113 typedef Mat_<double> Mat1d;
   2114 typedef Mat_<Vec2d> Mat2d;
   2115 typedef Mat_<Vec3d> Mat3d;
   2116 typedef Mat_<Vec4d> Mat4d;
   2117 
   2118 /** @todo document */
   2119 class CV_EXPORTS UMat
   2120 {
   2121 public:
   2122     //! default constructor
   2123     UMat(UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2124     //! constructs 2D matrix of the specified size and type
   2125     // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
   2126     UMat(int rows, int cols, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2127     UMat(Size size, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2128     //! constucts 2D matrix and fills it with the specified value _s.
   2129     UMat(int rows, int cols, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2130     UMat(Size size, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2131 
   2132     //! constructs n-dimensional matrix
   2133     UMat(int ndims, const int* sizes, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2134     UMat(int ndims, const int* sizes, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2135 
   2136     //! copy constructor
   2137     UMat(const UMat& m);
   2138 
   2139     //! creates a matrix header for a part of the bigger matrix
   2140     UMat(const UMat& m, const Range& rowRange, const Range& colRange=Range::all());
   2141     UMat(const UMat& m, const Rect& roi);
   2142     UMat(const UMat& m, const Range* ranges);
   2143     //! builds matrix from std::vector with or without copying the data
   2144     template<typename _Tp> explicit UMat(const std::vector<_Tp>& vec, bool copyData=false);
   2145     //! builds matrix from cv::Vec; the data is copied by default
   2146     template<typename _Tp, int n> explicit UMat(const Vec<_Tp, n>& vec, bool copyData=true);
   2147     //! builds matrix from cv::Matx; the data is copied by default
   2148     template<typename _Tp, int m, int n> explicit UMat(const Matx<_Tp, m, n>& mtx, bool copyData=true);
   2149     //! builds matrix from a 2D point
   2150     template<typename _Tp> explicit UMat(const Point_<_Tp>& pt, bool copyData=true);
   2151     //! builds matrix from a 3D point
   2152     template<typename _Tp> explicit UMat(const Point3_<_Tp>& pt, bool copyData=true);
   2153     //! builds matrix from comma initializer
   2154     template<typename _Tp> explicit UMat(const MatCommaInitializer_<_Tp>& commaInitializer);
   2155 
   2156     //! destructor - calls release()
   2157     ~UMat();
   2158     //! assignment operators
   2159     UMat& operator = (const UMat& m);
   2160 
   2161     Mat getMat(int flags) const;
   2162 
   2163     //! returns a new matrix header for the specified row
   2164     UMat row(int y) const;
   2165     //! returns a new matrix header for the specified column
   2166     UMat col(int x) const;
   2167     //! ... for the specified row span
   2168     UMat rowRange(int startrow, int endrow) const;
   2169     UMat rowRange(const Range& r) const;
   2170     //! ... for the specified column span
   2171     UMat colRange(int startcol, int endcol) const;
   2172     UMat colRange(const Range& r) const;
   2173     //! ... for the specified diagonal
   2174     // (d=0 - the main diagonal,
   2175     //  >0 - a diagonal from the lower half,
   2176     //  <0 - a diagonal from the upper half)
   2177     UMat diag(int d=0) const;
   2178     //! constructs a square diagonal matrix which main diagonal is vector "d"
   2179     static UMat diag(const UMat& d);
   2180 
   2181     //! returns deep copy of the matrix, i.e. the data is copied
   2182     UMat clone() const;
   2183     //! copies the matrix content to "m".
   2184     // It calls m.create(this->size(), this->type()).
   2185     void copyTo( OutputArray m ) const;
   2186     //! copies those matrix elements to "m" that are marked with non-zero mask elements.
   2187     void copyTo( OutputArray m, InputArray mask ) const;
   2188     //! converts matrix to another datatype with optional scalng. See cvConvertScale.
   2189     void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
   2190 
   2191     void assignTo( UMat& m, int type=-1 ) const;
   2192 
   2193     //! sets every matrix element to s
   2194     UMat& operator = (const Scalar& s);
   2195     //! sets some of the matrix elements to s, according to the mask
   2196     UMat& setTo(InputArray value, InputArray mask=noArray());
   2197     //! creates alternative matrix header for the same data, with different
   2198     // number of channels and/or different number of rows. see cvReshape.
   2199     UMat reshape(int cn, int rows=0) const;
   2200     UMat reshape(int cn, int newndims, const int* newsz) const;
   2201 
   2202     //! matrix transposition by means of matrix expressions
   2203     UMat t() const;
   2204     //! matrix inversion by means of matrix expressions
   2205     UMat inv(int method=DECOMP_LU) const;
   2206     //! per-element matrix multiplication by means of matrix expressions
   2207     UMat mul(InputArray m, double scale=1) const;
   2208 
   2209     //! computes dot-product
   2210     double dot(InputArray m) const;
   2211 
   2212     //! Matlab-style matrix initialization
   2213     static UMat zeros(int rows, int cols, int type);
   2214     static UMat zeros(Size size, int type);
   2215     static UMat zeros(int ndims, const int* sz, int type);
   2216     static UMat ones(int rows, int cols, int type);
   2217     static UMat ones(Size size, int type);
   2218     static UMat ones(int ndims, const int* sz, int type);
   2219     static UMat eye(int rows, int cols, int type);
   2220     static UMat eye(Size size, int type);
   2221 
   2222     //! allocates new matrix data unless the matrix already has specified size and type.
   2223     // previous data is unreferenced if needed.
   2224     void create(int rows, int cols, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2225     void create(Size size, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2226     void create(int ndims, const int* sizes, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT);
   2227 
   2228     //! increases the reference counter; use with care to avoid memleaks
   2229     void addref();
   2230     //! decreases reference counter;
   2231     // deallocates the data when reference counter reaches 0.
   2232     void release();
   2233 
   2234     //! deallocates the matrix data
   2235     void deallocate();
   2236     //! internal use function; properly re-allocates _size, _step arrays
   2237     void copySize(const UMat& m);
   2238 
   2239     //! locates matrix header within a parent matrix. See below
   2240     void locateROI( Size& wholeSize, Point& ofs ) const;
   2241     //! moves/resizes the current matrix ROI inside the parent matrix.
   2242     UMat& adjustROI( int dtop, int dbottom, int dleft, int dright );
   2243     //! extracts a rectangular sub-matrix
   2244     // (this is a generalized form of row, rowRange etc.)
   2245     UMat operator()( Range rowRange, Range colRange ) const;
   2246     UMat operator()( const Rect& roi ) const;
   2247     UMat operator()( const Range* ranges ) const;
   2248 
   2249     //! returns true iff the matrix data is continuous
   2250     // (i.e. when there are no gaps between successive rows).
   2251     // similar to CV_IS_MAT_CONT(cvmat->type)
   2252     bool isContinuous() const;
   2253 
   2254     //! returns true if the matrix is a submatrix of another matrix
   2255     bool isSubmatrix() const;
   2256 
   2257     //! returns element size in bytes,
   2258     // similar to CV_ELEM_SIZE(cvmat->type)
   2259     size_t elemSize() const;
   2260     //! returns the size of element channel in bytes.
   2261     size_t elemSize1() const;
   2262     //! returns element type, similar to CV_MAT_TYPE(cvmat->type)
   2263     int type() const;
   2264     //! returns element type, similar to CV_MAT_DEPTH(cvmat->type)
   2265     int depth() const;
   2266     //! returns element type, similar to CV_MAT_CN(cvmat->type)
   2267     int channels() const;
   2268     //! returns step/elemSize1()
   2269     size_t step1(int i=0) const;
   2270     //! returns true if matrix data is NULL
   2271     bool empty() const;
   2272     //! returns the total number of matrix elements
   2273     size_t total() const;
   2274 
   2275     //! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
   2276     int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const;
   2277 
   2278     void* handle(int accessFlags) const;
   2279     void ndoffset(size_t* ofs) const;
   2280 
   2281     enum { MAGIC_VAL  = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG };
   2282     enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 };
   2283 
   2284     /*! includes several bit-fields:
   2285          - the magic signature
   2286          - continuity flag
   2287          - depth
   2288          - number of channels
   2289      */
   2290     int flags;
   2291     //! the matrix dimensionality, >= 2
   2292     int dims;
   2293     //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
   2294     int rows, cols;
   2295 
   2296     //! custom allocator
   2297     MatAllocator* allocator;
   2298     UMatUsageFlags usageFlags; // usage flags for allocator
   2299     //! and the standard allocator
   2300     static MatAllocator* getStdAllocator();
   2301 
   2302     // black-box container of UMat data
   2303     UMatData* u;
   2304 
   2305     // offset of the submatrix (or 0)
   2306     size_t offset;
   2307 
   2308     MatSize size;
   2309     MatStep step;
   2310 
   2311 protected:
   2312 };
   2313 
   2314 
   2315 /////////////////////////// multi-dimensional sparse matrix //////////////////////////
   2316 
   2317 /** @brief The class SparseMat represents multi-dimensional sparse numerical arrays.
   2318 
   2319 Such a sparse array can store elements of any type that Mat can store. *Sparse* means that only
   2320 non-zero elements are stored (though, as a result of operations on a sparse matrix, some of its
   2321 stored elements can actually become 0. It is up to you to detect such elements and delete them
   2322 using SparseMat::erase ). The non-zero elements are stored in a hash table that grows when it is
   2323 filled so that the search time is O(1) in average (regardless of whether element is there or not).
   2324 Elements can be accessed using the following methods:
   2325 -   Query operations (SparseMat::ptr and the higher-level SparseMat::ref, SparseMat::value and
   2326     SparseMat::find), for example:
   2327     @code
   2328         const int dims = 5;
   2329         int size[] = {10, 10, 10, 10, 10};
   2330         SparseMat sparse_mat(dims, size, CV_32F);
   2331         for(int i = 0; i < 1000; i++)
   2332         {
   2333             int idx[dims];
   2334             for(int k = 0; k < dims; k++)
   2335                 idx[k] = rand()
   2336             sparse_mat.ref<float>(idx) += 1.f;
   2337         }
   2338     @endcode
   2339 -   Sparse matrix iterators. They are similar to MatIterator but different from NAryMatIterator.
   2340     That is, the iteration loop is familiar to STL users:
   2341     @code
   2342         // prints elements of a sparse floating-point matrix
   2343         // and the sum of elements.
   2344         SparseMatConstIterator_<float>
   2345             it = sparse_mat.begin<float>(),
   2346             it_end = sparse_mat.end<float>();
   2347         double s = 0;
   2348         int dims = sparse_mat.dims();
   2349         for(; it != it_end; ++it)
   2350         {
   2351             // print element indices and the element value
   2352             const SparseMat::Node* n = it.node();
   2353             printf("(");
   2354             for(int i = 0; i < dims; i++)
   2355                 printf("%d%s", n->idx[i], i < dims-1 ? ", " : ")");
   2356             printf(": %g\n", it.value<float>());
   2357             s += *it;
   2358         }
   2359         printf("Element sum is %g\n", s);
   2360     @endcode
   2361     If you run this loop, you will notice that elements are not enumerated in a logical order
   2362     (lexicographical, and so on). They come in the same order as they are stored in the hash table
   2363     (semi-randomly). You may collect pointers to the nodes and sort them to get the proper ordering.
   2364     Note, however, that pointers to the nodes may become invalid when you add more elements to the
   2365     matrix. This may happen due to possible buffer reallocation.
   2366 -   Combination of the above 2 methods when you need to process 2 or more sparse matrices
   2367     simultaneously. For example, this is how you can compute unnormalized cross-correlation of the 2
   2368     floating-point sparse matrices:
   2369     @code
   2370         double cross_corr(const SparseMat& a, const SparseMat& b)
   2371         {
   2372             const SparseMat *_a = &a, *_b = &b;
   2373             // if b contains less elements than a,
   2374             // it is faster to iterate through b
   2375             if(_a->nzcount() > _b->nzcount())
   2376                 std::swap(_a, _b);
   2377             SparseMatConstIterator_<float> it = _a->begin<float>(),
   2378                                            it_end = _a->end<float>();
   2379             double ccorr = 0;
   2380             for(; it != it_end; ++it)
   2381             {
   2382                 // take the next element from the first matrix
   2383                 float avalue = *it;
   2384                 const Node* anode = it.node();
   2385                 // and try to find an element with the same index in the second matrix.
   2386                 // since the hash value depends only on the element index,
   2387                 // reuse the hash value stored in the node
   2388                 float bvalue = _b->value<float>(anode->idx,&anode->hashval);
   2389                 ccorr += avalue*bvalue;
   2390             }
   2391             return ccorr;
   2392         }
   2393     @endcode
   2394  */
   2395 class CV_EXPORTS SparseMat
   2396 {
   2397 public:
   2398     typedef SparseMatIterator iterator;
   2399     typedef SparseMatConstIterator const_iterator;
   2400 
   2401     enum { MAGIC_VAL=0x42FD0000, MAX_DIM=32, HASH_SCALE=0x5bd1e995, HASH_BIT=0x80000000 };
   2402 
   2403     //! the sparse matrix header
   2404     struct CV_EXPORTS Hdr
   2405     {
   2406         Hdr(int _dims, const int* _sizes, int _type);
   2407         void clear();
   2408         int refcount;
   2409         int dims;
   2410         int valueOffset;
   2411         size_t nodeSize;
   2412         size_t nodeCount;
   2413         size_t freeList;
   2414         std::vector<uchar> pool;
   2415         std::vector<size_t> hashtab;
   2416         int size[MAX_DIM];
   2417     };
   2418 
   2419     //! sparse matrix node - element of a hash table
   2420     struct CV_EXPORTS Node
   2421     {
   2422         //! hash value
   2423         size_t hashval;
   2424         //! index of the next node in the same hash table entry
   2425         size_t next;
   2426         //! index of the matrix element
   2427         int idx[MAX_DIM];
   2428     };
   2429 
   2430     /** @brief Various SparseMat constructors.
   2431      */
   2432     SparseMat();
   2433 
   2434     /** @overload
   2435     @param dims Array dimensionality.
   2436     @param _sizes Sparce matrix size on all dementions.
   2437     @param _type Sparse matrix data type.
   2438     */
   2439     SparseMat(int dims, const int* _sizes, int _type);
   2440 
   2441     /** @overload
   2442     @param m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted
   2443     to sparse representation.
   2444     */
   2445     SparseMat(const SparseMat& m);
   2446 
   2447     /** @overload
   2448     @param m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted
   2449     to sparse representation.
   2450     */
   2451     explicit SparseMat(const Mat& m);
   2452 
   2453     //! the destructor
   2454     ~SparseMat();
   2455 
   2456     //! assignment operator. This is O(1) operation, i.e. no data is copied
   2457     SparseMat& operator = (const SparseMat& m);
   2458     //! equivalent to the corresponding constructor
   2459     SparseMat& operator = (const Mat& m);
   2460 
   2461     //! creates full copy of the matrix
   2462     SparseMat clone() const;
   2463 
   2464     //! copies all the data to the destination matrix. All the previous content of m is erased
   2465     void copyTo( SparseMat& m ) const;
   2466     //! converts sparse matrix to dense matrix.
   2467     void copyTo( Mat& m ) const;
   2468     //! multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type
   2469     void convertTo( SparseMat& m, int rtype, double alpha=1 ) const;
   2470     //! converts sparse matrix to dense n-dim matrix with optional type conversion and scaling.
   2471     /*!
   2472         @param [out] m - output matrix; if it does not have a proper size or type before the operation,
   2473             it is reallocated
   2474         @param [in] rtype  desired output matrix type or, rather, the depth since the number of channels
   2475             are the same as the input has; if rtype is negative, the output matrix will have the
   2476             same type as the input.
   2477         @param [in] alpha  optional scale factor
   2478         @param [in] beta  optional delta added to the scaled values
   2479     */
   2480     void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const;
   2481 
   2482     // not used now
   2483     void assignTo( SparseMat& m, int type=-1 ) const;
   2484 
   2485     //! reallocates sparse matrix.
   2486     /*!
   2487         If the matrix already had the proper size and type,
   2488         it is simply cleared with clear(), otherwise,
   2489         the old matrix is released (using release()) and the new one is allocated.
   2490     */
   2491     void create(int dims, const int* _sizes, int _type);
   2492     //! sets all the sparse matrix elements to 0, which means clearing the hash table.
   2493     void clear();
   2494     //! manually increments the reference counter to the header.
   2495     void addref();
   2496     // decrements the header reference counter. When the counter reaches 0, the header and all the underlying data are deallocated.
   2497     void release();
   2498 
   2499     //! converts sparse matrix to the old-style representation; all the elements are copied.
   2500     //operator CvSparseMat*() const;
   2501     //! returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements)
   2502     size_t elemSize() const;
   2503     //! returns elemSize()/channels()
   2504     size_t elemSize1() const;
   2505 
   2506     //! returns type of sparse matrix elements
   2507     int type() const;
   2508     //! returns the depth of sparse matrix elements
   2509     int depth() const;
   2510     //! returns the number of channels
   2511     int channels() const;
   2512 
   2513     //! returns the array of sizes, or NULL if the matrix is not allocated
   2514     const int* size() const;
   2515     //! returns the size of i-th matrix dimension (or 0)
   2516     int size(int i) const;
   2517     //! returns the matrix dimensionality
   2518     int dims() const;
   2519     //! returns the number of non-zero elements (=the number of hash table nodes)
   2520     size_t nzcount() const;
   2521 
   2522     //! computes the element hash value (1D case)
   2523     size_t hash(int i0) const;
   2524     //! computes the element hash value (2D case)
   2525     size_t hash(int i0, int i1) const;
   2526     //! computes the element hash value (3D case)
   2527     size_t hash(int i0, int i1, int i2) const;
   2528     //! computes the element hash value (nD case)
   2529     size_t hash(const int* idx) const;
   2530 
   2531     //!@{
   2532     /*!
   2533      specialized variants for 1D, 2D, 3D cases and the generic_type one for n-D case.
   2534      return pointer to the matrix element.
   2535       - if the element is there (it's non-zero), the pointer to it is returned
   2536       - if it's not there and createMissing=false, NULL pointer is returned
   2537       - if it's not there and createMissing=true, then the new element
   2538         is created and initialized with 0. Pointer to it is returned
   2539       - if the optional hashval pointer is not NULL, the element hash value is
   2540         not computed, but *hashval is taken instead.
   2541     */
   2542     //! returns pointer to the specified element (1D case)
   2543     uchar* ptr(int i0, bool createMissing, size_t* hashval=0);
   2544     //! returns pointer to the specified element (2D case)
   2545     uchar* ptr(int i0, int i1, bool createMissing, size_t* hashval=0);
   2546     //! returns pointer to the specified element (3D case)
   2547     uchar* ptr(int i0, int i1, int i2, bool createMissing, size_t* hashval=0);
   2548     //! returns pointer to the specified element (nD case)
   2549     uchar* ptr(const int* idx, bool createMissing, size_t* hashval=0);
   2550     //!@}
   2551 
   2552     //!@{
   2553     /*!
   2554      return read-write reference to the specified sparse matrix element.
   2555 
   2556      `ref<_Tp>(i0,...[,hashval])` is equivalent to `*(_Tp*)ptr(i0,...,true[,hashval])`.
   2557      The methods always return a valid reference.
   2558      If the element did not exist, it is created and initialiazed with 0.
   2559     */
   2560     //! returns reference to the specified element (1D case)
   2561     template<typename _Tp> _Tp& ref(int i0, size_t* hashval=0);
   2562     //! returns reference to the specified element (2D case)
   2563     template<typename _Tp> _Tp& ref(int i0, int i1, size_t* hashval=0);
   2564     //! returns reference to the specified element (3D case)
   2565     template<typename _Tp> _Tp& ref(int i0, int i1, int i2, size_t* hashval=0);
   2566     //! returns reference to the specified element (nD case)
   2567     template<typename _Tp> _Tp& ref(const int* idx, size_t* hashval=0);
   2568     //!@}
   2569 
   2570     //!@{
   2571     /*!
   2572      return value of the specified sparse matrix element.
   2573 
   2574      `value<_Tp>(i0,...[,hashval])` is equivalent to
   2575      @code
   2576      { const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); }
   2577      @endcode
   2578 
   2579      That is, if the element did not exist, the methods return 0.
   2580      */
   2581     //! returns value of the specified element (1D case)
   2582     template<typename _Tp> _Tp value(int i0, size_t* hashval=0) const;
   2583     //! returns value of the specified element (2D case)
   2584     template<typename _Tp> _Tp value(int i0, int i1, size_t* hashval=0) const;
   2585     //! returns value of the specified element (3D case)
   2586     template<typename _Tp> _Tp value(int i0, int i1, int i2, size_t* hashval=0) const;
   2587     //! returns value of the specified element (nD case)
   2588     template<typename _Tp> _Tp value(const int* idx, size_t* hashval=0) const;
   2589     //!@}
   2590 
   2591     //!@{
   2592     /*!
   2593      Return pointer to the specified sparse matrix element if it exists
   2594 
   2595      `find<_Tp>(i0,...[,hashval])` is equivalent to `(_const Tp*)ptr(i0,...false[,hashval])`.
   2596 
   2597      If the specified element does not exist, the methods return NULL.
   2598     */
   2599     //! returns pointer to the specified element (1D case)
   2600     template<typename _Tp> const _Tp* find(int i0, size_t* hashval=0) const;
   2601     //! returns pointer to the specified element (2D case)
   2602     template<typename _Tp> const _Tp* find(int i0, int i1, size_t* hashval=0) const;
   2603     //! returns pointer to the specified element (3D case)
   2604     template<typename _Tp> const _Tp* find(int i0, int i1, int i2, size_t* hashval=0) const;
   2605     //! returns pointer to the specified element (nD case)
   2606     template<typename _Tp> const _Tp* find(const int* idx, size_t* hashval=0) const;
   2607     //!@}
   2608 
   2609     //! erases the specified element (2D case)
   2610     void erase(int i0, int i1, size_t* hashval=0);
   2611     //! erases the specified element (3D case)
   2612     void erase(int i0, int i1, int i2, size_t* hashval=0);
   2613     //! erases the specified element (nD case)
   2614     void erase(const int* idx, size_t* hashval=0);
   2615 
   2616     //!@{
   2617     /*!
   2618        return the sparse matrix iterator pointing to the first sparse matrix element
   2619     */
   2620     //! returns the sparse matrix iterator at the matrix beginning
   2621     SparseMatIterator begin();
   2622     //! returns the sparse matrix iterator at the matrix beginning
   2623     template<typename _Tp> SparseMatIterator_<_Tp> begin();
   2624     //! returns the read-only sparse matrix iterator at the matrix beginning
   2625     SparseMatConstIterator begin() const;
   2626     //! returns the read-only sparse matrix iterator at the matrix beginning
   2627     template<typename _Tp> SparseMatConstIterator_<_Tp> begin() const;
   2628     //!@}
   2629     /*!
   2630        return the sparse matrix iterator pointing to the element following the last sparse matrix element
   2631     */
   2632     //! returns the sparse matrix iterator at the matrix end
   2633     SparseMatIterator end();
   2634     //! returns the read-only sparse matrix iterator at the matrix end
   2635     SparseMatConstIterator end() const;
   2636     //! returns the typed sparse matrix iterator at the matrix end
   2637     template<typename _Tp> SparseMatIterator_<_Tp> end();
   2638     //! returns the typed read-only sparse matrix iterator at the matrix end
   2639     template<typename _Tp> SparseMatConstIterator_<_Tp> end() const;
   2640 
   2641     //! returns the value stored in the sparse martix node
   2642     template<typename _Tp> _Tp& value(Node* n);
   2643     //! returns the value stored in the sparse martix node
   2644     template<typename _Tp> const _Tp& value(const Node* n) const;
   2645 
   2646     ////////////// some internal-use methods ///////////////
   2647     Node* node(size_t nidx);
   2648     const Node* node(size_t nidx) const;
   2649 
   2650     uchar* newNode(const int* idx, size_t hashval);
   2651     void removeNode(size_t hidx, size_t nidx, size_t previdx);
   2652     void resizeHashTab(size_t newsize);
   2653 
   2654     int flags;
   2655     Hdr* hdr;
   2656 };
   2657 
   2658 
   2659 
   2660 ///////////////////////////////// SparseMat_<_Tp> ////////////////////////////////////
   2661 
   2662 /** @brief Template sparse n-dimensional array class derived from SparseMat
   2663 
   2664 SparseMat_ is a thin wrapper on top of SparseMat created in the same way as Mat_ . It simplifies
   2665 notation of some operations:
   2666 @code
   2667     int sz[] = {10, 20, 30};
   2668     SparseMat_<double> M(3, sz);
   2669     ...
   2670     M.ref(1, 2, 3) = M(4, 5, 6) + M(7, 8, 9);
   2671 @endcode
   2672  */
   2673 template<typename _Tp> class SparseMat_ : public SparseMat
   2674 {
   2675 public:
   2676     typedef SparseMatIterator_<_Tp> iterator;
   2677     typedef SparseMatConstIterator_<_Tp> const_iterator;
   2678 
   2679     //! the default constructor
   2680     SparseMat_();
   2681     //! the full constructor equivelent to SparseMat(dims, _sizes, DataType<_Tp>::type)
   2682     SparseMat_(int dims, const int* _sizes);
   2683     //! the copy constructor. If DataType<_Tp>.type != m.type(), the m elements are converted
   2684     SparseMat_(const SparseMat& m);
   2685     //! the copy constructor. This is O(1) operation - no data is copied
   2686     SparseMat_(const SparseMat_& m);
   2687     //! converts dense matrix to the sparse form
   2688     SparseMat_(const Mat& m);
   2689     //! converts the old-style sparse matrix to the C++ class. All the elements are copied
   2690     //SparseMat_(const CvSparseMat* m);
   2691     //! the assignment operator. If DataType<_Tp>.type != m.type(), the m elements are converted
   2692     SparseMat_& operator = (const SparseMat& m);
   2693     //! the assignment operator. This is O(1) operation - no data is copied
   2694     SparseMat_& operator = (const SparseMat_& m);
   2695     //! converts dense matrix to the sparse form
   2696     SparseMat_& operator = (const Mat& m);
   2697 
   2698     //! makes full copy of the matrix. All the elements are duplicated
   2699     SparseMat_ clone() const;
   2700     //! equivalent to cv::SparseMat::create(dims, _sizes, DataType<_Tp>::type)
   2701     void create(int dims, const int* _sizes);
   2702     //! converts sparse matrix to the old-style CvSparseMat. All the elements are copied
   2703     //operator CvSparseMat*() const;
   2704 
   2705     //! returns type of the matrix elements
   2706     int type() const;
   2707     //! returns depth of the matrix elements
   2708     int depth() const;
   2709     //! returns the number of channels in each matrix element
   2710     int channels() const;
   2711 
   2712     //! equivalent to SparseMat::ref<_Tp>(i0, hashval)
   2713     _Tp& ref(int i0, size_t* hashval=0);
   2714     //! equivalent to SparseMat::ref<_Tp>(i0, i1, hashval)
   2715     _Tp& ref(int i0, int i1, size_t* hashval=0);
   2716     //! equivalent to SparseMat::ref<_Tp>(i0, i1, i2, hashval)
   2717     _Tp& ref(int i0, int i1, int i2, size_t* hashval=0);
   2718     //! equivalent to SparseMat::ref<_Tp>(idx, hashval)
   2719     _Tp& ref(const int* idx, size_t* hashval=0);
   2720 
   2721     //! equivalent to SparseMat::value<_Tp>(i0, hashval)
   2722     _Tp operator()(int i0, size_t* hashval=0) const;
   2723     //! equivalent to SparseMat::value<_Tp>(i0, i1, hashval)
   2724     _Tp operator()(int i0, int i1, size_t* hashval=0) const;
   2725     //! equivalent to SparseMat::value<_Tp>(i0, i1, i2, hashval)
   2726     _Tp operator()(int i0, int i1, int i2, size_t* hashval=0) const;
   2727     //! equivalent to SparseMat::value<_Tp>(idx, hashval)
   2728     _Tp operator()(const int* idx, size_t* hashval=0) const;
   2729 
   2730     //! returns sparse matrix iterator pointing to the first sparse matrix element
   2731     SparseMatIterator_<_Tp> begin();
   2732     //! returns read-only sparse matrix iterator pointing to the first sparse matrix element
   2733     SparseMatConstIterator_<_Tp> begin() const;
   2734     //! returns sparse matrix iterator pointing to the element following the last sparse matrix element
   2735     SparseMatIterator_<_Tp> end();
   2736     //! returns read-only sparse matrix iterator pointing to the element following the last sparse matrix element
   2737     SparseMatConstIterator_<_Tp> end() const;
   2738 };
   2739 
   2740 
   2741 
   2742 ////////////////////////////////// MatConstIterator //////////////////////////////////
   2743 
   2744 class CV_EXPORTS MatConstIterator
   2745 {
   2746 public:
   2747     typedef uchar* value_type;
   2748     typedef ptrdiff_t difference_type;
   2749     typedef const uchar** pointer;
   2750     typedef uchar* reference;
   2751 
   2752 #ifndef OPENCV_NOSTL
   2753     typedef std::random_access_iterator_tag iterator_category;
   2754 #endif
   2755 
   2756     //! default constructor
   2757     MatConstIterator();
   2758     //! constructor that sets the iterator to the beginning of the matrix
   2759     MatConstIterator(const Mat* _m);
   2760     //! constructor that sets the iterator to the specified element of the matrix
   2761     MatConstIterator(const Mat* _m, int _row, int _col=0);
   2762     //! constructor that sets the iterator to the specified element of the matrix
   2763     MatConstIterator(const Mat* _m, Point _pt);
   2764     //! constructor that sets the iterator to the specified element of the matrix
   2765     MatConstIterator(const Mat* _m, const int* _idx);
   2766     //! copy constructor
   2767     MatConstIterator(const MatConstIterator& it);
   2768 
   2769     //! copy operator
   2770     MatConstIterator& operator = (const MatConstIterator& it);
   2771     //! returns the current matrix element
   2772     const uchar* operator *() const;
   2773     //! returns the i-th matrix element, relative to the current
   2774     const uchar* operator [](ptrdiff_t i) const;
   2775 
   2776     //! shifts the iterator forward by the specified number of elements
   2777     MatConstIterator& operator += (ptrdiff_t ofs);
   2778     //! shifts the iterator backward by the specified number of elements
   2779     MatConstIterator& operator -= (ptrdiff_t ofs);
   2780     //! decrements the iterator
   2781     MatConstIterator& operator --();
   2782     //! decrements the iterator
   2783     MatConstIterator operator --(int);
   2784     //! increments the iterator
   2785     MatConstIterator& operator ++();
   2786     //! increments the iterator
   2787     MatConstIterator operator ++(int);
   2788     //! returns the current iterator position
   2789     Point pos() const;
   2790     //! returns the current iterator position
   2791     void pos(int* _idx) const;
   2792 
   2793     ptrdiff_t lpos() const;
   2794     void seek(ptrdiff_t ofs, bool relative = false);
   2795     void seek(const int* _idx, bool relative = false);
   2796 
   2797     const Mat* m;
   2798     size_t elemSize;
   2799     const uchar* ptr;
   2800     const uchar* sliceStart;
   2801     const uchar* sliceEnd;
   2802 };
   2803 
   2804 
   2805 
   2806 ////////////////////////////////// MatConstIterator_ /////////////////////////////////
   2807 
   2808 /** @brief Matrix read-only iterator
   2809  */
   2810 template<typename _Tp>
   2811 class MatConstIterator_ : public MatConstIterator
   2812 {
   2813 public:
   2814     typedef _Tp value_type;
   2815     typedef ptrdiff_t difference_type;
   2816     typedef const _Tp* pointer;
   2817     typedef const _Tp& reference;
   2818 
   2819 #ifndef OPENCV_NOSTL
   2820     typedef std::random_access_iterator_tag iterator_category;
   2821 #endif
   2822 
   2823     //! default constructor
   2824     MatConstIterator_();
   2825     //! constructor that sets the iterator to the beginning of the matrix
   2826     MatConstIterator_(const Mat_<_Tp>* _m);
   2827     //! constructor that sets the iterator to the specified element of the matrix
   2828     MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col=0);
   2829     //! constructor that sets the iterator to the specified element of the matrix
   2830     MatConstIterator_(const Mat_<_Tp>* _m, Point _pt);
   2831     //! constructor that sets the iterator to the specified element of the matrix
   2832     MatConstIterator_(const Mat_<_Tp>* _m, const int* _idx);
   2833     //! copy constructor
   2834     MatConstIterator_(const MatConstIterator_& it);
   2835 
   2836     //! copy operator
   2837     MatConstIterator_& operator = (const MatConstIterator_& it);
   2838     //! returns the current matrix element
   2839     _Tp operator *() const;
   2840     //! returns the i-th matrix element, relative to the current
   2841     _Tp operator [](ptrdiff_t i) const;
   2842 
   2843     //! shifts the iterator forward by the specified number of elements
   2844     MatConstIterator_& operator += (ptrdiff_t ofs);
   2845     //! shifts the iterator backward by the specified number of elements
   2846     MatConstIterator_& operator -= (ptrdiff_t ofs);
   2847     //! decrements the iterator
   2848     MatConstIterator_& operator --();
   2849     //! decrements the iterator
   2850     MatConstIterator_ operator --(int);
   2851     //! increments the iterator
   2852     MatConstIterator_& operator ++();
   2853     //! increments the iterator
   2854     MatConstIterator_ operator ++(int);
   2855     //! returns the current iterator position
   2856     Point pos() const;
   2857 };
   2858 
   2859 
   2860 
   2861 //////////////////////////////////// MatIterator_ ////////////////////////////////////
   2862 
   2863 /** @brief Matrix read-write iterator
   2864 */
   2865 template<typename _Tp>
   2866 class MatIterator_ : public MatConstIterator_<_Tp>
   2867 {
   2868 public:
   2869     typedef _Tp* pointer;
   2870     typedef _Tp& reference;
   2871 
   2872 #ifndef OPENCV_NOSTL
   2873     typedef std::random_access_iterator_tag iterator_category;
   2874 #endif
   2875 
   2876     //! the default constructor
   2877     MatIterator_();
   2878     //! constructor that sets the iterator to the beginning of the matrix
   2879     MatIterator_(Mat_<_Tp>* _m);
   2880     //! constructor that sets the iterator to the specified element of the matrix
   2881     MatIterator_(Mat_<_Tp>* _m, int _row, int _col=0);
   2882     //! constructor that sets the iterator to the specified element of the matrix
   2883     MatIterator_(Mat_<_Tp>* _m, Point _pt);
   2884     //! constructor that sets the iterator to the specified element of the matrix
   2885     MatIterator_(Mat_<_Tp>* _m, const int* _idx);
   2886     //! copy constructor
   2887     MatIterator_(const MatIterator_& it);
   2888     //! copy operator
   2889     MatIterator_& operator = (const MatIterator_<_Tp>& it );
   2890 
   2891     //! returns the current matrix element
   2892     _Tp& operator *() const;
   2893     //! returns the i-th matrix element, relative to the current
   2894     _Tp& operator [](ptrdiff_t i) const;
   2895 
   2896     //! shifts the iterator forward by the specified number of elements
   2897     MatIterator_& operator += (ptrdiff_t ofs);
   2898     //! shifts the iterator backward by the specified number of elements
   2899     MatIterator_& operator -= (ptrdiff_t ofs);
   2900     //! decrements the iterator
   2901     MatIterator_& operator --();
   2902     //! decrements the iterator
   2903     MatIterator_ operator --(int);
   2904     //! increments the iterator
   2905     MatIterator_& operator ++();
   2906     //! increments the iterator
   2907     MatIterator_ operator ++(int);
   2908 };
   2909 
   2910 
   2911 
   2912 /////////////////////////////// SparseMatConstIterator ///////////////////////////////
   2913 
   2914 /**  @brief Read-Only Sparse Matrix Iterator.
   2915 
   2916  Here is how to use the iterator to compute the sum of floating-point sparse matrix elements:
   2917 
   2918  \code
   2919  SparseMatConstIterator it = m.begin(), it_end = m.end();
   2920  double s = 0;
   2921  CV_Assert( m.type() == CV_32F );
   2922  for( ; it != it_end; ++it )
   2923     s += it.value<float>();
   2924  \endcode
   2925 */
   2926 class CV_EXPORTS SparseMatConstIterator
   2927 {
   2928 public:
   2929     //! the default constructor
   2930     SparseMatConstIterator();
   2931     //! the full constructor setting the iterator to the first sparse matrix element
   2932     SparseMatConstIterator(const SparseMat* _m);
   2933     //! the copy constructor
   2934     SparseMatConstIterator(const SparseMatConstIterator& it);
   2935 
   2936     //! the assignment operator
   2937     SparseMatConstIterator& operator = (const SparseMatConstIterator& it);
   2938 
   2939     //! template method returning the current matrix element
   2940     template<typename _Tp> const _Tp& value() const;
   2941     //! returns the current node of the sparse matrix. it.node->idx is the current element index
   2942     const SparseMat::Node* node() const;
   2943 
   2944     //! moves iterator to the previous element
   2945     SparseMatConstIterator& operator --();
   2946     //! moves iterator to the previous element
   2947     SparseMatConstIterator operator --(int);
   2948     //! moves iterator to the next element
   2949     SparseMatConstIterator& operator ++();
   2950     //! moves iterator to the next element
   2951     SparseMatConstIterator operator ++(int);
   2952 
   2953     //! moves iterator to the element after the last element
   2954     void seekEnd();
   2955 
   2956     const SparseMat* m;
   2957     size_t hashidx;
   2958     uchar* ptr;
   2959 };
   2960 
   2961 
   2962 
   2963 ////////////////////////////////// SparseMatIterator /////////////////////////////////
   2964 
   2965 /** @brief  Read-write Sparse Matrix Iterator
   2966 
   2967  The class is similar to cv::SparseMatConstIterator,
   2968  but can be used for in-place modification of the matrix elements.
   2969 */
   2970 class CV_EXPORTS SparseMatIterator : public SparseMatConstIterator
   2971 {
   2972 public:
   2973     //! the default constructor
   2974     SparseMatIterator();
   2975     //! the full constructor setting the iterator to the first sparse matrix element
   2976     SparseMatIterator(SparseMat* _m);
   2977     //! the full constructor setting the iterator to the specified sparse matrix element
   2978     SparseMatIterator(SparseMat* _m, const int* idx);
   2979     //! the copy constructor
   2980     SparseMatIterator(const SparseMatIterator& it);
   2981 
   2982     //! the assignment operator
   2983     SparseMatIterator& operator = (const SparseMatIterator& it);
   2984     //! returns read-write reference to the current sparse matrix element
   2985     template<typename _Tp> _Tp& value() const;
   2986     //! returns pointer to the current sparse matrix node. it.node->idx is the index of the current element (do not modify it!)
   2987     SparseMat::Node* node() const;
   2988 
   2989     //! moves iterator to the next element
   2990     SparseMatIterator& operator ++();
   2991     //! moves iterator to the next element
   2992     SparseMatIterator operator ++(int);
   2993 };
   2994 
   2995 
   2996 
   2997 /////////////////////////////// SparseMatConstIterator_ //////////////////////////////
   2998 
   2999 /** @brief  Template Read-Only Sparse Matrix Iterator Class.
   3000 
   3001  This is the derived from SparseMatConstIterator class that
   3002  introduces more convenient operator *() for accessing the current element.
   3003 */
   3004 template<typename _Tp> class SparseMatConstIterator_ : public SparseMatConstIterator
   3005 {
   3006 public:
   3007 
   3008 #ifndef OPENCV_NOSTL
   3009     typedef std::forward_iterator_tag iterator_category;
   3010 #endif
   3011 
   3012     //! the default constructor
   3013     SparseMatConstIterator_();
   3014     //! the full constructor setting the iterator to the first sparse matrix element
   3015     SparseMatConstIterator_(const SparseMat_<_Tp>* _m);
   3016     SparseMatConstIterator_(const SparseMat* _m);
   3017     //! the copy constructor
   3018     SparseMatConstIterator_(const SparseMatConstIterator_& it);
   3019 
   3020     //! the assignment operator
   3021     SparseMatConstIterator_& operator = (const SparseMatConstIterator_& it);
   3022     //! the element access operator
   3023     const _Tp& operator *() const;
   3024 
   3025     //! moves iterator to the next element
   3026     SparseMatConstIterator_& operator ++();
   3027     //! moves iterator to the next element
   3028     SparseMatConstIterator_ operator ++(int);
   3029 };
   3030 
   3031 
   3032 
   3033 ///////////////////////////////// SparseMatIterator_ /////////////////////////////////
   3034 
   3035 /** @brief  Template Read-Write Sparse Matrix Iterator Class.
   3036 
   3037  This is the derived from cv::SparseMatConstIterator_ class that
   3038  introduces more convenient operator *() for accessing the current element.
   3039 */
   3040 template<typename _Tp> class SparseMatIterator_ : public SparseMatConstIterator_<_Tp>
   3041 {
   3042 public:
   3043 
   3044 #ifndef OPENCV_NOSTL
   3045     typedef std::forward_iterator_tag iterator_category;
   3046 #endif
   3047 
   3048     //! the default constructor
   3049     SparseMatIterator_();
   3050     //! the full constructor setting the iterator to the first sparse matrix element
   3051     SparseMatIterator_(SparseMat_<_Tp>* _m);
   3052     SparseMatIterator_(SparseMat* _m);
   3053     //! the copy constructor
   3054     SparseMatIterator_(const SparseMatIterator_& it);
   3055 
   3056     //! the assignment operator
   3057     SparseMatIterator_& operator = (const SparseMatIterator_& it);
   3058     //! returns the reference to the current element
   3059     _Tp& operator *() const;
   3060 
   3061     //! moves the iterator to the next element
   3062     SparseMatIterator_& operator ++();
   3063     //! moves the iterator to the next element
   3064     SparseMatIterator_ operator ++(int);
   3065 };
   3066 
   3067 
   3068 
   3069 /////////////////////////////////// NAryMatIterator //////////////////////////////////
   3070 
   3071 /** @brief n-ary multi-dimensional array iterator.
   3072 
   3073 Use the class to implement unary, binary, and, generally, n-ary element-wise operations on
   3074 multi-dimensional arrays. Some of the arguments of an n-ary function may be continuous arrays, some
   3075 may be not. It is possible to use conventional MatIterator 's for each array but incrementing all of
   3076 the iterators after each small operations may be a big overhead. In this case consider using
   3077 NAryMatIterator to iterate through several matrices simultaneously as long as they have the same
   3078 geometry (dimensionality and all the dimension sizes are the same). On each iteration `it.planes[0]`,
   3079 `it.planes[1]`,... will be the slices of the corresponding matrices.
   3080 
   3081 The example below illustrates how you can compute a normalized and threshold 3D color histogram:
   3082 @code
   3083     void computeNormalizedColorHist(const Mat& image, Mat& hist, int N, double minProb)
   3084     {
   3085         const int histSize[] = {N, N, N};
   3086 
   3087         // make sure that the histogram has a proper size and type
   3088         hist.create(3, histSize, CV_32F);
   3089 
   3090         // and clear it
   3091         hist = Scalar(0);
   3092 
   3093         // the loop below assumes that the image
   3094         // is a 8-bit 3-channel. check it.
   3095         CV_Assert(image.type() == CV_8UC3);
   3096         MatConstIterator_<Vec3b> it = image.begin<Vec3b>(),
   3097                                  it_end = image.end<Vec3b>();
   3098         for( ; it != it_end; ++it )
   3099         {
   3100             const Vec3b& pix = *it;
   3101             hist.at<float>(pix[0]*N/256, pix[1]*N/256, pix[2]*N/256) += 1.f;
   3102         }
   3103 
   3104         minProb *= image.rows*image.cols;
   3105         Mat plane;
   3106         NAryMatIterator it(&hist, &plane, 1);
   3107         double s = 0;
   3108         // iterate through the matrix. on each iteration
   3109         // it.planes[*] (of type Mat) will be set to the current plane.
   3110         for(int p = 0; p < it.nplanes; p++, ++it)
   3111         {
   3112             threshold(it.planes[0], it.planes[0], minProb, 0, THRESH_TOZERO);
   3113             s += sum(it.planes[0])[0];
   3114         }
   3115 
   3116         s = 1./s;
   3117         it = NAryMatIterator(&hist, &plane, 1);
   3118         for(int p = 0; p < it.nplanes; p++, ++it)
   3119             it.planes[0] *= s;
   3120     }
   3121 @endcode
   3122  */
   3123 class CV_EXPORTS NAryMatIterator
   3124 {
   3125 public:
   3126     //! the default constructor
   3127     NAryMatIterator();
   3128     //! the full constructor taking arbitrary number of n-dim matrices
   3129     NAryMatIterator(const Mat** arrays, uchar** ptrs, int narrays=-1);
   3130     //! the full constructor taking arbitrary number of n-dim matrices
   3131     NAryMatIterator(const Mat** arrays, Mat* planes, int narrays=-1);
   3132     //! the separate iterator initialization method
   3133     void init(const Mat** arrays, Mat* planes, uchar** ptrs, int narrays=-1);
   3134 
   3135     //! proceeds to the next plane of every iterated matrix
   3136     NAryMatIterator& operator ++();
   3137     //! proceeds to the next plane of every iterated matrix (postfix increment operator)
   3138     NAryMatIterator operator ++(int);
   3139 
   3140     //! the iterated arrays
   3141     const Mat** arrays;
   3142     //! the current planes
   3143     Mat* planes;
   3144     //! data pointers
   3145     uchar** ptrs;
   3146     //! the number of arrays
   3147     int narrays;
   3148     //! the number of hyper-planes that the iterator steps through
   3149     size_t nplanes;
   3150     //! the size of each segment (in elements)
   3151     size_t size;
   3152 protected:
   3153     int iterdepth;
   3154     size_t idx;
   3155 };
   3156 
   3157 
   3158 
   3159 ///////////////////////////////// Matrix Expressions /////////////////////////////////
   3160 
   3161 class CV_EXPORTS MatOp
   3162 {
   3163 public:
   3164     MatOp();
   3165     virtual ~MatOp();
   3166 
   3167     virtual bool elementWise(const MatExpr& expr) const;
   3168     virtual void assign(const MatExpr& expr, Mat& m, int type=-1) const = 0;
   3169     virtual void roi(const MatExpr& expr, const Range& rowRange,
   3170                      const Range& colRange, MatExpr& res) const;
   3171     virtual void diag(const MatExpr& expr, int d, MatExpr& res) const;
   3172     virtual void augAssignAdd(const MatExpr& expr, Mat& m) const;
   3173     virtual void augAssignSubtract(const MatExpr& expr, Mat& m) const;
   3174     virtual void augAssignMultiply(const MatExpr& expr, Mat& m) const;
   3175     virtual void augAssignDivide(const MatExpr& expr, Mat& m) const;
   3176     virtual void augAssignAnd(const MatExpr& expr, Mat& m) const;
   3177     virtual void augAssignOr(const MatExpr& expr, Mat& m) const;
   3178     virtual void augAssignXor(const MatExpr& expr, Mat& m) const;
   3179 
   3180     virtual void add(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
   3181     virtual void add(const MatExpr& expr1, const Scalar& s, MatExpr& res) const;
   3182 
   3183     virtual void subtract(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
   3184     virtual void subtract(const Scalar& s, const MatExpr& expr, MatExpr& res) const;
   3185 
   3186     virtual void multiply(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=1) const;
   3187     virtual void multiply(const MatExpr& expr1, double s, MatExpr& res) const;
   3188 
   3189     virtual void divide(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=1) const;
   3190     virtual void divide(double s, const MatExpr& expr, MatExpr& res) const;
   3191 
   3192     virtual void abs(const MatExpr& expr, MatExpr& res) const;
   3193 
   3194     virtual void transpose(const MatExpr& expr, MatExpr& res) const;
   3195     virtual void matmul(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
   3196     virtual void invert(const MatExpr& expr, int method, MatExpr& res) const;
   3197 
   3198     virtual Size size(const MatExpr& expr) const;
   3199     virtual int type(const MatExpr& expr) const;
   3200 };
   3201 
   3202 /** @brief Matrix expression representation
   3203 @anchor MatrixExpressions
   3204 This is a list of implemented matrix operations that can be combined in arbitrary complex
   3205 expressions (here A, B stand for matrices ( Mat ), s for a scalar ( Scalar ), alpha for a
   3206 real-valued scalar ( double )):
   3207 -   Addition, subtraction, negation: `A+B`, `A-B`, `A+s`, `A-s`, `s+A`, `s-A`, `-A`
   3208 -   Scaling: `A*alpha`
   3209 -   Per-element multiplication and division: `A.mul(B)`, `A/B`, `alpha/A`
   3210 -   Matrix multiplication: `A*B`
   3211 -   Transposition: `A.t()` (means A<sup>T</sup>)
   3212 -   Matrix inversion and pseudo-inversion, solving linear systems and least-squares problems:
   3213     `A.inv([method]) (~ A<sup>-1</sup>)`,   `A.inv([method])*B (~ X: AX=B)`
   3214 -   Comparison: `A cmpop B`, `A cmpop alpha`, `alpha cmpop A`, where *cmpop* is one of
   3215   `>`, `>=`, `==`, `!=`, `<=`, `<`. The result of comparison is an 8-bit single channel mask whose
   3216     elements are set to 255 (if the particular element or pair of elements satisfy the condition) or
   3217     0.
   3218 -   Bitwise logical operations: `A logicop B`, `A logicop s`, `s logicop A`, `~A`, where *logicop* is one of
   3219   `&`, `|`, `^`.
   3220 -   Element-wise minimum and maximum: `min(A, B)`, `min(A, alpha)`, `max(A, B)`, `max(A, alpha)`
   3221 -   Element-wise absolute value: `abs(A)`
   3222 -   Cross-product, dot-product: `A.cross(B)`, `A.dot(B)`
   3223 -   Any function of matrix or matrices and scalars that returns a matrix or a scalar, such as norm,
   3224     mean, sum, countNonZero, trace, determinant, repeat, and others.
   3225 -   Matrix initializers ( Mat::eye(), Mat::zeros(), Mat::ones() ), matrix comma-separated
   3226     initializers, matrix constructors and operators that extract sub-matrices (see Mat description).
   3227 -   Mat_<destination_type>() constructors to cast the result to the proper type.
   3228 @note Comma-separated initializers and probably some other operations may require additional
   3229 explicit Mat() or Mat_<T>() constructor calls to resolve a possible ambiguity.
   3230 
   3231 Here are examples of matrix expressions:
   3232 @code
   3233     // compute pseudo-inverse of A, equivalent to A.inv(DECOMP_SVD)
   3234     SVD svd(A);
   3235     Mat pinvA = svd.vt.t()*Mat::diag(1./svd.w)*svd.u.t();
   3236 
   3237     // compute the new vector of parameters in the Levenberg-Marquardt algorithm
   3238     x -= (A.t()*A + lambda*Mat::eye(A.cols,A.cols,A.type())).inv(DECOMP_CHOLESKY)*(A.t()*err);
   3239 
   3240     // sharpen image using "unsharp mask" algorithm
   3241     Mat blurred; double sigma = 1, threshold = 5, amount = 1;
   3242     GaussianBlur(img, blurred, Size(), sigma, sigma);
   3243     Mat lowConstrastMask = abs(img - blurred) < threshold;
   3244     Mat sharpened = img*(1+amount) + blurred*(-amount);
   3245     img.copyTo(sharpened, lowContrastMask);
   3246 @endcode
   3247 */
   3248 class CV_EXPORTS MatExpr
   3249 {
   3250 public:
   3251     MatExpr();
   3252     explicit MatExpr(const Mat& m);
   3253 
   3254     MatExpr(const MatOp* _op, int _flags, const Mat& _a = Mat(), const Mat& _b = Mat(),
   3255             const Mat& _c = Mat(), double _alpha = 1, double _beta = 1, const Scalar& _s = Scalar());
   3256 
   3257     operator Mat() const;
   3258     template<typename _Tp> operator Mat_<_Tp>() const;
   3259 
   3260     Size size() const;
   3261     int type() const;
   3262 
   3263     MatExpr row(int y) const;
   3264     MatExpr col(int x) const;
   3265     MatExpr diag(int d = 0) const;
   3266     MatExpr operator()( const Range& rowRange, const Range& colRange ) const;
   3267     MatExpr operator()( const Rect& roi ) const;
   3268 
   3269     MatExpr t() const;
   3270     MatExpr inv(int method = DECOMP_LU) const;
   3271     MatExpr mul(const MatExpr& e, double scale=1) const;
   3272     MatExpr mul(const Mat& m, double scale=1) const;
   3273 
   3274     Mat cross(const Mat& m) const;
   3275     double dot(const Mat& m) const;
   3276 
   3277     const MatOp* op;
   3278     int flags;
   3279 
   3280     Mat a, b, c;
   3281     double alpha, beta;
   3282     Scalar s;
   3283 };
   3284 
   3285 //! @} core_basic
   3286 
   3287 //! @relates cv::MatExpr
   3288 //! @{
   3289 CV_EXPORTS MatExpr operator + (const Mat& a, const Mat& b);
   3290 CV_EXPORTS MatExpr operator + (const Mat& a, const Scalar& s);
   3291 CV_EXPORTS MatExpr operator + (const Scalar& s, const Mat& a);
   3292 CV_EXPORTS MatExpr operator + (const MatExpr& e, const Mat& m);
   3293 CV_EXPORTS MatExpr operator + (const Mat& m, const MatExpr& e);
   3294 CV_EXPORTS MatExpr operator + (const MatExpr& e, const Scalar& s);
   3295 CV_EXPORTS MatExpr operator + (const Scalar& s, const MatExpr& e);
   3296 CV_EXPORTS MatExpr operator + (const MatExpr& e1, const MatExpr& e2);
   3297 
   3298 CV_EXPORTS MatExpr operator - (const Mat& a, const Mat& b);
   3299 CV_EXPORTS MatExpr operator - (const Mat& a, const Scalar& s);
   3300 CV_EXPORTS MatExpr operator - (const Scalar& s, const Mat& a);
   3301 CV_EXPORTS MatExpr operator - (const MatExpr& e, const Mat& m);
   3302 CV_EXPORTS MatExpr operator - (const Mat& m, const MatExpr& e);
   3303 CV_EXPORTS MatExpr operator - (const MatExpr& e, const Scalar& s);
   3304 CV_EXPORTS MatExpr operator - (const Scalar& s, const MatExpr& e);
   3305 CV_EXPORTS MatExpr operator - (const MatExpr& e1, const MatExpr& e2);
   3306 
   3307 CV_EXPORTS MatExpr operator - (const Mat& m);
   3308 CV_EXPORTS MatExpr operator - (const MatExpr& e);
   3309 
   3310 CV_EXPORTS MatExpr operator * (const Mat& a, const Mat& b);
   3311 CV_EXPORTS MatExpr operator * (const Mat& a, double s);
   3312 CV_EXPORTS MatExpr operator * (double s, const Mat& a);
   3313 CV_EXPORTS MatExpr operator * (const MatExpr& e, const Mat& m);
   3314 CV_EXPORTS MatExpr operator * (const Mat& m, const MatExpr& e);
   3315 CV_EXPORTS MatExpr operator * (const MatExpr& e, double s);
   3316 CV_EXPORTS MatExpr operator * (double s, const MatExpr& e);
   3317 CV_EXPORTS MatExpr operator * (const MatExpr& e1, const MatExpr& e2);
   3318 
   3319 CV_EXPORTS MatExpr operator / (const Mat& a, const Mat& b);
   3320 CV_EXPORTS MatExpr operator / (const Mat& a, double s);
   3321 CV_EXPORTS MatExpr operator / (double s, const Mat& a);
   3322 CV_EXPORTS MatExpr operator / (const MatExpr& e, const Mat& m);
   3323 CV_EXPORTS MatExpr operator / (const Mat& m, const MatExpr& e);
   3324 CV_EXPORTS MatExpr operator / (const MatExpr& e, double s);
   3325 CV_EXPORTS MatExpr operator / (double s, const MatExpr& e);
   3326 CV_EXPORTS MatExpr operator / (const MatExpr& e1, const MatExpr& e2);
   3327 
   3328 CV_EXPORTS MatExpr operator < (const Mat& a, const Mat& b);
   3329 CV_EXPORTS MatExpr operator < (const Mat& a, double s);
   3330 CV_EXPORTS MatExpr operator < (double s, const Mat& a);
   3331 
   3332 CV_EXPORTS MatExpr operator <= (const Mat& a, const Mat& b);
   3333 CV_EXPORTS MatExpr operator <= (const Mat& a, double s);
   3334 CV_EXPORTS MatExpr operator <= (double s, const Mat& a);
   3335 
   3336 CV_EXPORTS MatExpr operator == (const Mat& a, const Mat& b);
   3337 CV_EXPORTS MatExpr operator == (const Mat& a, double s);
   3338 CV_EXPORTS MatExpr operator == (double s, const Mat& a);
   3339 
   3340 CV_EXPORTS MatExpr operator != (const Mat& a, const Mat& b);
   3341 CV_EXPORTS MatExpr operator != (const Mat& a, double s);
   3342 CV_EXPORTS MatExpr operator != (double s, const Mat& a);
   3343 
   3344 CV_EXPORTS MatExpr operator >= (const Mat& a, const Mat& b);
   3345 CV_EXPORTS MatExpr operator >= (const Mat& a, double s);
   3346 CV_EXPORTS MatExpr operator >= (double s, const Mat& a);
   3347 
   3348 CV_EXPORTS MatExpr operator > (const Mat& a, const Mat& b);
   3349 CV_EXPORTS MatExpr operator > (const Mat& a, double s);
   3350 CV_EXPORTS MatExpr operator > (double s, const Mat& a);
   3351 
   3352 CV_EXPORTS MatExpr operator & (const Mat& a, const Mat& b);
   3353 CV_EXPORTS MatExpr operator & (const Mat& a, const Scalar& s);
   3354 CV_EXPORTS MatExpr operator & (const Scalar& s, const Mat& a);
   3355 
   3356 CV_EXPORTS MatExpr operator | (const Mat& a, const Mat& b);
   3357 CV_EXPORTS MatExpr operator | (const Mat& a, const Scalar& s);
   3358 CV_EXPORTS MatExpr operator | (const Scalar& s, const Mat& a);
   3359 
   3360 CV_EXPORTS MatExpr operator ^ (const Mat& a, const Mat& b);
   3361 CV_EXPORTS MatExpr operator ^ (const Mat& a, const Scalar& s);
   3362 CV_EXPORTS MatExpr operator ^ (const Scalar& s, const Mat& a);
   3363 
   3364 CV_EXPORTS MatExpr operator ~(const Mat& m);
   3365 
   3366 CV_EXPORTS MatExpr min(const Mat& a, const Mat& b);
   3367 CV_EXPORTS MatExpr min(const Mat& a, double s);
   3368 CV_EXPORTS MatExpr min(double s, const Mat& a);
   3369 
   3370 CV_EXPORTS MatExpr max(const Mat& a, const Mat& b);
   3371 CV_EXPORTS MatExpr max(const Mat& a, double s);
   3372 CV_EXPORTS MatExpr max(double s, const Mat& a);
   3373 
   3374 /** @brief Calculates an absolute value of each matrix element.
   3375 
   3376 abs is a meta-function that is expanded to one of absdiff or convertScaleAbs forms:
   3377 - C = abs(A-B) is equivalent to `absdiff(A, B, C)`
   3378 - C = abs(A) is equivalent to `absdiff(A, Scalar::all(0), C)`
   3379 - C = `Mat_<Vec<uchar,n> >(abs(A*alpha + beta))` is equivalent to `convertScaleAbs(A, C, alpha,
   3380 beta)`
   3381 
   3382 The output matrix has the same size and the same type as the input one except for the last case,
   3383 where C is depth=CV_8U .
   3384 @param m matrix.
   3385 @sa @ref MatrixExpressions, absdiff, convertScaleAbs
   3386  */
   3387 CV_EXPORTS MatExpr abs(const Mat& m);
   3388 /** @overload
   3389 @param e matrix expression.
   3390 */
   3391 CV_EXPORTS MatExpr abs(const MatExpr& e);
   3392 //! @} relates cv::MatExpr
   3393 
   3394 } // cv
   3395 
   3396 #include "opencv2/core/mat.inl.hpp"
   3397 
   3398 #endif // __OPENCV_CORE_MAT_HPP__
   3399