1 /*M///////////////////////////////////////////////////////////////////////////////////////
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
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.
11 // For Open Source Computer Vision Library
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 // Copyright (C) 2015, Itseez Inc., all rights reserved.
17 // Third party copyrights are property of their respective owners.
19 // Redistribution and use in source and binary forms, with or without modification,
20 // are permitted provided that the following conditions are met:
22 // * Redistribution's of source code must retain the above copyright notice,
23 // this list of conditions and the following disclaimer.
25 // * Redistribution's in binary form must reproduce the above copyright notice,
26 // this list of conditions and the following disclaimer in the documentation
27 // and/or other materials provided with the distribution.
29 // * The name of the copyright holders may not be used to endorse or promote products
30 // derived from this software without specific prior written permission.
32 // This software is provided by the copyright holders and contributors "as is" and
33 // any express or implied warranties, including, but not limited to, the implied
34 // warranties of merchantability and fitness for a particular purpose are disclaimed.
35 // In no event shall the Intel Corporation or contributors be liable for any direct,
36 // indirect, incidental, special, exemplary, or consequential damages
37 // (including, but not limited to, procurement of substitute goods or services;
38 // loss of use, data, or profits; or business interruption) however caused
39 // and on any theory of liability, whether in contract, strict liability,
40 // or tort (including negligence or otherwise) arising in any way out of
41 // the use of this software, even if advised of the possibility of such damage.
45 #ifndef OPENCV_CORE_MATRIX_OPERATIONS_HPP
46 #define OPENCV_CORE_MATRIX_OPERATIONS_HPP
49 # error mat.inl.hpp header must be compiled as C++
53 #pragma warning( push )
54 #pragma warning( disable: 4127 )
64 //////////////////////// Input/Output Arrays ////////////////////////
66 inline void _InputArray::init(int _flags, const void* _obj)
67 { flags = _flags; obj = (void*)_obj; }
69 inline void _InputArray::init(int _flags, const void* _obj, Size _sz)
70 { flags = _flags; obj = (void*)_obj; sz = _sz; }
72 inline void* _InputArray::getObj() const { return obj; }
73 inline int _InputArray::getFlags() const { return flags; }
74 inline Size _InputArray::getSz() const { return sz; }
76 inline _InputArray::_InputArray() { init(NONE, 0); }
77 inline _InputArray::_InputArray(int _flags, void* _obj) { init(_flags, _obj); }
78 inline _InputArray::_InputArray(const Mat& m) { init(MAT+ACCESS_READ, &m); }
79 inline _InputArray::_InputArray(const std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_READ, &vec); }
80 inline _InputArray::_InputArray(const UMat& m) { init(UMAT+ACCESS_READ, &m); }
81 inline _InputArray::_InputArray(const std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_READ, &vec); }
83 template<typename _Tp> inline
84 _InputArray::_InputArray(const std::vector<_Tp>& vec)
85 { init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_READ, &vec); }
87 template<typename _Tp, std::size_t _Nm> inline
88 _InputArray::_InputArray(const std::array<_Tp, _Nm>& arr)
89 { init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_READ, arr.data(), Size(1, _Nm)); }
91 template<std::size_t _Nm> inline
92 _InputArray::_InputArray(const std::array<Mat, _Nm>& arr)
93 { init(STD_ARRAY_MAT + ACCESS_READ, arr.data(), Size(1, _Nm)); }
96 _InputArray::_InputArray(const std::vector<bool>& vec)
97 { init(FIXED_TYPE + STD_BOOL_VECTOR + traits::Type<bool>::value + ACCESS_READ, &vec); }
99 template<typename _Tp> inline
100 _InputArray::_InputArray(const std::vector<std::vector<_Tp> >& vec)
101 { init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_READ, &vec); }
104 _InputArray::_InputArray(const std::vector<std::vector<bool> >&)
105 { CV_Error(Error::StsUnsupportedFormat, "std::vector<std::vector<bool> > is not supported!\n"); }
107 template<typename _Tp> inline
108 _InputArray::_InputArray(const std::vector<Mat_<_Tp> >& vec)
109 { init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_READ, &vec); }
111 template<typename _Tp, int m, int n> inline
112 _InputArray::_InputArray(const Matx<_Tp, m, n>& mtx)
113 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, &mtx, Size(n, m)); }
115 template<typename _Tp> inline
116 _InputArray::_InputArray(const _Tp* vec, int n)
117 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, vec, Size(n, 1)); }
119 template<typename _Tp> inline
120 _InputArray::_InputArray(const Mat_<_Tp>& m)
121 { init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_READ, &m); }
123 inline _InputArray::_InputArray(const double& val)
124 { init(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F + ACCESS_READ, &val, Size(1,1)); }
126 inline _InputArray::_InputArray(const MatExpr& expr)
127 { init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); }
129 inline _InputArray::_InputArray(const cuda::GpuMat& d_mat)
130 { init(CUDA_GPU_MAT + ACCESS_READ, &d_mat); }
132 inline _InputArray::_InputArray(const std::vector<cuda::GpuMat>& d_mat)
133 { init(STD_VECTOR_CUDA_GPU_MAT + ACCESS_READ, &d_mat);}
135 inline _InputArray::_InputArray(const ogl::Buffer& buf)
136 { init(OPENGL_BUFFER + ACCESS_READ, &buf); }
138 inline _InputArray::_InputArray(const cuda::HostMem& cuda_mem)
139 { init(CUDA_HOST_MEM + ACCESS_READ, &cuda_mem); }
141 inline _InputArray::~_InputArray() {}
143 inline Mat _InputArray::getMat(int i) const
145 if( kind() == MAT && i < 0 )
146 return *(const Mat*)obj;
150 inline bool _InputArray::isMat() const { return kind() == _InputArray::MAT; }
151 inline bool _InputArray::isUMat() const { return kind() == _InputArray::UMAT; }
152 inline bool _InputArray::isMatVector() const { return kind() == _InputArray::STD_VECTOR_MAT; }
153 inline bool _InputArray::isUMatVector() const { return kind() == _InputArray::STD_VECTOR_UMAT; }
154 inline bool _InputArray::isMatx() const { return kind() == _InputArray::MATX; }
155 inline bool _InputArray::isVector() const { return kind() == _InputArray::STD_VECTOR ||
156 kind() == _InputArray::STD_BOOL_VECTOR ||
157 kind() == _InputArray::STD_ARRAY; }
158 inline bool _InputArray::isGpuMat() const { return kind() == _InputArray::CUDA_GPU_MAT; }
159 inline bool _InputArray::isGpuMatVector() const { return kind() == _InputArray::STD_VECTOR_CUDA_GPU_MAT; }
161 ////////////////////////////////////////////////////////////////////////////////////////
163 inline _OutputArray::_OutputArray() { init(ACCESS_WRITE, 0); }
164 inline _OutputArray::_OutputArray(int _flags, void* _obj) { init(_flags|ACCESS_WRITE, _obj); }
165 inline _OutputArray::_OutputArray(Mat& m) { init(MAT+ACCESS_WRITE, &m); }
166 inline _OutputArray::_OutputArray(std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_WRITE, &vec); }
167 inline _OutputArray::_OutputArray(UMat& m) { init(UMAT+ACCESS_WRITE, &m); }
168 inline _OutputArray::_OutputArray(std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_WRITE, &vec); }
170 template<typename _Tp> inline
171 _OutputArray::_OutputArray(std::vector<_Tp>& vec)
172 { init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
174 template<typename _Tp, std::size_t _Nm> inline
175 _OutputArray::_OutputArray(std::array<_Tp, _Nm>& arr)
176 { init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
178 template<std::size_t _Nm> inline
179 _OutputArray::_OutputArray(std::array<Mat, _Nm>& arr)
180 { init(STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
183 _OutputArray::_OutputArray(std::vector<bool>&)
184 { CV_Error(Error::StsUnsupportedFormat, "std::vector<bool> cannot be an output array\n"); }
186 template<typename _Tp> inline
187 _OutputArray::_OutputArray(std::vector<std::vector<_Tp> >& vec)
188 { init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
191 _OutputArray::_OutputArray(std::vector<std::vector<bool> >&)
192 { CV_Error(Error::StsUnsupportedFormat, "std::vector<std::vector<bool> > cannot be an output array\n"); }
194 template<typename _Tp> inline
195 _OutputArray::_OutputArray(std::vector<Mat_<_Tp> >& vec)
196 { init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
198 template<typename _Tp> inline
199 _OutputArray::_OutputArray(Mat_<_Tp>& m)
200 { init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &m); }
202 template<typename _Tp, int m, int n> inline
203 _OutputArray::_OutputArray(Matx<_Tp, m, n>& mtx)
204 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, &mtx, Size(n, m)); }
206 template<typename _Tp> inline
207 _OutputArray::_OutputArray(_Tp* vec, int n)
208 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, vec, Size(n, 1)); }
210 template<typename _Tp> inline
211 _OutputArray::_OutputArray(const std::vector<_Tp>& vec)
212 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
214 template<typename _Tp, std::size_t _Nm> inline
215 _OutputArray::_OutputArray(const std::array<_Tp, _Nm>& arr)
216 { init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
218 template<std::size_t _Nm> inline
219 _OutputArray::_OutputArray(const std::array<Mat, _Nm>& arr)
220 { init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
222 template<typename _Tp> inline
223 _OutputArray::_OutputArray(const std::vector<std::vector<_Tp> >& vec)
224 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
226 template<typename _Tp> inline
227 _OutputArray::_OutputArray(const std::vector<Mat_<_Tp> >& vec)
228 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); }
230 template<typename _Tp> inline
231 _OutputArray::_OutputArray(const Mat_<_Tp>& m)
232 { init(FIXED_TYPE + FIXED_SIZE + MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &m); }
234 template<typename _Tp, int m, int n> inline
235 _OutputArray::_OutputArray(const Matx<_Tp, m, n>& mtx)
236 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, &mtx, Size(n, m)); }
238 template<typename _Tp> inline
239 _OutputArray::_OutputArray(const _Tp* vec, int n)
240 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, vec, Size(n, 1)); }
242 inline _OutputArray::_OutputArray(cuda::GpuMat& d_mat)
243 { init(CUDA_GPU_MAT + ACCESS_WRITE, &d_mat); }
245 inline _OutputArray::_OutputArray(std::vector<cuda::GpuMat>& d_mat)
246 { init(STD_VECTOR_CUDA_GPU_MAT + ACCESS_WRITE, &d_mat);}
248 inline _OutputArray::_OutputArray(ogl::Buffer& buf)
249 { init(OPENGL_BUFFER + ACCESS_WRITE, &buf); }
251 inline _OutputArray::_OutputArray(cuda::HostMem& cuda_mem)
252 { init(CUDA_HOST_MEM + ACCESS_WRITE, &cuda_mem); }
254 inline _OutputArray::_OutputArray(const Mat& m)
255 { init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_WRITE, &m); }
257 inline _OutputArray::_OutputArray(const std::vector<Mat>& vec)
258 { init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_WRITE, &vec); }
260 inline _OutputArray::_OutputArray(const UMat& m)
261 { init(FIXED_TYPE + FIXED_SIZE + UMAT + ACCESS_WRITE, &m); }
263 inline _OutputArray::_OutputArray(const std::vector<UMat>& vec)
264 { init(FIXED_SIZE + STD_VECTOR_UMAT + ACCESS_WRITE, &vec); }
266 inline _OutputArray::_OutputArray(const cuda::GpuMat& d_mat)
267 { init(FIXED_TYPE + FIXED_SIZE + CUDA_GPU_MAT + ACCESS_WRITE, &d_mat); }
270 inline _OutputArray::_OutputArray(const ogl::Buffer& buf)
271 { init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_WRITE, &buf); }
273 inline _OutputArray::_OutputArray(const cuda::HostMem& cuda_mem)
274 { init(FIXED_TYPE + FIXED_SIZE + CUDA_HOST_MEM + ACCESS_WRITE, &cuda_mem); }
276 ///////////////////////////////////////////////////////////////////////////////////////////
278 inline _InputOutputArray::_InputOutputArray() { init(ACCESS_RW, 0); }
279 inline _InputOutputArray::_InputOutputArray(int _flags, void* _obj) { init(_flags|ACCESS_RW, _obj); }
280 inline _InputOutputArray::_InputOutputArray(Mat& m) { init(MAT+ACCESS_RW, &m); }
281 inline _InputOutputArray::_InputOutputArray(std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_RW, &vec); }
282 inline _InputOutputArray::_InputOutputArray(UMat& m) { init(UMAT+ACCESS_RW, &m); }
283 inline _InputOutputArray::_InputOutputArray(std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_RW, &vec); }
285 template<typename _Tp> inline
286 _InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec)
287 { init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
289 template<typename _Tp, std::size_t _Nm> inline
290 _InputOutputArray::_InputOutputArray(std::array<_Tp, _Nm>& arr)
291 { init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
293 template<std::size_t _Nm> inline
294 _InputOutputArray::_InputOutputArray(std::array<Mat, _Nm>& arr)
295 { init(STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _Nm)); }
297 inline _InputOutputArray::_InputOutputArray(std::vector<bool>&)
298 { CV_Error(Error::StsUnsupportedFormat, "std::vector<bool> cannot be an input/output array\n"); }
300 template<typename _Tp> inline
301 _InputOutputArray::_InputOutputArray(std::vector<std::vector<_Tp> >& vec)
302 { init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
304 template<typename _Tp> inline
305 _InputOutputArray::_InputOutputArray(std::vector<Mat_<_Tp> >& vec)
306 { init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
308 template<typename _Tp> inline
309 _InputOutputArray::_InputOutputArray(Mat_<_Tp>& m)
310 { init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_RW, &m); }
312 template<typename _Tp, int m, int n> inline
313 _InputOutputArray::_InputOutputArray(Matx<_Tp, m, n>& mtx)
314 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, &mtx, Size(n, m)); }
316 template<typename _Tp> inline
317 _InputOutputArray::_InputOutputArray(_Tp* vec, int n)
318 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, vec, Size(n, 1)); }
320 template<typename _Tp> inline
321 _InputOutputArray::_InputOutputArray(const std::vector<_Tp>& vec)
322 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
324 template<typename _Tp, std::size_t _Nm> inline
325 _InputOutputArray::_InputOutputArray(const std::array<_Tp, _Nm>& arr)
326 { init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
328 template<std::size_t _Nm> inline
329 _InputOutputArray::_InputOutputArray(const std::array<Mat, _Nm>& arr)
330 { init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _Nm)); }
332 template<typename _Tp> inline
333 _InputOutputArray::_InputOutputArray(const std::vector<std::vector<_Tp> >& vec)
334 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
336 template<typename _Tp> inline
337 _InputOutputArray::_InputOutputArray(const std::vector<Mat_<_Tp> >& vec)
338 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_RW, &vec); }
340 template<typename _Tp> inline
341 _InputOutputArray::_InputOutputArray(const Mat_<_Tp>& m)
342 { init(FIXED_TYPE + FIXED_SIZE + MAT + traits::Type<_Tp>::value + ACCESS_RW, &m); }
344 template<typename _Tp, int m, int n> inline
345 _InputOutputArray::_InputOutputArray(const Matx<_Tp, m, n>& mtx)
346 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, &mtx, Size(n, m)); }
348 template<typename _Tp> inline
349 _InputOutputArray::_InputOutputArray(const _Tp* vec, int n)
350 { init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, vec, Size(n, 1)); }
352 inline _InputOutputArray::_InputOutputArray(cuda::GpuMat& d_mat)
353 { init(CUDA_GPU_MAT + ACCESS_RW, &d_mat); }
355 inline _InputOutputArray::_InputOutputArray(ogl::Buffer& buf)
356 { init(OPENGL_BUFFER + ACCESS_RW, &buf); }
358 inline _InputOutputArray::_InputOutputArray(cuda::HostMem& cuda_mem)
359 { init(CUDA_HOST_MEM + ACCESS_RW, &cuda_mem); }
361 inline _InputOutputArray::_InputOutputArray(const Mat& m)
362 { init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_RW, &m); }
364 inline _InputOutputArray::_InputOutputArray(const std::vector<Mat>& vec)
365 { init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_RW, &vec); }
367 inline _InputOutputArray::_InputOutputArray(const UMat& m)
368 { init(FIXED_TYPE + FIXED_SIZE + UMAT + ACCESS_RW, &m); }
370 inline _InputOutputArray::_InputOutputArray(const std::vector<UMat>& vec)
371 { init(FIXED_SIZE + STD_VECTOR_UMAT + ACCESS_RW, &vec); }
373 inline _InputOutputArray::_InputOutputArray(const cuda::GpuMat& d_mat)
374 { init(FIXED_TYPE + FIXED_SIZE + CUDA_GPU_MAT + ACCESS_RW, &d_mat); }
376 inline _InputOutputArray::_InputOutputArray(const std::vector<cuda::GpuMat>& d_mat)
377 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_CUDA_GPU_MAT + ACCESS_RW, &d_mat);}
379 template<> inline _InputOutputArray::_InputOutputArray(std::vector<cuda::GpuMat>& d_mat)
380 { init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_CUDA_GPU_MAT + ACCESS_RW, &d_mat);}
382 inline _InputOutputArray::_InputOutputArray(const ogl::Buffer& buf)
383 { init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_RW, &buf); }
385 inline _InputOutputArray::_InputOutputArray(const cuda::HostMem& cuda_mem)
386 { init(FIXED_TYPE + FIXED_SIZE + CUDA_HOST_MEM + ACCESS_RW, &cuda_mem); }
390 //////////////////////////////////////////// Mat //////////////////////////////////////////
394 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
395 datalimit(0), allocator(0), u(0), size(&rows), step(0)
399 Mat::Mat(int _rows, int _cols, int _type)
400 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
401 datalimit(0), allocator(0), u(0), size(&rows), step(0)
403 create(_rows, _cols, _type);
407 Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
408 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
409 datalimit(0), allocator(0), u(0), size(&rows), step(0)
411 create(_rows, _cols, _type);
416 Mat::Mat(Size _sz, int _type)
417 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
418 datalimit(0), allocator(0), u(0), size(&rows), step(0)
420 create( _sz.height, _sz.width, _type );
424 Mat::Mat(Size _sz, int _type, const Scalar& _s)
425 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
426 datalimit(0), allocator(0), u(0), size(&rows), step(0)
428 create(_sz.height, _sz.width, _type);
433 Mat::Mat(int _dims, const int* _sz, int _type)
434 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
435 datalimit(0), allocator(0), u(0), size(&rows), step(0)
437 create(_dims, _sz, _type);
441 Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s)
442 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
443 datalimit(0), allocator(0), u(0), size(&rows), step(0)
445 create(_dims, _sz, _type);
450 Mat::Mat(const std::vector<int>& _sz, int _type)
451 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
452 datalimit(0), allocator(0), u(0), size(&rows), step(0)
458 Mat::Mat(const std::vector<int>& _sz, int _type, const Scalar& _s)
459 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
460 datalimit(0), allocator(0), u(0), size(&rows), step(0)
467 Mat::Mat(const Mat& m)
468 : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data),
469 datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator),
470 u(m.u), size(&rows), step(0)
473 CV_XADD(&u->refcount, 1);
476 step[0] = m.step[0]; step[1] = m.step[1];
486 Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
487 : flags(MAGIC_VAL + (_type & TYPE_MASK)), dims(2), rows(_rows), cols(_cols),
488 data((uchar*)_data), datastart((uchar*)_data), dataend(0), datalimit(0),
489 allocator(0), u(0), size(&rows)
491 CV_Assert(total() == 0 || data != NULL);
493 size_t esz = CV_ELEM_SIZE(_type), esz1 = CV_ELEM_SIZE1(_type);
494 size_t minstep = cols * esz;
495 if( _step == AUTO_STEP )
501 CV_DbgAssert( _step >= minstep );
502 if (_step % esz1 != 0)
504 CV_Error(Error::BadStep, "Step must be a multiple of esz1");
509 datalimit = datastart + _step * rows;
510 dataend = datalimit - _step + minstep;
511 updateContinuityFlag();
515 Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
516 : flags(MAGIC_VAL + (_type & TYPE_MASK)), dims(2), rows(_sz.height), cols(_sz.width),
517 data((uchar*)_data), datastart((uchar*)_data), dataend(0), datalimit(0),
518 allocator(0), u(0), size(&rows)
520 CV_Assert(total() == 0 || data != NULL);
522 size_t esz = CV_ELEM_SIZE(_type), esz1 = CV_ELEM_SIZE1(_type);
523 size_t minstep = cols*esz;
524 if( _step == AUTO_STEP )
530 CV_DbgAssert( _step >= minstep );
532 if (_step % esz1 != 0)
534 CV_Error(Error::BadStep, "Step must be a multiple of esz1");
539 datalimit = datastart + _step*rows;
540 dataend = datalimit - _step + minstep;
541 updateContinuityFlag();
544 template<typename _Tp> inline
545 Mat::Mat(const std::vector<_Tp>& vec, bool copyData)
546 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()),
547 cols(1), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
553 step[0] = step[1] = sizeof(_Tp);
554 datastart = data = (uchar*)&vec[0];
555 datalimit = dataend = datastart + rows * step[0];
558 Mat((int)vec.size(), 1, traits::Type<_Tp>::value, (uchar*)&vec[0]).copyTo(*this);
561 template<typename _Tp, typename> inline
562 Mat::Mat(const std::initializer_list<_Tp> list)
565 CV_Assert(list.size() != 0);
566 Mat((int)list.size(), 1, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this);
569 template<typename _Tp> inline
570 Mat::Mat(const std::initializer_list<int> sizes, const std::initializer_list<_Tp> list)
573 size_t size_total = 1;
576 CV_Assert(list.size() != 0);
577 CV_Assert(size_total == list.size());
578 Mat((int)sizes.size(), (int*)sizes.begin(), traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this);
581 template<typename _Tp, std::size_t _Nm> inline
582 Mat::Mat(const std::array<_Tp, _Nm>& arr, bool copyData)
583 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows((int)arr.size()),
584 cols(1), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
590 step[0] = step[1] = sizeof(_Tp);
591 datastart = data = (uchar*)arr.data();
592 datalimit = dataend = datastart + rows * step[0];
595 Mat((int)arr.size(), 1, traits::Type<_Tp>::value, (uchar*)arr.data()).copyTo(*this);
598 template<typename _Tp, int n> inline
599 Mat::Mat(const Vec<_Tp, n>& vec, bool copyData)
600 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows(n), cols(1), data(0),
601 datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
605 step[0] = step[1] = sizeof(_Tp);
606 datastart = data = (uchar*)vec.val;
607 datalimit = dataend = datastart + rows * step[0];
610 Mat(n, 1, traits::Type<_Tp>::value, (void*)vec.val).copyTo(*this);
614 template<typename _Tp, int m, int n> inline
615 Mat::Mat(const Matx<_Tp,m,n>& M, bool copyData)
616 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows(m), cols(n), data(0),
617 datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
621 step[0] = cols * sizeof(_Tp);
622 step[1] = sizeof(_Tp);
623 datastart = data = (uchar*)M.val;
624 datalimit = dataend = datastart + rows * step[0];
627 Mat(m, n, traits::Type<_Tp>::value, (uchar*)M.val).copyTo(*this);
630 template<typename _Tp> inline
631 Mat::Mat(const Point_<_Tp>& pt, bool copyData)
632 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows(2), cols(1), data(0),
633 datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
637 step[0] = step[1] = sizeof(_Tp);
638 datastart = data = (uchar*)&pt.x;
639 datalimit = dataend = datastart + rows * step[0];
643 create(2, 1, traits::Type<_Tp>::value);
644 ((_Tp*)data)[0] = pt.x;
645 ((_Tp*)data)[1] = pt.y;
649 template<typename _Tp> inline
650 Mat::Mat(const Point3_<_Tp>& pt, bool copyData)
651 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows(3), cols(1), data(0),
652 datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0)
656 step[0] = step[1] = sizeof(_Tp);
657 datastart = data = (uchar*)&pt.x;
658 datalimit = dataend = datastart + rows * step[0];
662 create(3, 1, traits::Type<_Tp>::value);
663 ((_Tp*)data)[0] = pt.x;
664 ((_Tp*)data)[1] = pt.y;
665 ((_Tp*)data)[2] = pt.z;
669 template<typename _Tp> inline
670 Mat::Mat(const MatCommaInitializer_<_Tp>& commaInitializer)
671 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(0), rows(0), cols(0), data(0),
672 datastart(0), dataend(0), allocator(0), u(0), size(&rows)
674 *this = commaInitializer.operator Mat_<_Tp>();
681 if( step.p != step.buf )
686 Mat& Mat::operator = (const Mat& m)
691 CV_XADD(&m.u->refcount, 1);
694 if( dims <= 2 && m.dims <= 2 )
705 datastart = m.datastart;
707 datalimit = m.datalimit;
708 allocator = m.allocator;
715 Mat Mat::row(int y) const
717 return Mat(*this, Range(y, y + 1), Range::all());
721 Mat Mat::col(int x) const
723 return Mat(*this, Range::all(), Range(x, x + 1));
727 Mat Mat::rowRange(int startrow, int endrow) const
729 return Mat(*this, Range(startrow, endrow), Range::all());
733 Mat Mat::rowRange(const Range& r) const
735 return Mat(*this, r, Range::all());
739 Mat Mat::colRange(int startcol, int endcol) const
741 return Mat(*this, Range::all(), Range(startcol, endcol));
745 Mat Mat::colRange(const Range& r) const
747 return Mat(*this, Range::all(), r);
751 Mat Mat::clone() const
759 void Mat::assignTo( Mat& m, int _type ) const
768 void Mat::create(int _rows, int _cols, int _type)
771 if( dims <= 2 && rows == _rows && cols == _cols && type() == _type && data )
773 int sz[] = {_rows, _cols};
774 create(2, sz, _type);
778 void Mat::create(Size _sz, int _type)
780 create(_sz.height, _sz.width, _type);
787 CV_XADD(&u->refcount, 1);
793 if( u && CV_XADD(&u->refcount, -1) == 1 )
796 datastart = dataend = datalimit = data = 0;
797 for(int i = 0; i < dims; i++)
801 dims = rows = cols = 0;
802 if(step.p != step.buf)
812 Mat Mat::operator()( Range _rowRange, Range _colRange ) const
814 return Mat(*this, _rowRange, _colRange);
818 Mat Mat::operator()( const Rect& roi ) const
820 return Mat(*this, roi);
824 Mat Mat::operator()(const Range* ranges) const
826 return Mat(*this, ranges);
830 Mat Mat::operator()(const std::vector<Range>& ranges) const
832 return Mat(*this, ranges);
836 bool Mat::isContinuous() const
838 return (flags & CONTINUOUS_FLAG) != 0;
842 bool Mat::isSubmatrix() const
844 return (flags & SUBMATRIX_FLAG) != 0;
848 size_t Mat::elemSize() const
850 size_t res = dims > 0 ? step.p[dims - 1] : 0;
851 CV_DbgAssert(res != 0);
856 size_t Mat::elemSize1() const
858 return CV_ELEM_SIZE1(flags);
862 int Mat::type() const
864 return CV_MAT_TYPE(flags);
868 int Mat::depth() const
870 return CV_MAT_DEPTH(flags);
874 int Mat::channels() const
876 return CV_MAT_CN(flags);
880 size_t Mat::step1(int i) const
882 return step.p[i] / elemSize1();
886 bool Mat::empty() const
888 return data == 0 || total() == 0 || dims == 0;
892 size_t Mat::total() const
895 return (size_t)rows * cols;
897 for( int i = 0; i < dims; i++ )
903 size_t Mat::total(int startDim, int endDim) const
905 CV_Assert( 0 <= startDim && startDim <= endDim);
907 int endDim_ = endDim <= dims ? endDim : dims;
908 for( int i = startDim; i < endDim_; i++ )
914 uchar* Mat::ptr(int y)
916 CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) );
917 return data + step.p[0] * y;
921 const uchar* Mat::ptr(int y) const
923 CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) );
924 return data + step.p[0] * y;
927 template<typename _Tp> inline
930 CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) );
931 return (_Tp*)(data + step.p[0] * y);
934 template<typename _Tp> inline
935 const _Tp* Mat::ptr(int y) const
937 CV_DbgAssert( y == 0 || (data && dims >= 1 && data && (unsigned)y < (unsigned)size.p[0]) );
938 return (const _Tp*)(data + step.p[0] * y);
942 uchar* Mat::ptr(int i0, int i1)
944 CV_DbgAssert(dims >= 2);
946 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
947 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
948 return data + i0 * step.p[0] + i1 * step.p[1];
952 const uchar* Mat::ptr(int i0, int i1) const
954 CV_DbgAssert(dims >= 2);
956 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
957 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
958 return data + i0 * step.p[0] + i1 * step.p[1];
961 template<typename _Tp> inline
962 _Tp* Mat::ptr(int i0, int i1)
964 CV_DbgAssert(dims >= 2);
966 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
967 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
968 return (_Tp*)(data + i0 * step.p[0] + i1 * step.p[1]);
971 template<typename _Tp> inline
972 const _Tp* Mat::ptr(int i0, int i1) const
974 CV_DbgAssert(dims >= 2);
976 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
977 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
978 return (const _Tp*)(data + i0 * step.p[0] + i1 * step.p[1]);
982 uchar* Mat::ptr(int i0, int i1, int i2)
984 CV_DbgAssert(dims >= 3);
986 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
987 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
988 CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]);
989 return data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2];
993 const uchar* Mat::ptr(int i0, int i1, int i2) const
995 CV_DbgAssert(dims >= 3);
997 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
998 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
999 CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]);
1000 return data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2];
1003 template<typename _Tp> inline
1004 _Tp* Mat::ptr(int i0, int i1, int i2)
1006 CV_DbgAssert(dims >= 3);
1008 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1009 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
1010 CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]);
1011 return (_Tp*)(data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]);
1014 template<typename _Tp> inline
1015 const _Tp* Mat::ptr(int i0, int i1, int i2) const
1017 CV_DbgAssert(dims >= 3);
1019 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1020 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
1021 CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]);
1022 return (const _Tp*)(data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]);
1026 uchar* Mat::ptr(const int* idx)
1030 CV_DbgAssert( d >= 1 && p );
1031 for( i = 0; i < d; i++ )
1033 CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] );
1034 p += idx[i] * step.p[i];
1040 const uchar* Mat::ptr(const int* idx) const
1044 CV_DbgAssert( d >= 1 && p );
1045 for( i = 0; i < d; i++ )
1047 CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] );
1048 p += idx[i] * step.p[i];
1053 template<typename _Tp> inline
1054 _Tp* Mat::ptr(const int* idx)
1058 CV_DbgAssert( d >= 1 && p );
1059 for( i = 0; i < d; i++ )
1061 CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] );
1062 p += idx[i] * step.p[i];
1067 template<typename _Tp> inline
1068 const _Tp* Mat::ptr(const int* idx) const
1072 CV_DbgAssert( d >= 1 && p );
1073 for( i = 0; i < d; i++ )
1075 CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] );
1076 p += idx[i] * step.p[i];
1078 return (const _Tp*)p;
1081 template<typename _Tp> inline
1082 _Tp& Mat::at(int i0, int i1)
1084 CV_DbgAssert(dims <= 2);
1086 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1087 CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
1088 CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
1089 return ((_Tp*)(data + step.p[0] * i0))[i1];
1092 template<typename _Tp> inline
1093 const _Tp& Mat::at(int i0, int i1) const
1095 CV_DbgAssert(dims <= 2);
1097 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1098 CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
1099 CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
1100 return ((const _Tp*)(data + step.p[0] * i0))[i1];
1103 template<typename _Tp> inline
1104 _Tp& Mat::at(Point pt)
1106 CV_DbgAssert(dims <= 2);
1108 CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]);
1109 CV_DbgAssert((unsigned)(pt.x * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
1110 CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
1111 return ((_Tp*)(data + step.p[0] * pt.y))[pt.x];
1114 template<typename _Tp> inline
1115 const _Tp& Mat::at(Point pt) const
1117 CV_DbgAssert(dims <= 2);
1119 CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]);
1120 CV_DbgAssert((unsigned)(pt.x * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
1121 CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
1122 return ((const _Tp*)(data + step.p[0] * pt.y))[pt.x];
1125 template<typename _Tp> inline
1126 _Tp& Mat::at(int i0)
1128 CV_DbgAssert(dims <= 2);
1130 CV_DbgAssert((unsigned)i0 < (unsigned)(size.p[0] * size.p[1]));
1131 CV_DbgAssert(elemSize() == sizeof(_Tp));
1132 if( isContinuous() || size.p[0] == 1 )
1133 return ((_Tp*)data)[i0];
1134 if( size.p[1] == 1 )
1135 return *(_Tp*)(data + step.p[0] * i0);
1136 int i = i0 / cols, j = i0 - i * cols;
1137 return ((_Tp*)(data + step.p[0] * i))[j];
1140 template<typename _Tp> inline
1141 const _Tp& Mat::at(int i0) const
1143 CV_DbgAssert(dims <= 2);
1145 CV_DbgAssert((unsigned)i0 < (unsigned)(size.p[0] * size.p[1]));
1146 CV_DbgAssert(elemSize() == sizeof(_Tp));
1147 if( isContinuous() || size.p[0] == 1 )
1148 return ((const _Tp*)data)[i0];
1149 if( size.p[1] == 1 )
1150 return *(const _Tp*)(data + step.p[0] * i0);
1151 int i = i0 / cols, j = i0 - i * cols;
1152 return ((const _Tp*)(data + step.p[0] * i))[j];
1155 template<typename _Tp> inline
1156 _Tp& Mat::at(int i0, int i1, int i2)
1158 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1159 return *(_Tp*)ptr(i0, i1, i2);
1162 template<typename _Tp> inline
1163 const _Tp& Mat::at(int i0, int i1, int i2) const
1165 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1166 return *(const _Tp*)ptr(i0, i1, i2);
1169 template<typename _Tp> inline
1170 _Tp& Mat::at(const int* idx)
1172 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1173 return *(_Tp*)ptr(idx);
1176 template<typename _Tp> inline
1177 const _Tp& Mat::at(const int* idx) const
1179 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1180 return *(const _Tp*)ptr(idx);
1183 template<typename _Tp, int n> inline
1184 _Tp& Mat::at(const Vec<int, n>& idx)
1186 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1187 return *(_Tp*)ptr(idx.val);
1190 template<typename _Tp, int n> inline
1191 const _Tp& Mat::at(const Vec<int, n>& idx) const
1193 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1194 return *(const _Tp*)ptr(idx.val);
1197 template<typename _Tp> inline
1198 MatConstIterator_<_Tp> Mat::begin() const
1200 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1201 return MatConstIterator_<_Tp>((const Mat_<_Tp>*)this);
1204 template<typename _Tp> inline
1205 MatConstIterator_<_Tp> Mat::end() const
1207 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1208 MatConstIterator_<_Tp> it((const Mat_<_Tp>*)this);
1213 template<typename _Tp> inline
1214 MatIterator_<_Tp> Mat::begin()
1216 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1217 return MatIterator_<_Tp>((Mat_<_Tp>*)this);
1220 template<typename _Tp> inline
1221 MatIterator_<_Tp> Mat::end()
1223 CV_DbgAssert( elemSize() == sizeof(_Tp) );
1224 MatIterator_<_Tp> it((Mat_<_Tp>*)this);
1229 template<typename _Tp, typename Functor> inline
1230 void Mat::forEach(const Functor& operation) {
1231 this->forEach_impl<_Tp>(operation);
1234 template<typename _Tp, typename Functor> inline
1235 void Mat::forEach(const Functor& operation) const {
1236 // call as not const
1237 (const_cast<Mat*>(this))->forEach<_Tp>(operation);
1240 template<typename _Tp> inline
1241 Mat::operator std::vector<_Tp>() const
1248 template<typename _Tp, std::size_t _Nm> inline
1249 Mat::operator std::array<_Tp, _Nm>() const
1251 std::array<_Tp, _Nm> v;
1256 template<typename _Tp, int n> inline
1257 Mat::operator Vec<_Tp, n>() const
1259 CV_Assert( data && dims <= 2 && (rows == 1 || cols == 1) &&
1260 rows + cols - 1 == n && channels() == 1 );
1262 if( isContinuous() && type() == traits::Type<_Tp>::value )
1263 return Vec<_Tp, n>((_Tp*)data);
1265 Mat tmp(rows, cols, traits::Type<_Tp>::value, v.val);
1266 convertTo(tmp, tmp.type());
1270 template<typename _Tp, int m, int n> inline
1271 Mat::operator Matx<_Tp, m, n>() const
1273 CV_Assert( data && dims <= 2 && rows == m && cols == n && channels() == 1 );
1275 if( isContinuous() && type() == traits::Type<_Tp>::value )
1276 return Matx<_Tp, m, n>((_Tp*)data);
1277 Matx<_Tp, m, n> mtx;
1278 Mat tmp(rows, cols, traits::Type<_Tp>::value, mtx.val);
1279 convertTo(tmp, tmp.type());
1283 template<typename _Tp> inline
1284 void Mat::push_back(const _Tp& elem)
1288 *this = Mat(1, 1, traits::Type<_Tp>::value, (void*)&elem).clone();
1291 CV_Assert(traits::Type<_Tp>::value == type() && cols == 1
1292 /* && dims == 2 (cols == 1 implies dims == 2) */);
1293 const uchar* tmp = dataend + step[0];
1294 if( !isSubmatrix() && isContinuous() && tmp <= datalimit )
1296 *(_Tp*)(data + (size.p[0]++) * step.p[0]) = elem;
1303 template<typename _Tp> inline
1304 void Mat::push_back(const Mat_<_Tp>& m)
1306 push_back((const Mat&)m);
1310 void Mat::push_back(const MatExpr& expr)
1312 push_back(static_cast<Mat>(expr));
1316 template<typename _Tp> inline
1317 void Mat::push_back(const std::vector<_Tp>& v)
1324 : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data),
1325 datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator),
1328 if (m.dims <= 2) // move new step/size info
1330 step[0] = m.step[0];
1331 step[1] = m.step[1];
1335 CV_DbgAssert(m.step.p != m.step.buf);
1338 m.step.p = m.step.buf;
1341 m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
1342 m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL;
1348 Mat& Mat::operator = (Mat&& m)
1354 flags = m.flags; dims = m.dims; rows = m.rows; cols = m.cols; data = m.data;
1355 datastart = m.datastart; dataend = m.dataend; datalimit = m.datalimit; allocator = m.allocator;
1357 if (step.p != step.buf) // release self step/size
1363 if (m.dims <= 2) // move new step/size info
1365 step[0] = m.step[0];
1366 step[1] = m.step[1];
1370 CV_DbgAssert(m.step.p != m.step.buf);
1373 m.step.p = m.step.buf;
1376 m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
1377 m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL;
1384 ///////////////////////////// MatSize ////////////////////////////
1387 MatSize::MatSize(int* _p)
1391 int MatSize::dims() const
1397 Size MatSize::operator()() const
1399 CV_DbgAssert(dims() <= 2);
1400 return Size(p[1], p[0]);
1404 const int& MatSize::operator[](int i) const
1406 CV_DbgAssert(i < dims());
1407 #ifdef __OPENCV_BUILD
1408 CV_DbgAssert(i >= 0);
1414 int& MatSize::operator[](int i)
1416 CV_DbgAssert(i < dims());
1417 #ifdef __OPENCV_BUILD
1418 CV_DbgAssert(i >= 0);
1424 MatSize::operator const int*() const
1430 bool MatSize::operator == (const MatSize& sz) const
1433 int dsz = sz.dims();
1437 return p[0] == sz.p[0] && p[1] == sz.p[1];
1439 for( int i = 0; i < d; i++ )
1440 if( p[i] != sz.p[i] )
1446 bool MatSize::operator != (const MatSize& sz) const
1448 return !(*this == sz);
1453 ///////////////////////////// MatStep ////////////////////////////
1458 p = buf; p[0] = p[1] = 0;
1462 MatStep::MatStep(size_t s)
1464 p = buf; p[0] = s; p[1] = 0;
1468 const size_t& MatStep::operator[](int i) const
1474 size_t& MatStep::operator[](int i)
1479 inline MatStep::operator size_t() const
1481 CV_DbgAssert( p == buf );
1485 inline MatStep& MatStep::operator = (size_t s)
1487 CV_DbgAssert( p == buf );
1494 ////////////////////////////// Mat_<_Tp> ////////////////////////////
1496 template<typename _Tp> inline
1500 flags = (flags & ~CV_MAT_TYPE_MASK) | traits::Type<_Tp>::value;
1503 template<typename _Tp> inline
1504 Mat_<_Tp>::Mat_(int _rows, int _cols)
1505 : Mat(_rows, _cols, traits::Type<_Tp>::value)
1509 template<typename _Tp> inline
1510 Mat_<_Tp>::Mat_(int _rows, int _cols, const _Tp& value)
1511 : Mat(_rows, _cols, traits::Type<_Tp>::value)
1516 template<typename _Tp> inline
1517 Mat_<_Tp>::Mat_(Size _sz)
1518 : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
1521 template<typename _Tp> inline
1522 Mat_<_Tp>::Mat_(Size _sz, const _Tp& value)
1523 : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
1528 template<typename _Tp> inline
1529 Mat_<_Tp>::Mat_(int _dims, const int* _sz)
1530 : Mat(_dims, _sz, traits::Type<_Tp>::value)
1533 template<typename _Tp> inline
1534 Mat_<_Tp>::Mat_(int _dims, const int* _sz, const _Tp& _s)
1535 : Mat(_dims, _sz, traits::Type<_Tp>::value, Scalar(_s))
1538 template<typename _Tp> inline
1539 Mat_<_Tp>::Mat_(int _dims, const int* _sz, _Tp* _data, const size_t* _steps)
1540 : Mat(_dims, _sz, traits::Type<_Tp>::value, _data, _steps)
1543 template<typename _Tp> inline
1544 Mat_<_Tp>::Mat_(const Mat_<_Tp>& m, const Range* ranges)
1548 template<typename _Tp> inline
1549 Mat_<_Tp>::Mat_(const Mat_<_Tp>& m, const std::vector<Range>& ranges)
1553 template<typename _Tp> inline
1554 Mat_<_Tp>::Mat_(const Mat& m)
1557 flags = (flags & ~CV_MAT_TYPE_MASK) | traits::Type<_Tp>::value;
1561 template<typename _Tp> inline
1562 Mat_<_Tp>::Mat_(const Mat_& m)
1566 template<typename _Tp> inline
1567 Mat_<_Tp>::Mat_(int _rows, int _cols, _Tp* _data, size_t steps)
1568 : Mat(_rows, _cols, traits::Type<_Tp>::value, _data, steps)
1571 template<typename _Tp> inline
1572 Mat_<_Tp>::Mat_(const Mat_& m, const Range& _rowRange, const Range& _colRange)
1573 : Mat(m, _rowRange, _colRange)
1576 template<typename _Tp> inline
1577 Mat_<_Tp>::Mat_(const Mat_& m, const Rect& roi)
1581 template<typename _Tp> template<int n> inline
1582 Mat_<_Tp>::Mat_(const Vec<typename DataType<_Tp>::channel_type, n>& vec, bool copyData)
1583 : Mat(n / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&vec)
1585 CV_Assert(n%DataType<_Tp>::channels == 0);
1590 template<typename _Tp> template<int m, int n> inline
1591 Mat_<_Tp>::Mat_(const Matx<typename DataType<_Tp>::channel_type, m, n>& M, bool copyData)
1592 : Mat(m, n / DataType<_Tp>::channels, traits::Type<_Tp>::value, (void*)&M)
1594 CV_Assert(n % DataType<_Tp>::channels == 0);
1599 template<typename _Tp> inline
1600 Mat_<_Tp>::Mat_(const Point_<typename DataType<_Tp>::channel_type>& pt, bool copyData)
1601 : Mat(2 / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&pt)
1603 CV_Assert(2 % DataType<_Tp>::channels == 0);
1608 template<typename _Tp> inline
1609 Mat_<_Tp>::Mat_(const Point3_<typename DataType<_Tp>::channel_type>& pt, bool copyData)
1610 : Mat(3 / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&pt)
1612 CV_Assert(3 % DataType<_Tp>::channels == 0);
1617 template<typename _Tp> inline
1618 Mat_<_Tp>::Mat_(const MatCommaInitializer_<_Tp>& commaInitializer)
1619 : Mat(commaInitializer)
1622 template<typename _Tp> inline
1623 Mat_<_Tp>::Mat_(const std::vector<_Tp>& vec, bool copyData)
1624 : Mat(vec, copyData)
1627 template<typename _Tp> inline
1628 Mat_<_Tp>::Mat_(std::initializer_list<_Tp> list)
1632 template<typename _Tp> inline
1633 Mat_<_Tp>::Mat_(const std::initializer_list<int> sizes, std::initializer_list<_Tp> list)
1637 template<typename _Tp> template<std::size_t _Nm> inline
1638 Mat_<_Tp>::Mat_(const std::array<_Tp, _Nm>& arr, bool copyData)
1639 : Mat(arr, copyData)
1642 template<typename _Tp> inline
1643 Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m)
1645 if( traits::Type<_Tp>::value == m.type() )
1647 Mat::operator = (m);
1650 if( traits::Depth<_Tp>::value == m.depth() )
1652 return (*this = m.reshape(DataType<_Tp>::channels, m.dims, 0));
1654 CV_Assert(DataType<_Tp>::channels == m.channels() || m.empty());
1655 m.convertTo(*this, type());
1659 template<typename _Tp> inline
1660 Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat_& m)
1666 template<typename _Tp> inline
1667 Mat_<_Tp>& Mat_<_Tp>::operator = (const _Tp& s)
1669 typedef typename DataType<_Tp>::vec_type VT;
1670 Mat::operator=(Scalar((const VT&)s));
1674 template<typename _Tp> inline
1675 void Mat_<_Tp>::create(int _rows, int _cols)
1677 Mat::create(_rows, _cols, traits::Type<_Tp>::value);
1680 template<typename _Tp> inline
1681 void Mat_<_Tp>::create(Size _sz)
1683 Mat::create(_sz, traits::Type<_Tp>::value);
1686 template<typename _Tp> inline
1687 void Mat_<_Tp>::create(int _dims, const int* _sz)
1689 Mat::create(_dims, _sz, traits::Type<_Tp>::value);
1692 template<typename _Tp> inline
1693 void Mat_<_Tp>::release()
1697 flags = (flags & ~CV_MAT_TYPE_MASK) | traits::Type<_Tp>::value;
1701 template<typename _Tp> inline
1702 Mat_<_Tp> Mat_<_Tp>::cross(const Mat_& m) const
1704 return Mat_<_Tp>(Mat::cross(m));
1707 template<typename _Tp> template<typename T2> inline
1708 Mat_<_Tp>::operator Mat_<T2>() const
1710 return Mat_<T2>(*this);
1713 template<typename _Tp> inline
1714 Mat_<_Tp> Mat_<_Tp>::row(int y) const
1716 return Mat_(*this, Range(y, y+1), Range::all());
1719 template<typename _Tp> inline
1720 Mat_<_Tp> Mat_<_Tp>::col(int x) const
1722 return Mat_(*this, Range::all(), Range(x, x+1));
1725 template<typename _Tp> inline
1726 Mat_<_Tp> Mat_<_Tp>::diag(int d) const
1728 return Mat_(Mat::diag(d));
1731 template<typename _Tp> inline
1732 Mat_<_Tp> Mat_<_Tp>::clone() const
1734 return Mat_(Mat::clone());
1737 template<typename _Tp> inline
1738 size_t Mat_<_Tp>::elemSize() const
1740 CV_DbgAssert( Mat::elemSize() == sizeof(_Tp) );
1744 template<typename _Tp> inline
1745 size_t Mat_<_Tp>::elemSize1() const
1747 CV_DbgAssert( Mat::elemSize1() == sizeof(_Tp) / DataType<_Tp>::channels );
1748 return sizeof(_Tp) / DataType<_Tp>::channels;
1751 template<typename _Tp> inline
1752 int Mat_<_Tp>::type() const
1754 CV_DbgAssert( Mat::type() == traits::Type<_Tp>::value );
1755 return traits::Type<_Tp>::value;
1758 template<typename _Tp> inline
1759 int Mat_<_Tp>::depth() const
1761 CV_DbgAssert( Mat::depth() == traits::Depth<_Tp>::value );
1762 return traits::Depth<_Tp>::value;
1765 template<typename _Tp> inline
1766 int Mat_<_Tp>::channels() const
1768 CV_DbgAssert( Mat::channels() == DataType<_Tp>::channels );
1769 return DataType<_Tp>::channels;
1772 template<typename _Tp> inline
1773 size_t Mat_<_Tp>::stepT(int i) const
1775 return step.p[i] / elemSize();
1778 template<typename _Tp> inline
1779 size_t Mat_<_Tp>::step1(int i) const
1781 return step.p[i] / elemSize1();
1784 template<typename _Tp> inline
1785 Mat_<_Tp>& Mat_<_Tp>::adjustROI( int dtop, int dbottom, int dleft, int dright )
1787 return (Mat_<_Tp>&)(Mat::adjustROI(dtop, dbottom, dleft, dright));
1790 template<typename _Tp> inline
1791 Mat_<_Tp> Mat_<_Tp>::operator()( const Range& _rowRange, const Range& _colRange ) const
1793 return Mat_<_Tp>(*this, _rowRange, _colRange);
1796 template<typename _Tp> inline
1797 Mat_<_Tp> Mat_<_Tp>::operator()( const Rect& roi ) const
1799 return Mat_<_Tp>(*this, roi);
1802 template<typename _Tp> inline
1803 Mat_<_Tp> Mat_<_Tp>::operator()( const Range* ranges ) const
1805 return Mat_<_Tp>(*this, ranges);
1808 template<typename _Tp> inline
1809 Mat_<_Tp> Mat_<_Tp>::operator()(const std::vector<Range>& ranges) const
1811 return Mat_<_Tp>(*this, ranges);
1814 template<typename _Tp> inline
1815 _Tp* Mat_<_Tp>::operator [](int y)
1817 CV_DbgAssert( 0 <= y && y < size.p[0] );
1818 return (_Tp*)(data + y*step.p[0]);
1821 template<typename _Tp> inline
1822 const _Tp* Mat_<_Tp>::operator [](int y) const
1824 CV_DbgAssert( 0 <= y && y < size.p[0] );
1825 return (const _Tp*)(data + y*step.p[0]);
1828 template<typename _Tp> inline
1829 _Tp& Mat_<_Tp>::operator ()(int i0, int i1)
1831 CV_DbgAssert(dims <= 2);
1833 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1834 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
1835 CV_DbgAssert(type() == traits::Type<_Tp>::value);
1836 return ((_Tp*)(data + step.p[0] * i0))[i1];
1839 template<typename _Tp> inline
1840 const _Tp& Mat_<_Tp>::operator ()(int i0, int i1) const
1842 CV_DbgAssert(dims <= 2);
1844 CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
1845 CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
1846 CV_DbgAssert(type() == traits::Type<_Tp>::value);
1847 return ((const _Tp*)(data + step.p[0] * i0))[i1];
1850 template<typename _Tp> inline
1851 _Tp& Mat_<_Tp>::operator ()(Point pt)
1853 CV_DbgAssert(dims <= 2);
1855 CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]);
1856 CV_DbgAssert((unsigned)pt.x < (unsigned)size.p[1]);
1857 CV_DbgAssert(type() == traits::Type<_Tp>::value);
1858 return ((_Tp*)(data + step.p[0] * pt.y))[pt.x];
1861 template<typename _Tp> inline
1862 const _Tp& Mat_<_Tp>::operator ()(Point pt) const
1864 CV_DbgAssert(dims <= 2);
1866 CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]);
1867 CV_DbgAssert((unsigned)pt.x < (unsigned)size.p[1]);
1868 CV_DbgAssert(type() == traits::Type<_Tp>::value);
1869 return ((const _Tp*)(data + step.p[0] * pt.y))[pt.x];
1872 template<typename _Tp> inline
1873 _Tp& Mat_<_Tp>::operator ()(const int* idx)
1875 return Mat::at<_Tp>(idx);
1878 template<typename _Tp> inline
1879 const _Tp& Mat_<_Tp>::operator ()(const int* idx) const
1881 return Mat::at<_Tp>(idx);
1884 template<typename _Tp> template<int n> inline
1885 _Tp& Mat_<_Tp>::operator ()(const Vec<int, n>& idx)
1887 return Mat::at<_Tp>(idx);
1890 template<typename _Tp> template<int n> inline
1891 const _Tp& Mat_<_Tp>::operator ()(const Vec<int, n>& idx) const
1893 return Mat::at<_Tp>(idx);
1896 template<typename _Tp> inline
1897 _Tp& Mat_<_Tp>::operator ()(int i0)
1899 return this->at<_Tp>(i0);
1902 template<typename _Tp> inline
1903 const _Tp& Mat_<_Tp>::operator ()(int i0) const
1905 return this->at<_Tp>(i0);
1908 template<typename _Tp> inline
1909 _Tp& Mat_<_Tp>::operator ()(int i0, int i1, int i2)
1911 return this->at<_Tp>(i0, i1, i2);
1914 template<typename _Tp> inline
1915 const _Tp& Mat_<_Tp>::operator ()(int i0, int i1, int i2) const
1917 return this->at<_Tp>(i0, i1, i2);
1920 template<typename _Tp> inline
1921 Mat_<_Tp>::operator std::vector<_Tp>() const
1928 template<typename _Tp> template<std::size_t _Nm> inline
1929 Mat_<_Tp>::operator std::array<_Tp, _Nm>() const
1931 std::array<_Tp, _Nm> a;
1936 template<typename _Tp> template<int n> inline
1937 Mat_<_Tp>::operator Vec<typename DataType<_Tp>::channel_type, n>() const
1939 CV_Assert(n % DataType<_Tp>::channels == 0);
1941 #if defined _MSC_VER
1942 const Mat* pMat = (const Mat*)this; // workaround for MSVS <= 2012 compiler bugs (but GCC 4.6 dislikes this workaround)
1943 return pMat->operator Vec<typename DataType<_Tp>::channel_type, n>();
1945 return this->Mat::operator Vec<typename DataType<_Tp>::channel_type, n>();
1949 template<typename _Tp> template<int m, int n> inline
1950 Mat_<_Tp>::operator Matx<typename DataType<_Tp>::channel_type, m, n>() const
1952 CV_Assert(n % DataType<_Tp>::channels == 0);
1954 #if defined _MSC_VER
1955 const Mat* pMat = (const Mat*)this; // workaround for MSVS <= 2012 compiler bugs (but GCC 4.6 dislikes this workaround)
1956 Matx<typename DataType<_Tp>::channel_type, m, n> res = pMat->operator Matx<typename DataType<_Tp>::channel_type, m, n>();
1959 Matx<typename DataType<_Tp>::channel_type, m, n> res = this->Mat::operator Matx<typename DataType<_Tp>::channel_type, m, n>();
1964 template<typename _Tp> inline
1965 MatConstIterator_<_Tp> Mat_<_Tp>::begin() const
1967 return Mat::begin<_Tp>();
1970 template<typename _Tp> inline
1971 MatConstIterator_<_Tp> Mat_<_Tp>::end() const
1973 return Mat::end<_Tp>();
1976 template<typename _Tp> inline
1977 MatIterator_<_Tp> Mat_<_Tp>::begin()
1979 return Mat::begin<_Tp>();
1982 template<typename _Tp> inline
1983 MatIterator_<_Tp> Mat_<_Tp>::end()
1985 return Mat::end<_Tp>();
1988 template<typename _Tp> template<typename Functor> inline
1989 void Mat_<_Tp>::forEach(const Functor& operation) {
1990 Mat::forEach<_Tp, Functor>(operation);
1993 template<typename _Tp> template<typename Functor> inline
1994 void Mat_<_Tp>::forEach(const Functor& operation) const {
1995 Mat::forEach<_Tp, Functor>(operation);
1998 template<typename _Tp> inline
1999 Mat_<_Tp>::Mat_(Mat_&& m)
2004 template<typename _Tp> inline
2005 Mat_<_Tp>& Mat_<_Tp>::operator = (Mat_&& m)
2007 Mat::operator = (std::move(m));
2011 template<typename _Tp> inline
2012 Mat_<_Tp>::Mat_(Mat&& m)
2015 flags = (flags & ~CV_MAT_TYPE_MASK) | traits::Type<_Tp>::value;
2019 template<typename _Tp> inline
2020 Mat_<_Tp>& Mat_<_Tp>::operator = (Mat&& m)
2022 if( traits::Type<_Tp>::value == m.type() )
2024 Mat::operator = ((Mat&&)m);
2027 if( traits::Depth<_Tp>::value == m.depth() )
2029 Mat::operator = ((Mat&&)m.reshape(DataType<_Tp>::channels, m.dims, 0));
2032 CV_DbgAssert(DataType<_Tp>::channels == m.channels());
2033 m.convertTo(*this, type());
2037 template<typename _Tp> inline
2038 Mat_<_Tp>::Mat_(MatExpr&& e)
2041 flags = (flags & ~CV_MAT_TYPE_MASK) | traits::Type<_Tp>::value;
2046 ///////////////////////////// SparseMat /////////////////////////////
2049 SparseMat::SparseMat()
2050 : flags(MAGIC_VAL), hdr(0)
2054 SparseMat::SparseMat(int _dims, const int* _sizes, int _type)
2055 : flags(MAGIC_VAL), hdr(0)
2057 create(_dims, _sizes, _type);
2061 SparseMat::SparseMat(const SparseMat& m)
2062 : flags(m.flags), hdr(m.hdr)
2068 SparseMat::~SparseMat()
2074 SparseMat& SparseMat::operator = (const SparseMat& m)
2079 CV_XADD(&m.hdr->refcount, 1);
2088 SparseMat& SparseMat::operator = (const Mat& m)
2090 return (*this = SparseMat(m));
2094 SparseMat SparseMat::clone() const
2102 void SparseMat::assignTo( SparseMat& m, int _type ) const
2107 convertTo(m, _type);
2111 void SparseMat::addref()
2114 CV_XADD(&hdr->refcount, 1);
2118 void SparseMat::release()
2120 if( hdr && CV_XADD(&hdr->refcount, -1) == 1 )
2126 size_t SparseMat::elemSize() const
2128 return CV_ELEM_SIZE(flags);
2132 size_t SparseMat::elemSize1() const
2134 return CV_ELEM_SIZE1(flags);
2138 int SparseMat::type() const
2140 return CV_MAT_TYPE(flags);
2144 int SparseMat::depth() const
2146 return CV_MAT_DEPTH(flags);
2150 int SparseMat::channels() const
2152 return CV_MAT_CN(flags);
2156 const int* SparseMat::size() const
2158 return hdr ? hdr->size : 0;
2162 int SparseMat::size(int i) const
2166 CV_DbgAssert((unsigned)i < (unsigned)hdr->dims);
2167 return hdr->size[i];
2173 int SparseMat::dims() const
2175 return hdr ? hdr->dims : 0;
2179 size_t SparseMat::nzcount() const
2181 return hdr ? hdr->nodeCount : 0;
2185 size_t SparseMat::hash(int i0) const
2191 size_t SparseMat::hash(int i0, int i1) const
2193 return (size_t)(unsigned)i0 * HASH_SCALE + (unsigned)i1;
2197 size_t SparseMat::hash(int i0, int i1, int i2) const
2199 return ((size_t)(unsigned)i0 * HASH_SCALE + (unsigned)i1) * HASH_SCALE + (unsigned)i2;
2203 size_t SparseMat::hash(const int* idx) const
2205 size_t h = (unsigned)idx[0];
2209 for(int i = 1; i < d; i++ )
2210 h = h * HASH_SCALE + (unsigned)idx[i];
2214 template<typename _Tp> inline
2215 _Tp& SparseMat::ref(int i0, size_t* hashval)
2217 return *(_Tp*)((SparseMat*)this)->ptr(i0, true, hashval);
2220 template<typename _Tp> inline
2221 _Tp& SparseMat::ref(int i0, int i1, size_t* hashval)
2223 return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, true, hashval);
2226 template<typename _Tp> inline
2227 _Tp& SparseMat::ref(int i0, int i1, int i2, size_t* hashval)
2229 return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, i2, true, hashval);
2232 template<typename _Tp> inline
2233 _Tp& SparseMat::ref(const int* idx, size_t* hashval)
2235 return *(_Tp*)((SparseMat*)this)->ptr(idx, true, hashval);
2238 template<typename _Tp> inline
2239 _Tp SparseMat::value(int i0, size_t* hashval) const
2241 const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval);
2242 return p ? *p : _Tp();
2245 template<typename _Tp> inline
2246 _Tp SparseMat::value(int i0, int i1, size_t* hashval) const
2248 const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval);
2249 return p ? *p : _Tp();
2252 template<typename _Tp> inline
2253 _Tp SparseMat::value(int i0, int i1, int i2, size_t* hashval) const
2255 const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval);
2256 return p ? *p : _Tp();
2259 template<typename _Tp> inline
2260 _Tp SparseMat::value(const int* idx, size_t* hashval) const
2262 const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval);
2263 return p ? *p : _Tp();
2266 template<typename _Tp> inline
2267 const _Tp* SparseMat::find(int i0, size_t* hashval) const
2269 return (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval);
2272 template<typename _Tp> inline
2273 const _Tp* SparseMat::find(int i0, int i1, size_t* hashval) const
2275 return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval);
2278 template<typename _Tp> inline
2279 const _Tp* SparseMat::find(int i0, int i1, int i2, size_t* hashval) const
2281 return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval);
2284 template<typename _Tp> inline
2285 const _Tp* SparseMat::find(const int* idx, size_t* hashval) const
2287 return (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval);
2290 template<typename _Tp> inline
2291 _Tp& SparseMat::value(Node* n)
2293 return *(_Tp*)((uchar*)n + hdr->valueOffset);
2296 template<typename _Tp> inline
2297 const _Tp& SparseMat::value(const Node* n) const
2299 return *(const _Tp*)((const uchar*)n + hdr->valueOffset);
2303 SparseMat::Node* SparseMat::node(size_t nidx)
2305 return (Node*)(void*)&hdr->pool[nidx];
2309 const SparseMat::Node* SparseMat::node(size_t nidx) const
2311 return (const Node*)(const void*)&hdr->pool[nidx];
2315 SparseMatIterator SparseMat::begin()
2317 return SparseMatIterator(this);
2321 SparseMatConstIterator SparseMat::begin() const
2323 return SparseMatConstIterator(this);
2327 SparseMatIterator SparseMat::end()
2329 SparseMatIterator it(this);
2335 SparseMatConstIterator SparseMat::end() const
2337 SparseMatConstIterator it(this);
2342 template<typename _Tp> inline
2343 SparseMatIterator_<_Tp> SparseMat::begin()
2345 return SparseMatIterator_<_Tp>(this);
2348 template<typename _Tp> inline
2349 SparseMatConstIterator_<_Tp> SparseMat::begin() const
2351 return SparseMatConstIterator_<_Tp>(this);
2354 template<typename _Tp> inline
2355 SparseMatIterator_<_Tp> SparseMat::end()
2357 SparseMatIterator_<_Tp> it(this);
2362 template<typename _Tp> inline
2363 SparseMatConstIterator_<_Tp> SparseMat::end() const
2365 SparseMatConstIterator_<_Tp> it(this);
2372 ///////////////////////////// SparseMat_ ////////////////////////////
2374 template<typename _Tp> inline
2375 SparseMat_<_Tp>::SparseMat_()
2377 flags = MAGIC_VAL | traits::Type<_Tp>::value;
2380 template<typename _Tp> inline
2381 SparseMat_<_Tp>::SparseMat_(int _dims, const int* _sizes)
2382 : SparseMat(_dims, _sizes, traits::Type<_Tp>::value)
2385 template<typename _Tp> inline
2386 SparseMat_<_Tp>::SparseMat_(const SparseMat& m)
2388 if( m.type() == traits::Type<_Tp>::value )
2389 *this = (const SparseMat_<_Tp>&)m;
2391 m.convertTo(*this, traits::Type<_Tp>::value);
2394 template<typename _Tp> inline
2395 SparseMat_<_Tp>::SparseMat_(const SparseMat_<_Tp>& m)
2397 this->flags = m.flags;
2400 CV_XADD(&this->hdr->refcount, 1);
2403 template<typename _Tp> inline
2404 SparseMat_<_Tp>::SparseMat_(const Mat& m)
2410 template<typename _Tp> inline
2411 SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const SparseMat_<_Tp>& m)
2415 if( m.hdr ) CV_XADD(&m.hdr->refcount, 1);
2423 template<typename _Tp> inline
2424 SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const SparseMat& m)
2426 if( m.type() == traits::Type<_Tp>::value )
2427 return (*this = (const SparseMat_<_Tp>&)m);
2428 m.convertTo(*this, traits::Type<_Tp>::value);
2432 template<typename _Tp> inline
2433 SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const Mat& m)
2435 return (*this = SparseMat(m));
2438 template<typename _Tp> inline
2439 SparseMat_<_Tp> SparseMat_<_Tp>::clone() const
2446 template<typename _Tp> inline
2447 void SparseMat_<_Tp>::create(int _dims, const int* _sizes)
2449 SparseMat::create(_dims, _sizes, traits::Type<_Tp>::value);
2452 template<typename _Tp> inline
2453 int SparseMat_<_Tp>::type() const
2455 return traits::Type<_Tp>::value;
2458 template<typename _Tp> inline
2459 int SparseMat_<_Tp>::depth() const
2461 return traits::Depth<_Tp>::value;
2464 template<typename _Tp> inline
2465 int SparseMat_<_Tp>::channels() const
2467 return DataType<_Tp>::channels;
2470 template<typename _Tp> inline
2471 _Tp& SparseMat_<_Tp>::ref(int i0, size_t* hashval)
2473 return SparseMat::ref<_Tp>(i0, hashval);
2476 template<typename _Tp> inline
2477 _Tp SparseMat_<_Tp>::operator()(int i0, size_t* hashval) const
2479 return SparseMat::value<_Tp>(i0, hashval);
2482 template<typename _Tp> inline
2483 _Tp& SparseMat_<_Tp>::ref(int i0, int i1, size_t* hashval)
2485 return SparseMat::ref<_Tp>(i0, i1, hashval);
2488 template<typename _Tp> inline
2489 _Tp SparseMat_<_Tp>::operator()(int i0, int i1, size_t* hashval) const
2491 return SparseMat::value<_Tp>(i0, i1, hashval);
2494 template<typename _Tp> inline
2495 _Tp& SparseMat_<_Tp>::ref(int i0, int i1, int i2, size_t* hashval)
2497 return SparseMat::ref<_Tp>(i0, i1, i2, hashval);
2500 template<typename _Tp> inline
2501 _Tp SparseMat_<_Tp>::operator()(int i0, int i1, int i2, size_t* hashval) const
2503 return SparseMat::value<_Tp>(i0, i1, i2, hashval);
2506 template<typename _Tp> inline
2507 _Tp& SparseMat_<_Tp>::ref(const int* idx, size_t* hashval)
2509 return SparseMat::ref<_Tp>(idx, hashval);
2512 template<typename _Tp> inline
2513 _Tp SparseMat_<_Tp>::operator()(const int* idx, size_t* hashval) const
2515 return SparseMat::value<_Tp>(idx, hashval);
2518 template<typename _Tp> inline
2519 SparseMatIterator_<_Tp> SparseMat_<_Tp>::begin()
2521 return SparseMatIterator_<_Tp>(this);
2524 template<typename _Tp> inline
2525 SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::begin() const
2527 return SparseMatConstIterator_<_Tp>(this);
2530 template<typename _Tp> inline
2531 SparseMatIterator_<_Tp> SparseMat_<_Tp>::end()
2533 SparseMatIterator_<_Tp> it(this);
2538 template<typename _Tp> inline
2539 SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::end() const
2541 SparseMatConstIterator_<_Tp> it(this);
2548 ////////////////////////// MatConstIterator /////////////////////////
2551 MatConstIterator::MatConstIterator()
2552 : m(0), elemSize(0), ptr(0), sliceStart(0), sliceEnd(0)
2556 MatConstIterator::MatConstIterator(const Mat* _m)
2557 : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
2559 if( m && m->isContinuous() )
2561 sliceStart = m->ptr();
2562 sliceEnd = sliceStart + m->total()*elemSize;
2564 seek((const int*)0);
2568 MatConstIterator::MatConstIterator(const Mat* _m, int _row, int _col)
2569 : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
2571 CV_Assert(m && m->dims <= 2);
2572 if( m->isContinuous() )
2574 sliceStart = m->ptr();
2575 sliceEnd = sliceStart + m->total()*elemSize;
2577 int idx[] = {_row, _col};
2582 MatConstIterator::MatConstIterator(const Mat* _m, Point _pt)
2583 : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0)
2585 CV_Assert(m && m->dims <= 2);
2586 if( m->isContinuous() )
2588 sliceStart = m->ptr();
2589 sliceEnd = sliceStart + m->total()*elemSize;
2591 int idx[] = {_pt.y, _pt.x};
2596 MatConstIterator::MatConstIterator(const MatConstIterator& it)
2597 : m(it.m), elemSize(it.elemSize), ptr(it.ptr), sliceStart(it.sliceStart), sliceEnd(it.sliceEnd)
2601 MatConstIterator& MatConstIterator::operator = (const MatConstIterator& it )
2603 m = it.m; elemSize = it.elemSize; ptr = it.ptr;
2604 sliceStart = it.sliceStart; sliceEnd = it.sliceEnd;
2609 const uchar* MatConstIterator::operator *() const
2614 inline MatConstIterator& MatConstIterator::operator += (ptrdiff_t ofs)
2616 if( !m || ofs == 0 )
2618 ptrdiff_t ofsb = ofs*elemSize;
2620 if( ptr < sliceStart || sliceEnd <= ptr )
2629 MatConstIterator& MatConstIterator::operator -= (ptrdiff_t ofs)
2631 return (*this += -ofs);
2635 MatConstIterator& MatConstIterator::operator --()
2637 if( m && (ptr -= elemSize) < sliceStart )
2646 MatConstIterator MatConstIterator::operator --(int)
2648 MatConstIterator b = *this;
2654 MatConstIterator& MatConstIterator::operator ++()
2656 if( m && (ptr += elemSize) >= sliceEnd )
2664 inline MatConstIterator MatConstIterator::operator ++(int)
2666 MatConstIterator b = *this;
2673 bool operator == (const MatConstIterator& a, const MatConstIterator& b)
2675 return a.m == b.m && a.ptr == b.ptr;
2679 bool operator != (const MatConstIterator& a, const MatConstIterator& b)
2685 bool operator < (const MatConstIterator& a, const MatConstIterator& b)
2687 return a.ptr < b.ptr;
2691 bool operator > (const MatConstIterator& a, const MatConstIterator& b)
2693 return a.ptr > b.ptr;
2697 bool operator <= (const MatConstIterator& a, const MatConstIterator& b)
2699 return a.ptr <= b.ptr;
2703 bool operator >= (const MatConstIterator& a, const MatConstIterator& b)
2705 return a.ptr >= b.ptr;
2709 ptrdiff_t operator - (const MatConstIterator& b, const MatConstIterator& a)
2712 return ((size_t)(-1) >> 1);
2713 if( a.sliceEnd == b.sliceEnd )
2714 return (b.ptr - a.ptr)/static_cast<ptrdiff_t>(b.elemSize);
2716 return b.lpos() - a.lpos();
2720 MatConstIterator operator + (const MatConstIterator& a, ptrdiff_t ofs)
2722 MatConstIterator b = a;
2727 MatConstIterator operator + (ptrdiff_t ofs, const MatConstIterator& a)
2729 MatConstIterator b = a;
2734 MatConstIterator operator - (const MatConstIterator& a, ptrdiff_t ofs)
2736 MatConstIterator b = a;
2742 const uchar* MatConstIterator::operator [](ptrdiff_t i) const
2744 return *(*this + i);
2749 ///////////////////////// MatConstIterator_ /////////////////////////
2751 template<typename _Tp> inline
2752 MatConstIterator_<_Tp>::MatConstIterator_()
2755 template<typename _Tp> inline
2756 MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m)
2757 : MatConstIterator(_m)
2760 template<typename _Tp> inline
2761 MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col)
2762 : MatConstIterator(_m, _row, _col)
2765 template<typename _Tp> inline
2766 MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m, Point _pt)
2767 : MatConstIterator(_m, _pt)
2770 template<typename _Tp> inline
2771 MatConstIterator_<_Tp>::MatConstIterator_(const MatConstIterator_& it)
2772 : MatConstIterator(it)
2775 template<typename _Tp> inline
2776 MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator = (const MatConstIterator_& it )
2778 MatConstIterator::operator = (it);
2782 template<typename _Tp> inline
2783 const _Tp& MatConstIterator_<_Tp>::operator *() const
2785 return *(_Tp*)(this->ptr);
2788 template<typename _Tp> inline
2789 MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator += (ptrdiff_t ofs)
2791 MatConstIterator::operator += (ofs);
2795 template<typename _Tp> inline
2796 MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator -= (ptrdiff_t ofs)
2798 return (*this += -ofs);
2801 template<typename _Tp> inline
2802 MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator --()
2804 MatConstIterator::operator --();
2808 template<typename _Tp> inline
2809 MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator --(int)
2811 MatConstIterator_ b = *this;
2812 MatConstIterator::operator --();
2816 template<typename _Tp> inline
2817 MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator ++()
2819 MatConstIterator::operator ++();
2823 template<typename _Tp> inline
2824 MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator ++(int)
2826 MatConstIterator_ b = *this;
2827 MatConstIterator::operator ++();
2832 template<typename _Tp> inline
2833 Point MatConstIterator_<_Tp>::pos() const
2837 CV_DbgAssert( m->dims <= 2 );
2838 if( m->isContinuous() )
2840 ptrdiff_t ofs = (const _Tp*)ptr - (const _Tp*)m->data;
2841 int y = (int)(ofs / m->cols);
2842 int x = (int)(ofs - (ptrdiff_t)y * m->cols);
2847 ptrdiff_t ofs = (uchar*)ptr - m->data;
2848 int y = (int)(ofs / m->step);
2849 int x = (int)((ofs - y * m->step)/sizeof(_Tp));
2855 template<typename _Tp> static inline
2856 bool operator == (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
2858 return a.m == b.m && a.ptr == b.ptr;
2861 template<typename _Tp> static inline
2862 bool operator != (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b)
2864 return a.m != b.m || a.ptr != b.ptr;
2867 template<typename _Tp> static inline
2868 MatConstIterator_<_Tp> operator + (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs)
2870 MatConstIterator t = (const MatConstIterator&)a + ofs;
2871 return (MatConstIterator_<_Tp>&)t;
2874 template<typename _Tp> static inline
2875 MatConstIterator_<_Tp> operator + (ptrdiff_t ofs, const MatConstIterator_<_Tp>& a)
2877 MatConstIterator t = (const MatConstIterator&)a + ofs;
2878 return (MatConstIterator_<_Tp>&)t;
2881 template<typename _Tp> static inline
2882 MatConstIterator_<_Tp> operator - (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs)
2884 MatConstIterator t = (const MatConstIterator&)a - ofs;
2885 return (MatConstIterator_<_Tp>&)t;
2888 template<typename _Tp> inline
2889 const _Tp& MatConstIterator_<_Tp>::operator [](ptrdiff_t i) const
2891 return *(_Tp*)MatConstIterator::operator [](i);
2896 //////////////////////////// MatIterator_ ///////////////////////////
2898 template<typename _Tp> inline
2899 MatIterator_<_Tp>::MatIterator_()
2900 : MatConstIterator_<_Tp>()
2903 template<typename _Tp> inline
2904 MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m)
2905 : MatConstIterator_<_Tp>(_m)
2908 template<typename _Tp> inline
2909 MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, int _row, int _col)
2910 : MatConstIterator_<_Tp>(_m, _row, _col)
2913 template<typename _Tp> inline
2914 MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, Point _pt)
2915 : MatConstIterator_<_Tp>(_m, _pt)
2918 template<typename _Tp> inline
2919 MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, const int* _idx)
2920 : MatConstIterator_<_Tp>(_m, _idx)
2923 template<typename _Tp> inline
2924 MatIterator_<_Tp>::MatIterator_(const MatIterator_& it)
2925 : MatConstIterator_<_Tp>(it)
2928 template<typename _Tp> inline
2929 MatIterator_<_Tp>& MatIterator_<_Tp>::operator = (const MatIterator_<_Tp>& it )
2931 MatConstIterator::operator = (it);
2935 template<typename _Tp> inline
2936 _Tp& MatIterator_<_Tp>::operator *() const
2938 return *(_Tp*)(this->ptr);
2941 template<typename _Tp> inline
2942 MatIterator_<_Tp>& MatIterator_<_Tp>::operator += (ptrdiff_t ofs)
2944 MatConstIterator::operator += (ofs);
2948 template<typename _Tp> inline
2949 MatIterator_<_Tp>& MatIterator_<_Tp>::operator -= (ptrdiff_t ofs)
2951 MatConstIterator::operator += (-ofs);
2955 template<typename _Tp> inline
2956 MatIterator_<_Tp>& MatIterator_<_Tp>::operator --()
2958 MatConstIterator::operator --();
2962 template<typename _Tp> inline
2963 MatIterator_<_Tp> MatIterator_<_Tp>::operator --(int)
2965 MatIterator_ b = *this;
2966 MatConstIterator::operator --();
2970 template<typename _Tp> inline
2971 MatIterator_<_Tp>& MatIterator_<_Tp>::operator ++()
2973 MatConstIterator::operator ++();
2977 template<typename _Tp> inline
2978 MatIterator_<_Tp> MatIterator_<_Tp>::operator ++(int)
2980 MatIterator_ b = *this;
2981 MatConstIterator::operator ++();
2985 template<typename _Tp> inline
2986 _Tp& MatIterator_<_Tp>::operator [](ptrdiff_t i) const
2988 return *(*this + i);
2992 template<typename _Tp> static inline
2993 bool operator == (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b)
2995 return a.m == b.m && a.ptr == b.ptr;
2998 template<typename _Tp> static inline
2999 bool operator != (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b)
3001 return a.m != b.m || a.ptr != b.ptr;
3004 template<typename _Tp> static inline
3005 MatIterator_<_Tp> operator + (const MatIterator_<_Tp>& a, ptrdiff_t ofs)
3007 MatConstIterator t = (const MatConstIterator&)a + ofs;
3008 return (MatIterator_<_Tp>&)t;
3011 template<typename _Tp> static inline
3012 MatIterator_<_Tp> operator + (ptrdiff_t ofs, const MatIterator_<_Tp>& a)
3014 MatConstIterator t = (const MatConstIterator&)a + ofs;
3015 return (MatIterator_<_Tp>&)t;
3018 template<typename _Tp> static inline
3019 MatIterator_<_Tp> operator - (const MatIterator_<_Tp>& a, ptrdiff_t ofs)
3021 MatConstIterator t = (const MatConstIterator&)a - ofs;
3022 return (MatIterator_<_Tp>&)t;
3027 /////////////////////// SparseMatConstIterator //////////////////////
3030 SparseMatConstIterator::SparseMatConstIterator()
3031 : m(0), hashidx(0), ptr(0)
3035 SparseMatConstIterator::SparseMatConstIterator(const SparseMatConstIterator& it)
3036 : m(it.m), hashidx(it.hashidx), ptr(it.ptr)
3039 inline SparseMatConstIterator& SparseMatConstIterator::operator = (const SparseMatConstIterator& it)
3044 hashidx = it.hashidx;
3050 template<typename _Tp> inline
3051 const _Tp& SparseMatConstIterator::value() const
3053 return *(const _Tp*)ptr;
3057 const SparseMat::Node* SparseMatConstIterator::node() const
3059 return (ptr && m && m->hdr) ? (const SparseMat::Node*)(const void*)(ptr - m->hdr->valueOffset) : 0;
3063 SparseMatConstIterator SparseMatConstIterator::operator ++(int)
3065 SparseMatConstIterator it = *this;
3071 void SparseMatConstIterator::seekEnd()
3075 hashidx = m->hdr->hashtab.size();
3082 bool operator == (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
3084 return it1.m == it2.m && it1.ptr == it2.ptr;
3088 bool operator != (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2)
3090 return !(it1 == it2);
3095 ///////////////////////// SparseMatIterator /////////////////////////
3098 SparseMatIterator::SparseMatIterator()
3102 SparseMatIterator::SparseMatIterator(SparseMat* _m)
3103 : SparseMatConstIterator(_m)
3107 SparseMatIterator::SparseMatIterator(const SparseMatIterator& it)
3108 : SparseMatConstIterator(it)
3112 SparseMatIterator& SparseMatIterator::operator = (const SparseMatIterator& it)
3114 (SparseMatConstIterator&)*this = it;
3118 template<typename _Tp> inline
3119 _Tp& SparseMatIterator::value() const
3125 SparseMat::Node* SparseMatIterator::node() const
3127 return (SparseMat::Node*)SparseMatConstIterator::node();
3131 SparseMatIterator& SparseMatIterator::operator ++()
3133 SparseMatConstIterator::operator ++();
3138 SparseMatIterator SparseMatIterator::operator ++(int)
3140 SparseMatIterator it = *this;
3147 ////////////////////// SparseMatConstIterator_ //////////////////////
3149 template<typename _Tp> inline
3150 SparseMatConstIterator_<_Tp>::SparseMatConstIterator_()
3153 template<typename _Tp> inline
3154 SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat_<_Tp>* _m)
3155 : SparseMatConstIterator(_m)
3158 template<typename _Tp> inline
3159 SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat* _m)
3160 : SparseMatConstIterator(_m)
3162 CV_Assert( _m->type() == traits::Type<_Tp>::value );
3165 template<typename _Tp> inline
3166 SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it)
3167 : SparseMatConstIterator(it)
3170 template<typename _Tp> inline
3171 SparseMatConstIterator_<_Tp>& SparseMatConstIterator_<_Tp>::operator = (const SparseMatConstIterator_<_Tp>& it)
3173 return reinterpret_cast<SparseMatConstIterator_<_Tp>&>
3174 (*reinterpret_cast<SparseMatConstIterator*>(this) =
3175 reinterpret_cast<const SparseMatConstIterator&>(it));
3178 template<typename _Tp> inline
3179 const _Tp& SparseMatConstIterator_<_Tp>::operator *() const
3181 return *(const _Tp*)this->ptr;
3184 template<typename _Tp> inline
3185 SparseMatConstIterator_<_Tp>& SparseMatConstIterator_<_Tp>::operator ++()
3187 SparseMatConstIterator::operator ++();
3191 template<typename _Tp> inline
3192 SparseMatConstIterator_<_Tp> SparseMatConstIterator_<_Tp>::operator ++(int)
3194 SparseMatConstIterator_<_Tp> it = *this;
3195 SparseMatConstIterator::operator ++();
3201 ///////////////////////// SparseMatIterator_ ////////////////////////
3203 template<typename _Tp> inline
3204 SparseMatIterator_<_Tp>::SparseMatIterator_()
3207 template<typename _Tp> inline
3208 SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat_<_Tp>* _m)
3209 : SparseMatConstIterator_<_Tp>(_m)
3212 template<typename _Tp> inline
3213 SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat* _m)
3214 : SparseMatConstIterator_<_Tp>(_m)
3217 template<typename _Tp> inline
3218 SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it)
3219 : SparseMatConstIterator_<_Tp>(it)
3222 template<typename _Tp> inline
3223 SparseMatIterator_<_Tp>& SparseMatIterator_<_Tp>::operator = (const SparseMatIterator_<_Tp>& it)
3225 return reinterpret_cast<SparseMatIterator_<_Tp>&>
3226 (*reinterpret_cast<SparseMatConstIterator*>(this) =
3227 reinterpret_cast<const SparseMatConstIterator&>(it));
3230 template<typename _Tp> inline
3231 _Tp& SparseMatIterator_<_Tp>::operator *() const
3233 return *(_Tp*)this->ptr;
3236 template<typename _Tp> inline
3237 SparseMatIterator_<_Tp>& SparseMatIterator_<_Tp>::operator ++()
3239 SparseMatConstIterator::operator ++();
3243 template<typename _Tp> inline
3244 SparseMatIterator_<_Tp> SparseMatIterator_<_Tp>::operator ++(int)
3246 SparseMatIterator_<_Tp> it = *this;
3247 SparseMatConstIterator::operator ++();
3253 //////////////////////// MatCommaInitializer_ ///////////////////////
3255 template<typename _Tp> inline
3256 MatCommaInitializer_<_Tp>::MatCommaInitializer_(Mat_<_Tp>* _m)
3260 template<typename _Tp> template<typename T2> inline
3261 MatCommaInitializer_<_Tp>& MatCommaInitializer_<_Tp>::operator , (T2 v)
3263 CV_DbgAssert( this->it < ((const Mat_<_Tp>*)this->it.m)->end() );
3269 template<typename _Tp> inline
3270 MatCommaInitializer_<_Tp>::operator Mat_<_Tp>() const
3272 CV_DbgAssert( this->it == ((const Mat_<_Tp>*)this->it.m)->end() );
3273 return Mat_<_Tp>(*this->it.m);
3277 template<typename _Tp, typename T2> static inline
3278 MatCommaInitializer_<_Tp> operator << (const Mat_<_Tp>& m, T2 val)
3280 MatCommaInitializer_<_Tp> commaInitializer((Mat_<_Tp>*)&m);
3281 return (commaInitializer, val);
3286 ///////////////////////// Matrix Expressions ////////////////////////
3289 Mat& Mat::operator = (const MatExpr& e)
3291 e.op->assign(e, *this);
3295 template<typename _Tp> inline
3296 Mat_<_Tp>::Mat_(const MatExpr& e)
3298 e.op->assign(e, *this, traits::Type<_Tp>::value);
3301 template<typename _Tp> inline
3302 Mat_<_Tp>& Mat_<_Tp>::operator = (const MatExpr& e)
3304 e.op->assign(e, *this, traits::Type<_Tp>::value);
3308 template<typename _Tp> inline
3309 MatExpr Mat_<_Tp>::zeros(int rows, int cols)
3311 return Mat::zeros(rows, cols, traits::Type<_Tp>::value);
3314 template<typename _Tp> inline
3315 MatExpr Mat_<_Tp>::zeros(Size sz)
3317 return Mat::zeros(sz, traits::Type<_Tp>::value);
3320 template<typename _Tp> inline
3321 MatExpr Mat_<_Tp>::ones(int rows, int cols)
3323 return Mat::ones(rows, cols, traits::Type<_Tp>::value);
3326 template<typename _Tp> inline
3327 MatExpr Mat_<_Tp>::ones(Size sz)
3329 return Mat::ones(sz, traits::Type<_Tp>::value);
3332 template<typename _Tp> inline
3333 MatExpr Mat_<_Tp>::eye(int rows, int cols)
3335 return Mat::eye(rows, cols, traits::Type<_Tp>::value);
3338 template<typename _Tp> inline
3339 MatExpr Mat_<_Tp>::eye(Size sz)
3341 return Mat::eye(sz, traits::Type<_Tp>::value);
3346 : op(0), flags(0), a(Mat()), b(Mat()), c(Mat()), alpha(0), beta(0), s()
3350 MatExpr::MatExpr(const MatOp* _op, int _flags, const Mat& _a, const Mat& _b,
3351 const Mat& _c, double _alpha, double _beta, const Scalar& _s)
3352 : op(_op), flags(_flags), a(_a), b(_b), c(_c), alpha(_alpha), beta(_beta), s(_s)
3356 MatExpr::operator Mat() const
3359 op->assign(*this, m);
3363 template<typename _Tp> inline
3364 MatExpr::operator Mat_<_Tp>() const
3367 op->assign(*this, m, traits::Type<_Tp>::value);
3372 template<typename _Tp> static inline
3373 MatExpr min(const Mat_<_Tp>& a, const Mat_<_Tp>& b)
3375 return cv::min((const Mat&)a, (const Mat&)b);
3378 template<typename _Tp> static inline
3379 MatExpr min(const Mat_<_Tp>& a, double s)
3381 return cv::min((const Mat&)a, s);
3384 template<typename _Tp> static inline
3385 MatExpr min(double s, const Mat_<_Tp>& a)
3387 return cv::min((const Mat&)a, s);
3390 template<typename _Tp> static inline
3391 MatExpr max(const Mat_<_Tp>& a, const Mat_<_Tp>& b)
3393 return cv::max((const Mat&)a, (const Mat&)b);
3396 template<typename _Tp> static inline
3397 MatExpr max(const Mat_<_Tp>& a, double s)
3399 return cv::max((const Mat&)a, s);
3402 template<typename _Tp> static inline
3403 MatExpr max(double s, const Mat_<_Tp>& a)
3405 return cv::max((const Mat&)a, s);
3408 template<typename _Tp> static inline
3409 MatExpr abs(const Mat_<_Tp>& m)
3411 return cv::abs((const Mat&)m);
3416 Mat& operator += (Mat& a, const MatExpr& b)
3418 b.op->augAssignAdd(b, a);
3423 const Mat& operator += (const Mat& a, const MatExpr& b)
3425 b.op->augAssignAdd(b, (Mat&)a);
3429 template<typename _Tp> static inline
3430 Mat_<_Tp>& operator += (Mat_<_Tp>& a, const MatExpr& b)
3432 b.op->augAssignAdd(b, a);
3436 template<typename _Tp> static inline
3437 const Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const MatExpr& b)
3439 b.op->augAssignAdd(b, (Mat&)a);
3444 Mat& operator -= (Mat& a, const MatExpr& b)
3446 b.op->augAssignSubtract(b, a);
3451 const Mat& operator -= (const Mat& a, const MatExpr& b)
3453 b.op->augAssignSubtract(b, (Mat&)a);
3457 template<typename _Tp> static inline
3458 Mat_<_Tp>& operator -= (Mat_<_Tp>& a, const MatExpr& b)
3460 b.op->augAssignSubtract(b, a);
3464 template<typename _Tp> static inline
3465 const Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const MatExpr& b)
3467 b.op->augAssignSubtract(b, (Mat&)a);
3472 Mat& operator *= (Mat& a, const MatExpr& b)
3474 b.op->augAssignMultiply(b, a);
3479 const Mat& operator *= (const Mat& a, const MatExpr& b)
3481 b.op->augAssignMultiply(b, (Mat&)a);
3485 template<typename _Tp> static inline
3486 Mat_<_Tp>& operator *= (Mat_<_Tp>& a, const MatExpr& b)
3488 b.op->augAssignMultiply(b, a);
3492 template<typename _Tp> static inline
3493 const Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, const MatExpr& b)
3495 b.op->augAssignMultiply(b, (Mat&)a);
3500 Mat& operator /= (Mat& a, const MatExpr& b)
3502 b.op->augAssignDivide(b, a);
3507 const Mat& operator /= (const Mat& a, const MatExpr& b)
3509 b.op->augAssignDivide(b, (Mat&)a);
3513 template<typename _Tp> static inline
3514 Mat_<_Tp>& operator /= (Mat_<_Tp>& a, const MatExpr& b)
3516 b.op->augAssignDivide(b, a);
3520 template<typename _Tp> static inline
3521 const Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const MatExpr& b)
3523 b.op->augAssignDivide(b, (Mat&)a);
3528 //////////////////////////////// UMat ////////////////////////////////
3531 UMat::UMat(UMatUsageFlags _usageFlags)
3532 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3536 UMat::UMat(int _rows, int _cols, int _type, UMatUsageFlags _usageFlags)
3537 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3539 create(_rows, _cols, _type);
3543 UMat::UMat(int _rows, int _cols, int _type, const Scalar& _s, UMatUsageFlags _usageFlags)
3544 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3546 create(_rows, _cols, _type);
3551 UMat::UMat(Size _sz, int _type, UMatUsageFlags _usageFlags)
3552 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3554 create( _sz.height, _sz.width, _type );
3558 UMat::UMat(Size _sz, int _type, const Scalar& _s, UMatUsageFlags _usageFlags)
3559 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3561 create(_sz.height, _sz.width, _type);
3566 UMat::UMat(int _dims, const int* _sz, int _type, UMatUsageFlags _usageFlags)
3567 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3569 create(_dims, _sz, _type);
3573 UMat::UMat(int _dims, const int* _sz, int _type, const Scalar& _s, UMatUsageFlags _usageFlags)
3574 : flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), usageFlags(_usageFlags), u(0), offset(0), size(&rows)
3576 create(_dims, _sz, _type);
3581 UMat::UMat(const UMat& m)
3582 : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), allocator(m.allocator),
3583 usageFlags(m.usageFlags), u(m.u), offset(m.offset), size(&rows)
3588 step[0] = m.step[0]; step[1] = m.step[1];
3598 template<typename _Tp> inline
3599 UMat::UMat(const std::vector<_Tp>& vec, bool copyData)
3600 : flags(MAGIC_VAL | traits::Type<_Tp>::value | CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()),
3601 cols(1), allocator(0), usageFlags(USAGE_DEFAULT), u(0), offset(0), size(&rows)
3608 CV_Error(Error::StsNotImplemented, "");
3611 Mat((int)vec.size(), 1, traits::Type<_Tp>::value, (uchar*)&vec[0]).copyTo(*this);
3615 UMat& UMat::operator = (const UMat& m)
3619 const_cast<UMat&>(m).addref();
3622 if( dims <= 2 && m.dims <= 2 )
3627 step[0] = m.step[0];
3628 step[1] = m.step[1];
3632 allocator = m.allocator;
3633 if (usageFlags == USAGE_DEFAULT)
3634 usageFlags = m.usageFlags;
3642 UMat UMat::row(int y) const
3644 return UMat(*this, Range(y, y + 1), Range::all());
3648 UMat UMat::col(int x) const
3650 return UMat(*this, Range::all(), Range(x, x + 1));
3654 UMat UMat::rowRange(int startrow, int endrow) const
3656 return UMat(*this, Range(startrow, endrow), Range::all());
3660 UMat UMat::rowRange(const Range& r) const
3662 return UMat(*this, r, Range::all());
3666 UMat UMat::colRange(int startcol, int endcol) const
3668 return UMat(*this, Range::all(), Range(startcol, endcol));
3672 UMat UMat::colRange(const Range& r) const
3674 return UMat(*this, Range::all(), r);
3678 UMat UMat::clone() const
3686 void UMat::assignTo( UMat& m, int _type ) const
3691 convertTo(m, _type);
3695 void UMat::create(int _rows, int _cols, int _type, UMatUsageFlags _usageFlags)
3698 if( dims <= 2 && rows == _rows && cols == _cols && type() == _type && u )
3700 int sz[] = {_rows, _cols};
3701 create(2, sz, _type, _usageFlags);
3705 void UMat::create(Size _sz, int _type, UMatUsageFlags _usageFlags)
3707 create(_sz.height, _sz.width, _type, _usageFlags);
3714 CV_XADD(&(u->urefcount), 1);
3717 inline void UMat::release()
3719 if( u && CV_XADD(&(u->urefcount), -1) == 1 )
3721 for(int i = 0; i < dims; i++)
3727 UMat UMat::operator()( Range _rowRange, Range _colRange ) const
3729 return UMat(*this, _rowRange, _colRange);
3733 UMat UMat::operator()( const Rect& roi ) const
3735 return UMat(*this, roi);
3739 UMat UMat::operator()(const Range* ranges) const
3741 return UMat(*this, ranges);
3745 UMat UMat::operator()(const std::vector<Range>& ranges) const
3747 return UMat(*this, ranges);
3751 bool UMat::isContinuous() const
3753 return (flags & CONTINUOUS_FLAG) != 0;
3757 bool UMat::isSubmatrix() const
3759 return (flags & SUBMATRIX_FLAG) != 0;
3763 size_t UMat::elemSize() const
3765 size_t res = dims > 0 ? step.p[dims - 1] : 0;
3766 CV_DbgAssert(res != 0);
3771 size_t UMat::elemSize1() const
3773 return CV_ELEM_SIZE1(flags);
3777 int UMat::type() const
3779 return CV_MAT_TYPE(flags);
3783 int UMat::depth() const
3785 return CV_MAT_DEPTH(flags);
3789 int UMat::channels() const
3791 return CV_MAT_CN(flags);
3795 size_t UMat::step1(int i) const
3797 return step.p[i] / elemSize1();
3801 bool UMat::empty() const
3803 return u == 0 || total() == 0 || dims == 0;
3807 size_t UMat::total() const
3810 return (size_t)rows * cols;
3812 for( int i = 0; i < dims; i++ )
3818 UMat::UMat(UMat&& m)
3819 : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), allocator(m.allocator),
3820 usageFlags(m.usageFlags), u(m.u), offset(m.offset), size(&rows)
3822 if (m.dims <= 2) // move new step/size info
3824 step[0] = m.step[0];
3825 step[1] = m.step[1];
3829 CV_DbgAssert(m.step.p != m.step.buf);
3832 m.step.p = m.step.buf;
3835 m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
3842 UMat& UMat::operator = (UMat&& m)
3847 flags = m.flags; dims = m.dims; rows = m.rows; cols = m.cols;
3848 allocator = m.allocator; usageFlags = m.usageFlags;
3851 if (step.p != step.buf) // release self step/size
3857 if (m.dims <= 2) // move new step/size info
3859 step[0] = m.step[0];
3860 step[1] = m.step[1];
3864 CV_DbgAssert(m.step.p != m.step.buf);
3867 m.step.p = m.step.buf;
3870 m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
3878 inline bool UMatData::hostCopyObsolete() const { return (flags & HOST_COPY_OBSOLETE) != 0; }
3879 inline bool UMatData::deviceCopyObsolete() const { return (flags & DEVICE_COPY_OBSOLETE) != 0; }
3880 inline bool UMatData::deviceMemMapped() const { return (flags & DEVICE_MEM_MAPPED) != 0; }
3881 inline bool UMatData::copyOnMap() const { return (flags & COPY_ON_MAP) != 0; }
3882 inline bool UMatData::tempUMat() const { return (flags & TEMP_UMAT) != 0; }
3883 inline bool UMatData::tempCopiedUMat() const { return (flags & TEMP_COPIED_UMAT) == TEMP_COPIED_UMAT; }
3885 inline void UMatData::markDeviceMemMapped(bool flag)
3888 flags |= DEVICE_MEM_MAPPED;
3890 flags &= ~DEVICE_MEM_MAPPED;
3893 inline void UMatData::markHostCopyObsolete(bool flag)
3896 flags |= HOST_COPY_OBSOLETE;
3898 flags &= ~HOST_COPY_OBSOLETE;
3900 inline void UMatData::markDeviceCopyObsolete(bool flag)
3903 flags |= DEVICE_COPY_OBSOLETE;
3905 flags &= ~DEVICE_COPY_OBSOLETE;
3913 #pragma warning( pop )