cxcore.hpp
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:80k
源码类别:

波变换

开发平台:

Visual C++

  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. // Third party copyrights are property of their respective owners.
  16. //
  17. // Redistribution and use in source and binary forms, with or without modification,
  18. // are permitted provided that the following conditions are met:
  19. //
  20. //   * Redistribution's of source code must retain the above copyright notice,
  21. //     this list of conditions and the following disclaimer.
  22. //
  23. //   * Redistribution's in binary form must reproduce the above copyright notice,
  24. //     this list of conditions and the following disclaimer in the documentation
  25. //     and/or other materials provided with the distribution.
  26. //
  27. //   * The name of the copyright holders may not be used to endorse or promote products
  28. //     derived from this software without specific prior written permission.
  29. //
  30. // This software is provided by the copyright holders and contributors "as is" and
  31. // any express or implied warranties, including, but not limited to, the implied
  32. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  33. // In no event shall the Intel Corporation or contributors be liable for any direct,
  34. // indirect, incidental, special, exemplary, or consequential damages
  35. // (including, but not limited to, procurement of substitute goods or services;
  36. // loss of use, data, or profits; or business interruption) however caused
  37. // and on any theory of liability, whether in contract, strict liability,
  38. // or tort (including negligence or otherwise) arising in any way out of
  39. // the use of this software, even if advised of the possibility of such damage.
  40. //
  41. //M*/
  42. #ifndef _CXCORE_HPP_
  43. #define _CXCORE_HPP_
  44. #include "cxmisc.h"
  45. #ifdef __cplusplus
  46. #ifndef SKIP_INCLUDES
  47. #include <algorithm>
  48. #include <cmath>
  49. #include <complex>
  50. #include <map>
  51. #include <new>
  52. #include <string>
  53. #include <vector>
  54. #endif // SKIP_INCLUDES
  55. namespace cv {
  56. #undef min
  57. #undef max    
  58. using std::vector;
  59. using std::string;
  60.     
  61. template<typename _Tp> class CV_EXPORTS Size_;
  62. template<typename _Tp> class CV_EXPORTS Point_;
  63. template<typename _Tp> class CV_EXPORTS Rect_;
  64. typedef std::string String;
  65. typedef std::basic_string<wchar_t> WString;
  66. CV_EXPORTS string fromUtf16(const WString& str);
  67. CV_EXPORTS WString toUtf16(const string& str);
  68. class CV_EXPORTS Exception
  69. {
  70. public:
  71.     Exception() { code = 0; line = 0; }
  72.     Exception(int _code, const string& _err, const string& _func, const string& _file, int _line)
  73.         : code(_code), err(_err), func(_func), file(_file), line(_line) {}
  74.     Exception(const Exception& exc)
  75.         : code(exc.code), err(exc.err), func(exc.func), file(exc.file), line(exc.line) {}
  76.     Exception& operator = (const Exception& exc)
  77.     {
  78.         if( this != &exc )
  79.         {
  80.             code = exc.code; err = exc.err; func = exc.func; file = exc.file; line = exc.line;
  81.         }
  82.         return *this;
  83.     }
  84.     int code;
  85.     string err;
  86.     string func;
  87.     string file;
  88.     int line;
  89. };
  90. CV_EXPORTS string format( const char* fmt, ... );
  91. CV_EXPORTS void error( const Exception& exc );
  92. CV_EXPORTS bool setBreakOnError(bool value);
  93. CV_EXPORTS CvErrorCallback redirectError( CvErrorCallback errCallback,
  94.                                           void* userdata=0, void** prevUserdata=0);
  95.     
  96. #ifdef __GNUC__
  97. #define CV_Error( code, msg ) cv::error( cv::Exception(code, msg, __func__, __FILE__, __LINE__) )
  98. #define CV_Error_( code, args ) cv::error( cv::Exception(code, cv::format args, __func__, __FILE__, __LINE__) )
  99. #define CV_Assert( expr ) { if(!(expr)) cv::error( cv::Exception(CV_StsAssert, #expr, __func__, __FILE__, __LINE__) ); }
  100. #else
  101. #define CV_Error( code, msg ) cv::error( cv::Exception(code, msg, "", __FILE__, __LINE__) )
  102. #define CV_Error_( code, args ) cv::error( cv::Exception(code, cv::format args, "", __FILE__, __LINE__) )
  103. #define CV_Assert( expr ) { if(!(expr)) cv::error( cv::Exception(CV_StsAssert, #expr, "", __FILE__, __LINE__) ); }
  104. #endif
  105.     
  106. #ifdef _DEBUG
  107. #define CV_DbgAssert(expr) CV_Assert(expr)
  108. #else
  109. #define CV_DbgAssert(expr)
  110. #endif
  111. CV_EXPORTS void setNumThreads(int);
  112. CV_EXPORTS int getNumThreads();
  113. CV_EXPORTS int getThreadNum();
  114. CV_EXPORTS int64 getTickCount();
  115. CV_EXPORTS double getTickFrequency();
  116. CV_EXPORTS void* fastMalloc(size_t);
  117. CV_EXPORTS void fastFree(void* ptr);
  118. template<typename _Tp> static inline _Tp* allocate(size_t n)
  119. {
  120.     _Tp* ptr = (_Tp*)fastMalloc(n*sizeof(ptr[0]));
  121.     ::new(ptr) _Tp[n];
  122.     return ptr;
  123. }
  124. template<typename _Tp> static inline void deallocate(_Tp* ptr, size_t n)
  125. {
  126.     for( size_t i = 0; i < n; i++ ) (ptr+i)->~_Tp();
  127.     fastFree(ptr);
  128. }
  129. template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
  130. {
  131.     return (_Tp*)(((size_t)ptr + n-1) & -n);
  132. }
  133. static inline size_t alignSize(size_t sz, int n)
  134. {
  135.     return (sz + n-1) & -n;
  136. }
  137. CV_EXPORTS void setUseOptimized(bool);
  138. CV_EXPORTS bool useOptimized();
  139. template<typename _Tp> class CV_EXPORTS Allocator
  140. {
  141. public: 
  142.     typedef _Tp value_type;
  143.     typedef value_type* pointer;
  144.     typedef const value_type* const_pointer;
  145.     typedef value_type& reference;
  146.     typedef const value_type& const_reference;
  147.     typedef size_t size_type;
  148.     typedef ptrdiff_t difference_type;
  149.     template<typename U> class rebind { typedef Allocator<U> other; };
  150.     explicit Allocator() {}
  151.     ~Allocator() {}
  152.     explicit Allocator(Allocator const&) {}
  153.     template<typename U>
  154.     explicit Allocator(Allocator<U> const&) {}
  155.     // address
  156.     pointer address(reference r) { return &r; }
  157.     const_pointer address(const_reference r) { return &r; }
  158.     pointer allocate(size_type count, const void* =0)
  159.     { return reinterpret_cast<pointer>(fastMalloc(count * sizeof (_Tp))); }
  160.     void deallocate(pointer p, size_type) {fastFree(p); }
  161.     size_type max_size() const
  162.     { return max(static_cast<_Tp>(-1)/sizeof(_Tp), 1); }
  163.     void construct(pointer p, const _Tp& v) { new(static_cast<void*>(p)) _Tp(v); }
  164.     void destroy(pointer p) { p->~_Tp(); }
  165. };
  166. /////////////////////// Vec (used as element of multi-channel images ///////////////////// 
  167. template<typename _Tp> class CV_EXPORTS DataDepth { public: enum { value = -1, fmt=(int)'' }; };
  168. template<> class DataDepth<bool> { public: enum { value = CV_8U, fmt=(int)'u' }; };
  169. template<> class DataDepth<uchar> { public: enum { value = CV_8U, fmt=(int)'u' }; };
  170. template<> class DataDepth<schar> { public: enum { value = CV_8S, fmt=(int)'c' }; };
  171. template<> class DataDepth<ushort> { public: enum { value = CV_16U, fmt=(int)'w' }; };
  172. template<> class DataDepth<short> { public: enum { value = CV_16S, fmt=(int)'s' }; };
  173. template<> class DataDepth<int> { public: enum { value = CV_32S, fmt=(int)'i' }; };
  174. template<> class DataDepth<float> { public: enum { value = CV_32F, fmt=(int)'f' }; };
  175. template<> class DataDepth<double> { public: enum { value = CV_64F, fmt=(int)'d' }; };
  176. template<typename _Tp> class DataDepth<_Tp*> { public: enum { value = CV_USRTYPE1, fmt=(int)'r' }; };
  177. template<typename _Tp, int cn> class CV_EXPORTS Vec
  178. {
  179. public:
  180.     typedef _Tp value_type;
  181.     enum { depth = DataDepth<_Tp>::value, channels = cn, type = CV_MAKETYPE(depth, channels) };
  182.     
  183.     Vec();
  184.     Vec(_Tp v0);
  185.     Vec(_Tp v0, _Tp v1);
  186.     Vec(_Tp v0, _Tp v1, _Tp v2);
  187.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3);
  188.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4);
  189.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5);
  190.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6);
  191.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7);
  192.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8);
  193.     Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9);
  194.     Vec(const Vec<_Tp, cn>& v);
  195.     static Vec all(_Tp alpha);
  196.     _Tp dot(const Vec& v) const;
  197.     double ddot(const Vec& v) const;
  198.     Vec cross(const Vec& v) const;
  199.     template<typename T2> operator Vec<T2, cn>() const;
  200.     operator CvScalar() const;
  201.     _Tp operator [](int i) const;
  202.     _Tp& operator[](int i);
  203.     _Tp val[cn];
  204. };
  205. typedef Vec<uchar, 2> Vec2b;
  206. typedef Vec<uchar, 3> Vec3b;
  207. typedef Vec<uchar, 4> Vec4b;
  208. typedef Vec<short, 2> Vec2s;
  209. typedef Vec<short, 3> Vec3s;
  210. typedef Vec<short, 4> Vec4s;
  211. typedef Vec<ushort, 2> Vec2w;
  212. typedef Vec<ushort, 3> Vec3w;
  213. typedef Vec<ushort, 4> Vec4w;    
  214.     
  215. typedef Vec<int, 2> Vec2i;
  216. typedef Vec<int, 3> Vec3i;
  217. typedef Vec<int, 4> Vec4i;
  218. typedef Vec<float, 2> Vec2f;
  219. typedef Vec<float, 3> Vec3f;
  220. typedef Vec<float, 4> Vec4f;
  221. typedef Vec<float, 6> Vec6f;
  222. typedef Vec<double, 2> Vec2d;
  223. typedef Vec<double, 3> Vec3d;
  224. typedef Vec<double, 4> Vec4d;
  225. typedef Vec<double, 6> Vec6d;
  226. //////////////////////////////// Complex //////////////////////////////
  227. template<typename _Tp> class CV_EXPORTS Complex
  228. {
  229. public:
  230.     Complex();
  231.     Complex( _Tp _re, _Tp _im=0 );
  232.     Complex( const std::complex<_Tp>& c );
  233.     template<typename T2> operator Complex<T2>() const;
  234.     Complex conj() const;
  235.     operator std::complex<_Tp>() const;
  236.     _Tp re, im;
  237. };
  238. typedef Complex<float> Complexf;
  239. typedef Complex<double> Complexd;
  240. //////////////////////////////// Point_ ////////////////////////////////
  241. template<typename _Tp> class CV_EXPORTS Point_
  242. {
  243. public:
  244.     typedef _Tp value_type;
  245.     
  246.     Point_();
  247.     Point_(_Tp _x, _Tp _y);
  248.     Point_(const Point_& pt);
  249.     Point_(const CvPoint& pt);
  250.     Point_(const CvPoint2D32f& pt);
  251.     Point_(const Size_<_Tp>& sz);
  252.     Point_(const Vec<_Tp, 2>& v);
  253.     Point_& operator = (const Point_& pt);
  254.     template<typename _Tp2> operator Point_<_Tp2>() const;
  255.     operator CvPoint() const;
  256.     operator CvPoint2D32f() const;
  257.     operator Vec<_Tp, 2>() const;
  258.     _Tp dot(const Point_& pt) const;
  259.     double ddot(const Point_& pt) const;
  260.     bool inside(const Rect_<_Tp>& r) const;
  261.     
  262.     _Tp x, y;
  263. };
  264. template<typename _Tp> class CV_EXPORTS Point3_
  265. {
  266. public:
  267.     typedef _Tp value_type;
  268.     
  269.     Point3_();
  270.     Point3_(_Tp _x, _Tp _y, _Tp _z);
  271.     Point3_(const Point3_& pt);
  272. explicit Point3_(const Point_<_Tp>& pt);
  273.     Point3_(const CvPoint3D32f& pt);
  274.     Point3_(const Vec<_Tp, 3>& v);
  275.     Point3_& operator = (const Point3_& pt);
  276.     template<typename _Tp2> operator Point3_<_Tp2>() const;
  277.     operator CvPoint3D32f() const;
  278.     operator Vec<_Tp, 3>() const;
  279.     _Tp dot(const Point3_& pt) const;
  280.     double ddot(const Point3_& pt) const;
  281.     
  282.     _Tp x, y, z;
  283. };
  284. //////////////////////////////// Size_ ////////////////////////////////
  285. template<typename _Tp> class CV_EXPORTS Size_
  286. {
  287. public:
  288.     typedef _Tp value_type;
  289.     
  290.     Size_();
  291.     Size_(_Tp _width, _Tp _height);
  292.     Size_(const Size_& sz);
  293.     Size_(const CvSize& sz);
  294.     Size_(const CvSize2D32f& sz);
  295.     Size_(const Point_<_Tp>& pt);
  296.     Size_& operator = (const Size_& sz);
  297.     _Tp area() const;
  298.     template<typename _Tp2> operator Size_<_Tp2>() const;
  299.     operator CvSize() const;
  300.     operator CvSize2D32f() const;
  301.     _Tp width, height;
  302. };
  303. //////////////////////////////// Rect_ ////////////////////////////////
  304. template<typename _Tp> class CV_EXPORTS Rect_
  305. {
  306. public:
  307.     typedef _Tp value_type;
  308.     
  309.     Rect_();
  310.     Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
  311.     Rect_(const Rect_& r);
  312.     Rect_(const CvRect& r);
  313.     Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
  314.     Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);
  315.     Rect_& operator = ( const Rect_& r );
  316.     Point_<_Tp> tl() const;
  317.     Point_<_Tp> br() const;
  318.     
  319.     Size_<_Tp> size() const;
  320.     _Tp area() const;
  321.     template<typename _Tp2> operator Rect_<_Tp2>() const;
  322.     operator CvRect() const;
  323.     bool contains(const Point_<_Tp>& pt) const;
  324.     _Tp x, y, width, height;
  325. };
  326. typedef Point_<int> Point2i;
  327. typedef Point2i Point;
  328. typedef Size_<int> Size2i;
  329. typedef Size2i Size;
  330. typedef Rect_<int> Rect;
  331. typedef Point_<float> Point2f;
  332. typedef Point_<double> Point2d;
  333. typedef Size_<float> Size2f;
  334. typedef Point3_<int> Point3i;
  335. typedef Point3_<float> Point3f;
  336. typedef Point3_<double> Point3d;
  337. class CV_EXPORTS RotatedRect
  338. {
  339. public:
  340.     RotatedRect();
  341.     RotatedRect(const Point2f& _center, const Size2f& _size, float _angle);
  342.     RotatedRect(const CvBox2D& box);
  343.     void points(Point2f pts[]) const;
  344.     Rect boundingRect() const;
  345.     operator CvBox2D() const;
  346.     Point2f center;
  347.     Size2f size;
  348.     float angle;
  349. };
  350. //////////////////////////////// Scalar_ ///////////////////////////////
  351. template<typename _Tp> class CV_EXPORTS Scalar_ : public Vec<_Tp, 4>
  352. {
  353. public:
  354.     Scalar_();
  355.     Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);
  356.     Scalar_(const CvScalar& s);
  357.     Scalar_(_Tp v0);
  358.     static Scalar_<_Tp> all(_Tp v0);
  359.     operator CvScalar() const;
  360.     template<typename T2> operator Scalar_<T2>() const;
  361.     Scalar_<_Tp> mul(const Scalar_<_Tp>& t, double scale=1 ) const;
  362.     template<typename T2> void convertTo(T2* buf, int channels, int unroll_to=0) const;
  363. };
  364. typedef Scalar_<double> Scalar;
  365. //////////////////////////////// Range /////////////////////////////////
  366. class CV_EXPORTS Range
  367. {
  368. public:
  369.     Range();
  370.     Range(int _start, int _end);
  371.     Range(const CvSlice& slice);
  372.     int size() const;
  373.     bool empty() const;
  374.     static Range all();
  375.     operator CvSlice() const;
  376.     int start, end;
  377. };
  378. /////////////////////////////// DataType ////////////////////////////////
  379. template<typename _Tp> class DataType
  380. {
  381. public:
  382.     typedef _Tp value_type;
  383.     typedef value_type work_type;
  384.     typedef value_type channel_type;
  385.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  386.            fmt=DataDepth<channel_type>::fmt,
  387.            type = CV_MAKETYPE(depth, channels) };
  388. };
  389. template<> class DataType<bool>
  390. {
  391. public:
  392.     typedef bool value_type;
  393.     typedef int work_type;
  394.     typedef value_type channel_type;
  395.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  396.            fmt=DataDepth<channel_type>::fmt,
  397.            type = CV_MAKETYPE(depth, channels) };
  398. };
  399. template<> class DataType<uchar>
  400. {
  401. public:
  402.     typedef uchar value_type;
  403.     typedef int work_type;
  404.     typedef value_type channel_type;
  405.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  406.            fmt=DataDepth<channel_type>::fmt,
  407.            type = CV_MAKETYPE(depth, channels) };
  408. };
  409. template<> class DataType<schar>
  410. {
  411. public:
  412.     typedef schar value_type;
  413.     typedef int work_type;
  414.     typedef value_type channel_type;
  415.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  416.            fmt=DataDepth<channel_type>::fmt,
  417.            type = CV_MAKETYPE(depth, channels) };
  418. };
  419. template<> class DataType<ushort>
  420. {
  421. public:
  422.     typedef ushort value_type;
  423.     typedef int work_type;
  424.     typedef value_type channel_type;
  425.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  426.            fmt=DataDepth<channel_type>::fmt,
  427.            type = CV_MAKETYPE(depth, channels) };
  428. };
  429. template<> class DataType<short>
  430. {
  431. public:
  432.     typedef short value_type;
  433.     typedef int work_type;
  434.     typedef value_type channel_type;
  435.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  436.            fmt=DataDepth<channel_type>::fmt,
  437.            type = CV_MAKETYPE(depth, channels) };
  438. };
  439. template<> class DataType<int>
  440. {
  441. public:
  442.     typedef int value_type;
  443.     typedef value_type work_type;
  444.     typedef value_type channel_type;
  445.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  446.            fmt=DataDepth<channel_type>::fmt,
  447.            type = CV_MAKETYPE(depth, channels) };
  448. };
  449. template<> class DataType<float>
  450. {
  451. public:
  452.     typedef float value_type;
  453.     typedef value_type work_type;
  454.     typedef value_type channel_type;
  455.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  456.            fmt=DataDepth<channel_type>::fmt,
  457.            type = CV_MAKETYPE(depth, channels) };
  458. };
  459. template<> class DataType<double>
  460. {
  461. public:
  462.     typedef double value_type;
  463.     typedef value_type work_type;
  464.     typedef value_type channel_type;
  465.     enum { depth = DataDepth<channel_type>::value, channels = 1,
  466.            fmt=DataDepth<channel_type>::fmt,
  467.            type = CV_MAKETYPE(depth, channels) };
  468. };
  469. template<typename _Tp, int cn> class DataType<Vec<_Tp, cn> >
  470. {
  471. public:
  472.     typedef Vec<_Tp, cn> value_type;
  473.     typedef Vec<typename DataType<_Tp>::work_type, cn> work_type;
  474.     typedef _Tp channel_type;
  475.     enum { depth = DataDepth<channel_type>::value, channels = cn,
  476.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  477.            type = CV_MAKETYPE(depth, channels) };
  478. };
  479. template<typename _Tp> class DataType<std::complex<_Tp> >
  480. {
  481. public:
  482.     typedef std::complex<_Tp> value_type;
  483.     typedef value_type work_type;
  484.     typedef _Tp channel_type;
  485.     enum { depth = DataDepth<channel_type>::value, channels = 2,
  486.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  487.            type = CV_MAKETYPE(depth, channels) };
  488. };
  489. template<typename _Tp> class DataType<Complex<_Tp> >
  490. {
  491. public:
  492.     typedef Complex<_Tp> value_type;
  493.     typedef value_type work_type;
  494.     typedef _Tp channel_type;
  495.     enum { depth = DataDepth<channel_type>::value, channels = 2,
  496.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  497.            type = CV_MAKETYPE(depth, channels) };
  498. };
  499. template<typename _Tp> class DataType<Point_<_Tp> >
  500. {
  501. public:
  502.     typedef Point_<_Tp> value_type;
  503.     typedef Point_<typename DataType<_Tp>::work_type> work_type;
  504.     typedef _Tp channel_type;
  505.     enum { depth = DataDepth<channel_type>::value, channels = 2,
  506.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  507.            type = CV_MAKETYPE(depth, channels) };
  508. };
  509. template<typename _Tp> class DataType<Point3_<_Tp> >
  510. {
  511. public:
  512.     typedef Point3_<_Tp> value_type;
  513.     typedef Point3_<typename DataType<_Tp>::work_type> work_type;
  514.     typedef _Tp channel_type;
  515.     enum { depth = DataDepth<channel_type>::value, channels = 3,
  516.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  517.            type = CV_MAKETYPE(depth, channels) };
  518. };
  519. template<typename _Tp> class DataType<Size_<_Tp> >
  520. {
  521. public:
  522.     typedef Size_<_Tp> value_type;
  523.     typedef Size_<typename DataType<_Tp>::work_type> work_type;
  524.     typedef _Tp channel_type;
  525.     enum { depth = DataDepth<channel_type>::value, channels = 2,
  526.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  527.            type = CV_MAKETYPE(depth, channels) };
  528. };
  529. template<typename _Tp> class DataType<Rect_<_Tp> >
  530. {
  531. public:
  532.     typedef Rect_<_Tp> value_type;
  533.     typedef Rect_<typename DataType<_Tp>::work_type> work_type;
  534.     typedef _Tp channel_type;
  535.     enum { depth = DataDepth<channel_type>::value, channels = 4,
  536.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  537.            type = CV_MAKETYPE(depth, channels) };
  538. };
  539. template<typename _Tp> class DataType<Scalar_<_Tp> >
  540. {
  541. public:
  542.     typedef Scalar_<_Tp> value_type;
  543.     typedef Scalar_<typename DataType<_Tp>::work_type> work_type;
  544.     typedef _Tp channel_type;
  545.     enum { depth = DataDepth<channel_type>::value, channels = 4,
  546.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  547.            type = CV_MAKETYPE(depth, channels) };
  548. };
  549. template<> class DataType<Range>
  550. {
  551. public:
  552.     typedef Range value_type;
  553.     typedef value_type work_type;
  554.     typedef int channel_type;
  555.     enum { depth = DataDepth<channel_type>::value, channels = 2,
  556.            fmt = ((channels-1)<<8) + DataDepth<channel_type>::fmt,
  557.            type = CV_MAKETYPE(depth, channels) };
  558. };
  559.     
  560. //////////////////// Generic ref-counting pointer class for C/C++ objects ////////////////////////
  561. template<typename _Tp> class CV_EXPORTS Ptr
  562. {
  563. public:
  564.     Ptr();
  565.     Ptr(_Tp* _obj);
  566.     ~Ptr();
  567.     Ptr(const Ptr& ptr);
  568.     Ptr& operator = (const Ptr& ptr);
  569.     void addref();
  570.     void release();
  571.     void delete_obj();
  572.     bool empty() const;
  573.     _Tp* operator -> ();
  574.     const _Tp* operator -> () const;
  575.     operator _Tp* ();
  576.     operator const _Tp*() const;
  577. protected:
  578.     _Tp* obj;
  579.     int* refcount;
  580. };
  581. //////////////////////////////// Mat ////////////////////////////////
  582. class Mat;
  583. template<typename M> class CV_EXPORTS MatExpr_Base_;
  584. typedef MatExpr_Base_<Mat> MatExpr_Base;
  585. template<typename E, typename M> class MatExpr_;
  586. template<typename A1, typename M, typename Op> class MatExpr_Op1_;
  587. template<typename A1, typename A2, typename M, typename Op> class MatExpr_Op2_;
  588. template<typename A1, typename A2, typename A3, typename M, typename Op> class MatExpr_Op3_;
  589. template<typename A1, typename A2, typename A3, typename A4,
  590.         typename M, typename Op> class MatExpr_Op4_;
  591. template<typename A1, typename A2, typename A3, typename A4,
  592.         typename A5, typename M, typename Op> class MatExpr_Op5_;
  593. template<typename M> class CV_EXPORTS MatOp_DivRS_;
  594. template<typename M> class CV_EXPORTS MatOp_Inv_;
  595. template<typename M> class CV_EXPORTS MatOp_MulDiv_;
  596. template<typename M> class CV_EXPORTS MatOp_Repeat_;
  597. template<typename M> class CV_EXPORTS MatOp_Set_;
  598. template<typename M> class CV_EXPORTS MatOp_Scale_;
  599. template<typename M> class CV_EXPORTS MatOp_T_;
  600. typedef MatExpr_<MatExpr_Op4_<Size, int, Scalar,
  601.     int, Mat, MatOp_Set_<Mat> >, Mat> MatExpr_Initializer;
  602. template<typename _Tp> class MatIterator_;
  603. template<typename _Tp> class MatConstIterator_;
  604. enum { MAGIC_MASK=0xFFFF0000, TYPE_MASK=0x00000FFF, DEPTH_MASK=7 };
  605. static inline size_t getElemSize(int type) { return CV_ELEM_SIZE(type); }
  606. // matrix decomposition types
  607. enum { DECOMP_LU=0, DECOMP_SVD=1, DECOMP_EIG=2, DECOMP_CHOLESKY=3, DECOMP_QR=4, DECOMP_NORMAL=16 };
  608. enum { NORM_INF=1, NORM_L1=2, NORM_L2=4, NORM_TYPE_MASK=7, NORM_RELATIVE=8, NORM_MINMAX=32};
  609. enum { CMP_EQ=0, CMP_GT=1, CMP_GE=2, CMP_LT=3, CMP_LE=4, CMP_NE=5 };
  610. enum { GEMM_1_T=1, GEMM_2_T=2, GEMM_3_T=4 };
  611. enum { DFT_INVERSE=1, DFT_SCALE=2, DFT_ROWS=4, DFT_COMPLEX_OUTPUT=16, DFT_REAL_OUTPUT=32,
  612.     DCT_INVERSE = DFT_INVERSE, DCT_ROWS=DFT_ROWS };
  613. class CV_EXPORTS Mat
  614. {
  615. public:
  616.     // constructors
  617.     Mat();
  618.     // constructs matrix of the specified size and type
  619.     // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
  620.     Mat(int _rows, int _cols, int _type);
  621.     Mat(Size _size, int _type);
  622.     // constucts matrix and fills it with the specified value _s.
  623.     Mat(int _rows, int _cols, int _type, const Scalar& _s);
  624.     Mat(Size _size, int _type, const Scalar& _s);
  625.     // copy constructor
  626.     Mat(const Mat& m);
  627.     // constructor for matrix headers pointing to user-allocated data
  628.     Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP);
  629.     Mat(Size _size, int _type, void* _data, size_t _step=AUTO_STEP);
  630.     // creates a matrix header for a part of the bigger matrix
  631.     Mat(const Mat& m, const Range& rowRange, const Range& colRange);
  632.     Mat(const Mat& m, const Rect& roi);
  633.     // converts old-style CvMat to the new matrix; the data is not copied by default
  634.     Mat(const CvMat* m, bool copyData=false);
  635.     // converts old-style IplImage to the new matrix; the data is not copied by default
  636.     Mat(const IplImage* img, bool copyData=false);
  637.     // builds matrix from std::vector with or without copying the data
  638.     template<typename _Tp> Mat(const vector<_Tp>& vec, bool copyData=false);
  639.     // helper constructor to compile matrix expressions
  640.     Mat(const MatExpr_Base& expr);
  641.     // destructor - calls release()
  642.     ~Mat();
  643.     // assignment operators
  644.     Mat& operator = (const Mat& m);
  645.     Mat& operator = (const MatExpr_Base& expr);
  646.     operator MatExpr_<Mat, Mat>() const;
  647.     // returns a new matrix header for the specified row
  648.     Mat row(int y) const;
  649.     // returns a new matrix header for the specified column
  650.     Mat col(int x) const;
  651.     // ... for the specified row span
  652.     Mat rowRange(int startrow, int endrow) const;
  653.     Mat rowRange(const Range& r) const;
  654.     // ... for the specified column span
  655.     Mat colRange(int startcol, int endcol) const;
  656.     Mat colRange(const Range& r) const;
  657.     // ... for the specified diagonal
  658.     // (d=0 - the main diagonal,
  659.     //  >0 - a diagonal from the lower half,
  660.     //  <0 - a diagonal from the upper half)
  661.     Mat diag(int d=0) const;
  662.     // constructs a square diagonal matrix which main diagonal is vector "d"
  663.     static Mat diag(const Mat& d);
  664.     // returns deep copy of the matrix, i.e. the data is copied
  665.     Mat clone() const;
  666.     // copies the matrix content to "m".
  667.     // It calls m.create(this->size(), this->type()).
  668.     void copyTo( Mat& m ) const;
  669.     // copies those matrix elements to "m" that are marked with non-zero mask elements.
  670.     void copyTo( Mat& m, const Mat& mask ) const;
  671.     // converts matrix to another datatype with optional scalng. See cvConvertScale.
  672.     void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const;
  673.     void assignTo( Mat& m, int type=-1 ) const;
  674.     // sets every matrix element to s
  675.     Mat& operator = (const Scalar& s);
  676.     // sets some of the matrix elements to s, according to the mask
  677.     Mat& setTo(const Scalar& s, const Mat& mask=Mat());
  678.     // creates alternative matrix header for the same data, with different
  679.     // number of channels and/or different number of rows. see cvReshape.
  680.     Mat reshape(int _cn, int _rows=0) const;
  681.     // matrix transposition by means of matrix expressions
  682.     MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_T_<Mat> >, Mat>
  683.     t() const;
  684.     // matrix inversion by means of matrix expressions
  685.     MatExpr_<MatExpr_Op2_<Mat, int, Mat, MatOp_Inv_<Mat> >, Mat>
  686.         inv(int method=DECOMP_LU) const;
  687.     MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  688.     // per-element matrix multiplication by means of matrix expressions
  689.     mul(const Mat& m, double scale=1) const;
  690.     MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>
  691.     mul(const MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_Scale_<Mat> >, Mat>& m, double scale=1) const;
  692.     MatExpr_<MatExpr_Op4_<Mat, Mat, double, char, Mat, MatOp_MulDiv_<Mat> >, Mat>    
  693.     mul(const MatExpr_<MatExpr_Op2_<Mat, double, Mat, MatOp_DivRS_<Mat> >, Mat>& m, double scale=1) const;
  694.     
  695.     // computes cross-product of 2 3D vectors
  696.     Mat cross(const Mat& m) const;
  697.     // computes dot-product
  698.     double dot(const Mat& m) const;
  699.     // Matlab-style matrix initialization
  700.     static MatExpr_Initializer zeros(int rows, int cols, int type);
  701.     static MatExpr_Initializer zeros(Size size, int type);
  702.     static MatExpr_Initializer ones(int rows, int cols, int type);
  703.     static MatExpr_Initializer ones(Size size, int type);
  704.     static MatExpr_Initializer eye(int rows, int cols, int type);
  705.     static MatExpr_Initializer eye(Size size, int type);
  706.     // allocates new matrix data unless the matrix already has specified size and type.
  707.     // previous data is unreferenced if needed.
  708.     void create(int _rows, int _cols, int _type);
  709.     void create(Size _size, int _type);
  710.     // increases the reference counter; use with care to avoid memleaks
  711.     void addref();
  712.     // decreases reference counter;
  713.     // deallocate the data when reference counter reaches 0.
  714.     void release();
  715.     // locates matrix header within a parent matrix. See below
  716.     void locateROI( Size& wholeSize, Point& ofs ) const;
  717.     // moves/resizes the current matrix ROI inside the parent matrix.
  718.     Mat& adjustROI( int dtop, int dbottom, int dleft, int dright );
  719.     // extracts a rectangular sub-matrix
  720.     // (this is a generalized form of row, rowRange etc.)
  721.     Mat operator()( Range rowRange, Range colRange ) const;
  722.     Mat operator()( const Rect& roi ) const;
  723.     // converts header to CvMat; no data is copied
  724.     operator CvMat() const;
  725.     // converts header to IplImage; no data is copied
  726.     operator IplImage() const;
  727.     
  728.     // returns true iff the matrix data is continuous
  729.     // (i.e. when there are no gaps between successive rows).
  730.     // similar to CV_IS_MAT_CONT(cvmat->type)
  731.     bool isContinuous() const;
  732.     // returns element size in bytes,
  733.     // similar to CV_ELEM_SIZE(cvmat->type)
  734.     size_t elemSize() const;
  735.     // returns the size of element channel in bytes.
  736.     size_t elemSize1() const;
  737.     // returns element type, similar to CV_MAT_TYPE(cvmat->type)
  738.     int type() const;
  739.     // returns element type, similar to CV_MAT_DEPTH(cvmat->type)
  740.     int depth() const;
  741.     // returns element type, similar to CV_MAT_CN(cvmat->type)
  742.     int channels() const;
  743.     // returns step/elemSize1()
  744.     size_t step1() const;
  745.     // returns matrix size:
  746.     // width == number of columns, height == number of rows
  747.     Size size() const;
  748.     // returns true if matrix data is NULL
  749.     bool empty() const;
  750.     // returns pointer to y-th row
  751.     uchar* ptr(int y=0);
  752.     const uchar* ptr(int y=0) const;
  753.     // template version of the above method
  754.     template<typename _Tp> _Tp* ptr(int y=0);
  755.     template<typename _Tp> const _Tp* ptr(int y=0) const;
  756.     
  757.     // template methods for read-write or read-only element access.
  758.     // note that _Tp must match the actual matrix type -
  759.     // the functions do not do any on-fly type conversion
  760.     template<typename _Tp> _Tp& at(int y, int x);
  761.     template<typename _Tp> _Tp& at(Point pt);
  762.     template<typename _Tp> const _Tp& at(int y, int x) const;
  763.     template<typename _Tp> const _Tp& at(Point pt) const;
  764.     
  765.     // template methods for iteration over matrix elements.
  766.     // the iterators take care of skipping gaps in the end of rows (if any)
  767.     template<typename _Tp> MatIterator_<_Tp> begin();
  768.     template<typename _Tp> MatIterator_<_Tp> end();
  769.     template<typename _Tp> MatConstIterator_<_Tp> begin() const;
  770.     template<typename _Tp> MatConstIterator_<_Tp> end() const;
  771.     enum { MAGIC_VAL=0x42FF0000, AUTO_STEP=0, CONTINUOUS_FLAG=CV_MAT_CONT_FLAG };
  772.     // includes several bit-fields:
  773.     //  * the magic signature
  774.     //  * continuity flag
  775.     //  * depth
  776.     //  * number of channels
  777.     int flags;
  778.     // the number of rows and columns
  779.     int rows, cols;
  780.     // a distance between successive rows in bytes; includes the gap if any
  781.     size_t step;
  782.     // pointer to the data
  783.     uchar* data;
  784.     // pointer to the reference counter;
  785.     // when matrix points to user-allocated data, the pointer is NULL
  786.     int* refcount;
  787.     
  788.     // helper fields used in locateROI and adjustROI
  789.     uchar* datastart;
  790.     uchar* dataend;
  791. };
  792. // Multiply-with-Carry RNG
  793. class CV_EXPORTS RNG
  794. {
  795. public:
  796.     enum { A=4164903690U, UNIFORM=0, NORMAL=1 };
  797.     RNG();
  798.     RNG(uint64 _state);
  799.     unsigned next();
  800.     operator uchar();
  801.     operator schar();
  802.     operator ushort();
  803.     operator short();
  804.     operator unsigned();
  805.     operator int();
  806.     operator float();
  807.     operator double();
  808.     int uniform(int a, int b);
  809.     float uniform(float a, float b);
  810.     double uniform(double a, double b);
  811.     void fill( Mat& mat, int distType, const Scalar& a, const Scalar& b );
  812.     uint64 state;
  813. };
  814. class CV_EXPORTS TermCriteria
  815. {
  816. public:
  817.     enum { COUNT=1, MAX_ITER=COUNT, EPS=2 };
  818.     TermCriteria();
  819.     TermCriteria(int _type, int _maxCount, double _epsilon);
  820.     TermCriteria(const CvTermCriteria& criteria);
  821.     operator CvTermCriteria() const;
  822.     
  823.     int type;
  824.     int maxCount;
  825.     double epsilon;
  826. };
  827. CV_EXPORTS Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode=0);
  828. CV_EXPORTS void extractImageCOI(const CvArr* arr, Mat& coiimg, int coi=-1);
  829. CV_EXPORTS void insertImageCOI(const Mat& coiimg, CvArr* arr, int coi=-1);
  830. CV_EXPORTS void add(const Mat& a, const Mat& b, Mat& c, const Mat& mask);
  831. CV_EXPORTS void subtract(const Mat& a, const Mat& b, Mat& c, const Mat& mask);
  832. CV_EXPORTS void add(const Mat& a, const Mat& b, Mat& c);
  833. CV_EXPORTS void subtract(const Mat& a, const Mat& b, Mat& c);
  834. CV_EXPORTS void add(const Mat& a, const Scalar& s, Mat& c, const Mat& mask=Mat());
  835. CV_EXPORTS void subtract(const Mat& a, const Scalar& s, Mat& c, const Mat& mask=Mat());
  836. CV_EXPORTS void multiply(const Mat& a, const Mat& b, Mat& c, double scale=1);
  837. CV_EXPORTS void divide(const Mat& a, const Mat& b, Mat& c, double scale=1);
  838. CV_EXPORTS void divide(double scale, const Mat& b, Mat& c);
  839. CV_EXPORTS void subtract(const Scalar& s, const Mat& a, Mat& c, const Mat& mask=Mat());
  840. CV_EXPORTS void scaleAdd(const Mat& a, double alpha, const Mat& b, Mat& c);
  841. CV_EXPORTS void addWeighted(const Mat& a, double alpha, const Mat& b,
  842.                             double beta, double gamma, Mat& c);
  843. CV_EXPORTS void convertScaleAbs(const Mat& a, Mat& c, double alpha=1, double beta=0);
  844. CV_EXPORTS void LUT(const Mat& a, const Mat& lut, Mat& b);
  845. CV_EXPORTS Scalar sum(const Mat& m);
  846. CV_EXPORTS int countNonZero( const Mat& m );
  847. CV_EXPORTS Scalar mean(const Mat& m);
  848. CV_EXPORTS Scalar mean(const Mat& m, const Mat& mask);
  849. CV_EXPORTS void meanStdDev(const Mat& m, Scalar& mean, Scalar& stddev, const Mat& mask=Mat());
  850. CV_EXPORTS double norm(const Mat& a, int normType=NORM_L2);
  851. CV_EXPORTS double norm(const Mat& a, const Mat& b, int normType=NORM_L2);
  852. CV_EXPORTS double norm(const Mat& a, int normType, const Mat& mask);
  853. CV_EXPORTS double norm(const Mat& a, const Mat& b,
  854.                        int normType, const Mat& mask);
  855. CV_EXPORTS void normalize( const Mat& a, Mat& b, double alpha=1, double beta=0,
  856.                           int norm_type=NORM_L2, int rtype=-1, const Mat& mask=Mat());
  857. CV_EXPORTS void minMaxLoc(const Mat& a, double* minVal,
  858.                           double* maxVal=0, Point* minLoc=0,
  859.                           Point* maxLoc=0, const Mat& mask=Mat());
  860. CV_EXPORTS void reduce(const Mat& m, Mat& dst, int dim, int rtype, int dtype=-1);
  861. CV_EXPORTS void merge(const Mat* mv, size_t count, Mat& dst);
  862. CV_EXPORTS void split(const Mat& m, Mat* mvbegin);
  863. CV_EXPORTS void mixChannels(const Mat* src, int nsrcs, Mat* dst, int ndsts,
  864.                             const int* fromTo, size_t npairs);
  865. CV_EXPORTS void flip(const Mat& a, Mat& b, int flipCode);
  866. CV_EXPORTS void repeat(const Mat& a, int ny, int nx, Mat& b);
  867. static inline Mat repeat(const Mat& src, int ny, int nx)
  868. {
  869.     if( nx == 1 && ny == 1 ) return src;
  870.     Mat dst; repeat(src, ny, nx, dst); return dst;
  871. }
  872. CV_EXPORTS void bitwise_and(const Mat& a, const Mat& b, Mat& c, const Mat& mask=Mat());
  873. CV_EXPORTS void bitwise_or(const Mat& a, const Mat& b, Mat& c, const Mat& mask=Mat());
  874. CV_EXPORTS void bitwise_xor(const Mat& a, const Mat& b, Mat& c, const Mat& mask=Mat());
  875. CV_EXPORTS void bitwise_and(const Mat& a, const Scalar& s, Mat& c, const Mat& mask=Mat());
  876. CV_EXPORTS void bitwise_or(const Mat& a, const Scalar& s, Mat& c, const Mat& mask=Mat());
  877. CV_EXPORTS void bitwise_xor(const Mat& a, const Scalar& s, Mat& c, const Mat& mask=Mat());
  878. CV_EXPORTS void bitwise_not(const Mat& a, Mat& c);
  879. CV_EXPORTS void absdiff(const Mat& a, const Mat& b, Mat& c);
  880. CV_EXPORTS void absdiff(const Mat& a, const Scalar& s, Mat& c);
  881. CV_EXPORTS void inRange(const Mat& src, const Mat& lowerb,
  882.                         const Mat& upperb, Mat& dst);
  883. CV_EXPORTS void inRange(const Mat& src, const Scalar& lowerb,
  884.                         const Scalar& upperb, Mat& dst);
  885. CV_EXPORTS void compare(const Mat& a, const Mat& b, Mat& c, int cmpop);
  886. CV_EXPORTS void compare(const Mat& a, double s, Mat& c, int cmpop);
  887. CV_EXPORTS void min(const Mat& a, const Mat& b, Mat& c);
  888. CV_EXPORTS void min(const Mat& a, double alpha, Mat& c);
  889. CV_EXPORTS void max(const Mat& a, const Mat& b, Mat& c);
  890. CV_EXPORTS void max(const Mat& a, double alpha, Mat& c);
  891. CV_EXPORTS void sqrt(const Mat& a, Mat& b);
  892. CV_EXPORTS void pow(const Mat& a, double power, Mat& b);
  893. CV_EXPORTS void exp(const Mat& a, Mat& b);
  894. CV_EXPORTS void log(const Mat& a, Mat& b);
  895. CV_EXPORTS float cubeRoot(float val);
  896. CV_EXPORTS float fastAtan2(float y, float x);
  897. CV_EXPORTS void polarToCart(const Mat& magnitude, const Mat& angle,
  898.                             Mat& x, Mat& y, bool angleInDegrees=false);
  899. CV_EXPORTS void cartToPolar(const Mat& x, const Mat& y,
  900.                             Mat& magnitude, Mat& angle,
  901.                             bool angleInDegrees=false);
  902. CV_EXPORTS void phase(const Mat& x, const Mat& y, Mat& angle,
  903.                             bool angleInDegrees=false);
  904. CV_EXPORTS void magnitude(const Mat& x, const Mat& y, Mat& magnitude);
  905. CV_EXPORTS bool checkRange(const Mat& a, bool quiet=true, Point* pt=0,
  906.                            double minVal=-DBL_MAX, double maxVal=DBL_MAX);
  907. CV_EXPORTS void gemm(const Mat& a, const Mat& b, double alpha,
  908.                      const Mat& c, double gamma, Mat& d, int flags=0);
  909. CV_EXPORTS void mulTransposed( const Mat& a, Mat& c, bool aTa,
  910.                                const Mat& delta=Mat(),
  911.                                double scale=1, int rtype=-1 );
  912. CV_EXPORTS void transpose(const Mat& a, Mat& b);
  913. CV_EXPORTS void transform(const Mat& src, Mat& dst, const Mat& m );
  914. CV_EXPORTS void perspectiveTransform(const Mat& src, Mat& dst, const Mat& m );
  915. CV_EXPORTS void completeSymm(Mat& a, bool lowerToUpper=false);
  916. CV_EXPORTS void setIdentity(Mat& c, const Scalar& s=Scalar(1));
  917. CV_EXPORTS double determinant(const Mat& m);
  918. CV_EXPORTS Scalar trace(const Mat& m);
  919. CV_EXPORTS double invert(const Mat& a, Mat& c, int flags=DECOMP_LU);
  920. CV_EXPORTS bool solve(const Mat& a, const Mat& b, Mat& x, int flags=DECOMP_LU);
  921. CV_EXPORTS void sort(const Mat& a, Mat& b, int flags);
  922. CV_EXPORTS void sortIdx(const Mat& a, Mat& b, int flags);
  923. CV_EXPORTS void solveCubic(const Mat& coeffs, Mat& roots);
  924. CV_EXPORTS void solvePoly(const Mat& coeffs, Mat& roots, int maxIters=20, int fig=100);
  925. CV_EXPORTS bool eigen(const Mat& a, Mat& eigenvalues, int lowindex=-1,
  926.                       int highindex=-1);
  927. CV_EXPORTS bool eigen(const Mat& a, Mat& eigenvalues, Mat& eigenvectors,
  928.                       int lowindex=-1, int highindex=-1);
  929. //CV_EXPORTS bool selectedeigen(const Mat& a, Mat& eigenvalues, int lowindex,
  930. //                              int highindex);
  931. //CV_EXPORTS bool selectedeigen(const Mat& a, Mat& eigenvalues,
  932. //                              Mat& eigenvectors, int lowindex, int highindex);
  933. CV_EXPORTS void calcCovarMatrix( const Mat* samples, int nsamples,
  934.                                  Mat& covar, Mat& mean,
  935.                                  int flags, int ctype=CV_64F);
  936. CV_EXPORTS void calcCovarMatrix( const Mat& samples, Mat& covar, Mat& mean,
  937.                                  int flags, int ctype=CV_64F);
  938. class CV_EXPORTS PCA
  939. {
  940. public:
  941.     PCA();
  942.     PCA(const Mat& data, const Mat& mean, int flags, int maxComponents=0);
  943.     PCA& operator()(const Mat& data, const Mat& mean, int flags, int maxComponents=0);
  944.     Mat project(const Mat& vec) const;
  945.     void project(const Mat& vec, Mat& result) const;
  946.     Mat backProject(const Mat& vec) const;
  947.     void backProject(const Mat& vec, Mat& result) const;
  948.     Mat eigenvectors;
  949.     Mat eigenvalues;
  950.     Mat mean;
  951. };
  952. class CV_EXPORTS SVD
  953. {
  954. public:
  955.     enum { MODIFY_A=1, NO_UV=2, FULL_UV=4 };
  956.     SVD();
  957.     SVD( const Mat& m, int flags=0 );
  958.     SVD& operator ()( const Mat& m, int flags=0 );
  959.     static void solveZ( const Mat& m, Mat& dst );
  960.     void backSubst( const Mat& rhs, Mat& dst ) const;
  961.     Mat u, w, vt;
  962. };
  963. CV_EXPORTS double Mahalanobis(const Mat& v1, const Mat& v2, const Mat& icovar);
  964. static inline double Mahalonobis(const Mat& v1, const Mat& v2, const Mat& icovar)
  965. { return Mahalanobis(v1, v2, icovar); }
  966. CV_EXPORTS void dft(const Mat& src, Mat& dst, int flags=0, int nonzeroRows=0);
  967. CV_EXPORTS void idft(const Mat& src, Mat& dst, int flags=0, int nonzeroRows=0);
  968. CV_EXPORTS void dct(const Mat& src, Mat& dst, int flags=0);
  969. CV_EXPORTS void idct(const Mat& src, Mat& dst, int flags=0);
  970. CV_EXPORTS void mulSpectrums(const Mat& a, const Mat& b, Mat& c,
  971.                              int flags, bool conjB=false);
  972. CV_EXPORTS int getOptimalDFTSize(int vecsize);
  973. enum { KMEANS_RANDOM_CENTERS=0, KMEANS_PP_CENTERS=2, KMEANS_USE_INITIAL_LABELS=1 };
  974. CV_EXPORTS double kmeans( const Mat& data, int K, Mat& best_labels,
  975.                           TermCriteria criteria, int attempts,
  976.                           int flags, Mat* centers );
  977. CV_EXPORTS RNG& theRNG();
  978. template<typename _Tp> static inline _Tp randu() { return (_Tp)theRNG(); }
  979. static inline void randu(Mat& dst, const Scalar& low, const Scalar& high)
  980. { theRNG().fill(dst, RNG::UNIFORM, low, high); }
  981. static inline void randn(Mat& dst, const Scalar& mean, const Scalar& stddev)
  982. { theRNG().fill(dst, RNG::NORMAL, mean, stddev); }
  983. CV_EXPORTS void randShuffle(Mat& dst, double iterFactor=1., RNG* rng=0);
  984. CV_EXPORTS void line(Mat& img, Point pt1, Point pt2, const Scalar& color,
  985.                      int thickness=1, int lineType=8, int shift=0);
  986. CV_EXPORTS void rectangle(Mat& img, Point pt1, Point pt2,
  987.                           const Scalar& color, int thickness=1,
  988.                           int lineType=8, int shift=0);
  989. CV_EXPORTS void circle(Mat& img, Point center, int radius,
  990.                        const Scalar& color, int thickness=1,
  991.                        int lineType=8, int shift=0);
  992. CV_EXPORTS void ellipse(Mat& img, Point center, Size axes,
  993.                         double angle, double startAngle, double endAngle,
  994.                         const Scalar& color, int thickness=1,
  995.                         int lineType=8, int shift=0);
  996. CV_EXPORTS void ellipse(Mat& img, const RotatedRect& box, const Scalar& color,
  997.                         int thickness=1, int lineType=8);
  998. CV_EXPORTS void fillConvexPoly(Mat& img, const Point* pts, int npts,
  999.                                const Scalar& color, int lineType=8,
  1000.                                int shift=0);
  1001. CV_EXPORTS void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours,
  1002.                          const Scalar& color, int lineType=8, int shift=0,
  1003.                          Point offset=Point() );
  1004. CV_EXPORTS void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed,
  1005.                           const Scalar& color, int thickness=1, int lineType=8, int shift=0 );
  1006. CV_EXPORTS bool clipLine(Size imgSize, Point& pt1, Point& pt2);
  1007. CV_EXPORTS bool clipLine(Rect img_rect, Point& pt1, Point& pt2);
  1008. class CV_EXPORTS LineIterator
  1009. {
  1010. public:
  1011.     LineIterator(const Mat& img, Point pt1, Point pt2,
  1012.                  int connectivity=8, bool leftToRight=false);
  1013.     uchar* operator *();
  1014.     LineIterator& operator ++();
  1015.     LineIterator operator ++(int);
  1016.     uchar* ptr;
  1017.     int err, count;
  1018.     int minusDelta, plusDelta;
  1019.     int minusStep, plusStep;
  1020. };
  1021. CV_EXPORTS void ellipse2Poly( Point center, Size axes, int angle,
  1022.                               int arcStart, int arcEnd, int delta, vector<Point>& pts );
  1023. enum
  1024. {
  1025.     FONT_HERSHEY_SIMPLEX = 0,
  1026.     FONT_HERSHEY_PLAIN = 1,
  1027.     FONT_HERSHEY_DUPLEX = 2,
  1028.     FONT_HERSHEY_COMPLEX = 3,
  1029.     FONT_HERSHEY_TRIPLEX = 4,
  1030.     FONT_HERSHEY_COMPLEX_SMALL = 5,
  1031.     FONT_HERSHEY_SCRIPT_SIMPLEX = 6,
  1032.     FONT_HERSHEY_SCRIPT_COMPLEX = 7,
  1033.     FONT_ITALIC = 16
  1034. };
  1035. CV_EXPORTS void putText( Mat& img, const string& text, Point org,
  1036.                          int fontFace, double fontScale, Scalar color,
  1037.                          int thickness=1, int linetype=8,
  1038.                          bool bottomLeftOrigin=false );
  1039. CV_EXPORTS Size getTextSize(const string& text, int fontFace,
  1040.                             double fontScale, int thickness,
  1041.                             int* baseLine);
  1042. ///////////////////////////////// Mat_<_Tp> ////////////////////////////////////
  1043. template<typename _Tp> class CV_EXPORTS Mat_ : public Mat
  1044. {
  1045. public:
  1046.     typedef _Tp value_type;
  1047.     typedef typename DataType<_Tp>::channel_type channel_type;
  1048.     typedef MatIterator_<_Tp> iterator;
  1049.     typedef MatConstIterator_<_Tp> const_iterator;
  1050.     
  1051.     Mat_();
  1052.     // equivalent to Mat(_rows, _cols, DataType<_Tp>::type)
  1053.     Mat_(int _rows, int _cols);
  1054.     // other forms of the above constructor
  1055.     Mat_(int _rows, int _cols, const _Tp& value);
  1056.     explicit Mat_(Size _size);
  1057.     Mat_(Size _size, const _Tp& value);
  1058.     // copy/conversion contructor. If m is of different type, it's converted
  1059.     Mat_(const Mat& m);
  1060.     // copy constructor
  1061.     Mat_(const Mat_& m);
  1062.     // construct a matrix on top of user-allocated data.
  1063.     // step is in bytes(!!!), regardless of the type
  1064.     Mat_(int _rows, int _cols, _Tp* _data, size_t _step=AUTO_STEP);
  1065.     // minor selection
  1066.     Mat_(const Mat_& m, const Range& rowRange, const Range& colRange);
  1067.     Mat_(const Mat_& m, const Rect& roi);
  1068.     // to support complex matrix expressions
  1069.     Mat_(const MatExpr_Base& expr);
  1070.     // makes a matrix out of Vec or std::vector. The matrix will have a single column
  1071.     template<int n> explicit Mat_(const Vec<_Tp, n>& vec);
  1072.     Mat_(const vector<_Tp>& vec, bool copyData=false);
  1073.     Mat_& operator = (const Mat& m);
  1074.     Mat_& operator = (const Mat_& m);
  1075.     // set all the elements to s.
  1076.     Mat_& operator = (const _Tp& s);
  1077.     // iterators; they are smart enough to skip gaps in the end of rows
  1078.     iterator begin();
  1079.     iterator end();
  1080.     const_iterator begin() const;
  1081.     const_iterator end() const;
  1082.     // equivalent to Mat::create(_rows, _cols, DataType<_Tp>::type)
  1083.     void create(int _rows, int _cols);
  1084.     void create(Size _size);
  1085.     // cross-product
  1086.     Mat_ cross(const Mat_& m) const;
  1087.     // to support complex matrix expressions
  1088.     Mat_& operator = (const MatExpr_Base& expr);
  1089.     // data type conversion
  1090.     template<typename T2> operator Mat_<T2>() const;
  1091.     // overridden forms of Mat::row() etc.
  1092.     Mat_ row(int y) const;
  1093.     Mat_ col(int x) const;
  1094.     Mat_ diag(int d=0) const;
  1095.     Mat_ clone() const;
  1096.     // transposition, inversion, per-element multiplication
  1097.     MatExpr_<MatExpr_Op2_<Mat_, double, Mat_, MatOp_T_<Mat> >, Mat_> t() const;
  1098.     MatExpr_<MatExpr_Op2_<Mat_, int, Mat_, MatOp_Inv_<Mat> >, Mat_> inv(int method=DECOMP_LU) const;
  1099.     MatExpr_<MatExpr_Op4_<Mat_, Mat_, double, char, Mat_, MatOp_MulDiv_<Mat> >, Mat_>
  1100.     mul(const Mat_& m, double scale=1) const;
  1101.     MatExpr_<MatExpr_Op4_<Mat_, Mat_, double, char, Mat_, MatOp_MulDiv_<Mat> >, Mat_>
  1102.     mul(const MatExpr_<MatExpr_Op2_<Mat_, double, Mat_,
  1103.         MatOp_Scale_<Mat> >, Mat_>& m, double scale=1) const;
  1104.     MatExpr_<MatExpr_Op4_<Mat_, Mat_, double, char, Mat_, MatOp_MulDiv_<Mat> >, Mat_>    
  1105.     mul(const MatExpr_<MatExpr_Op2_<Mat_, double, Mat_,
  1106.         MatOp_DivRS_<Mat> >, Mat_>& m, double scale=1) const;
  1107.     // overridden forms of Mat::elemSize() etc.
  1108.     size_t elemSize() const;
  1109.     size_t elemSize1() const;
  1110.     int type() const;
  1111.     int depth() const;
  1112.     int channels() const;
  1113.     size_t step1() const;
  1114.     // returns step()/sizeof(_Tp)
  1115.     size_t stepT() const;
  1116.     // overridden forms of Mat::zeros() etc. Data type is omitted, of course
  1117.     static MatExpr_Initializer zeros(int rows, int cols);
  1118.     static MatExpr_Initializer zeros(Size size);
  1119.     static MatExpr_Initializer ones(int rows, int cols);
  1120.     static MatExpr_Initializer ones(Size size);
  1121.     static MatExpr_Initializer eye(int rows, int cols);
  1122.     static MatExpr_Initializer eye(Size size);
  1123.     // some more overriden methods
  1124.     Mat_ reshape(int _rows) const;
  1125.     Mat_& adjustROI( int dtop, int dbottom, int dleft, int dright );
  1126.     Mat_ operator()( const Range& rowRange, const Range& colRange ) const;
  1127.     Mat_ operator()( const Rect& roi ) const;
  1128.     // more convenient forms of row and element access operators 
  1129.     _Tp* operator [](int y);
  1130.     const _Tp* operator [](int y) const;
  1131.     _Tp& operator ()(int row, int col);
  1132.     const _Tp& operator ()(int row, int col) const;
  1133.     _Tp& operator ()(Point pt);
  1134.     const _Tp& operator ()(Point pt) const;
  1135.     // to support matrix expressions
  1136.     operator MatExpr_<Mat_, Mat_>() const;
  1137.     
  1138.     // conversion to vector.
  1139.     operator vector<_Tp>() const;
  1140. };
  1141. //////////// Iterators & Comma initializers //////////////////
  1142. template<typename _Tp>
  1143. class CV_EXPORTS MatConstIterator_
  1144. {
  1145. public:
  1146.     typedef _Tp value_type;
  1147.     typedef int difference_type;
  1148.     MatConstIterator_();
  1149.     MatConstIterator_(const Mat_<_Tp>* _m);
  1150.     MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col=0);
  1151.     MatConstIterator_(const Mat_<_Tp>* _m, Point _pt);
  1152.     MatConstIterator_(const MatConstIterator_& it);
  1153.     MatConstIterator_& operator = (const MatConstIterator_& it );
  1154.     _Tp operator *() const;
  1155.     _Tp operator [](int i) const;
  1156.     
  1157.     MatConstIterator_& operator += (int ofs);
  1158.     MatConstIterator_& operator -= (int ofs);
  1159.     MatConstIterator_& operator --();
  1160.     MatConstIterator_ operator --(int);
  1161.     MatConstIterator_& operator ++();
  1162.     MatConstIterator_ operator ++(int);
  1163.     Point pos() const;
  1164.     const Mat_<_Tp>* m;
  1165.     _Tp* ptr;
  1166.     _Tp* sliceEnd;
  1167. };
  1168. template<typename _Tp>
  1169. class CV_EXPORTS MatIterator_ : public MatConstIterator_<_Tp>
  1170. {
  1171. public:
  1172.     typedef _Tp* pointer;
  1173.     typedef _Tp& reference;
  1174.     typedef std::random_access_iterator_tag iterator_category;
  1175.     MatIterator_();
  1176.     MatIterator_(Mat_<_Tp>* _m);
  1177.     MatIterator_(Mat_<_Tp>* _m, int _row, int _col=0);
  1178.     MatIterator_(const Mat_<_Tp>* _m, Point _pt);
  1179.     MatIterator_(const MatIterator_& it);
  1180.     MatIterator_& operator = (const MatIterator_<_Tp>& it );
  1181.     _Tp& operator *() const;
  1182.     _Tp& operator [](int i) const;
  1183.     MatIterator_& operator += (int ofs);
  1184.     MatIterator_& operator -= (int ofs);
  1185.     MatIterator_& operator --();
  1186.     MatIterator_ operator --(int);
  1187.     MatIterator_& operator ++();
  1188.     MatIterator_ operator ++(int);
  1189. };
  1190. template<typename _Tp> class CV_EXPORTS MatOp_Iter_;
  1191. template<typename _Tp> class CV_EXPORTS MatCommaInitializer_ :
  1192.     public MatExpr_<MatExpr_Op1_<MatIterator_<_Tp>, Mat_<_Tp>, MatOp_Iter_<_Tp> >, Mat_<_Tp> >
  1193. {
  1194. public:
  1195.     MatCommaInitializer_(Mat_<_Tp>* _m);
  1196.     template<typename T2> MatCommaInitializer_<_Tp>& operator , (T2 v);
  1197.     operator Mat_<_Tp>() const;
  1198.     Mat_<_Tp> operator *() const;
  1199.     void assignTo(Mat& m, int type=-1) const;
  1200. };
  1201. #if 0
  1202. template<typename _Tp> class VectorCommaInitializer_
  1203. {
  1204. public:
  1205.     VectorCommaInitializer_(vector<_Tp>* _vec);
  1206.     template<typename T2> VectorCommaInitializer_<_Tp>& operator , (T2 val);
  1207.     operator vector<_Tp>() const;
  1208.     vector<_Tp> operator *() const;
  1209.     vector<_Tp>* vec;
  1210.     int idx;
  1211. };
  1212. #endif
  1213. template<typename _Tp, size_t fixed_size=4096/sizeof(_Tp)+8> class CV_EXPORTS AutoBuffer
  1214. {
  1215. public:
  1216.     typedef _Tp value_type;
  1217.     AutoBuffer();
  1218.     AutoBuffer(size_t _size);
  1219.     ~AutoBuffer();
  1220.     void allocate(size_t _size);
  1221.     void deallocate();
  1222.     operator _Tp* ();
  1223.     operator const _Tp* () const;
  1224. protected:
  1225.     _Tp* ptr;
  1226.     size_t size;
  1227.     _Tp buf[fixed_size];
  1228. };
  1229. /////////////////////////// multi-dimensional dense matrix //////////////////////////
  1230. class MatND;
  1231. class SparseMat;
  1232. class CV_EXPORTS MatND
  1233. {
  1234. public:
  1235.     // default constructor
  1236.     MatND();
  1237.     // constructs array with specific size and data type
  1238.     MatND(int _ndims, const int* _sizes, int _type);
  1239.     // constructs array and fills it with the specified value
  1240.     MatND(int _ndims, const int* _sizes, int _type, const Scalar& _s);
  1241.     // copy constructor. only the header is copied.
  1242.     MatND(const MatND& m);
  1243.     // sub-array selection. only the header is copied
  1244.     MatND(const MatND& m, const Range* ranges);
  1245.     // converts old-style nd array to MatND; optionally, copies the data
  1246.     MatND(const CvMatND* m, bool copyData=false);
  1247.     ~MatND();
  1248.     MatND& operator = (const MatND& m);
  1249.     
  1250.     void assignTo( MatND& m, int type ) const;
  1251.     // creates a complete copy of the matrix (all the data is copied)
  1252.     MatND clone() const;
  1253.     // sub-array selection; only the header is copied
  1254.     MatND operator()(const Range* ranges) const;
  1255.     // copies the data to another matrix.
  1256.     // Calls m.create(this->size(), this->type()) prior to
  1257.     // copying the data
  1258.     void copyTo( MatND& m ) const;
  1259.     // copies only the selected elements to another matrix.
  1260.     void copyTo( MatND& m, const MatND& mask ) const;
  1261.     // converts data to the specified data type.
  1262.     // calls m.create(this->size(), rtype) prior to the conversion
  1263.     void convertTo( MatND& m, int rtype, double alpha=1, double beta=0 ) const;
  1264.     
  1265.     // assigns "s" to each array element. 
  1266.     MatND& operator = (const Scalar& s);
  1267.     // assigns "s" to the selected elements of array
  1268.     // (or to all the elements if mask==MatND())
  1269.     MatND& setTo(const Scalar& s, const MatND& mask=MatND());
  1270.     // modifies geometry of array without copying the data
  1271.     MatND reshape(int _newcn, int _newndims=0, const int* _newsz=0) const;
  1272.     // allocates a new buffer for the data unless the current one already
  1273.     // has the specified size and type.
  1274.     void create(int _ndims, const int* _sizes, int _type);
  1275.     // manually increment reference counter (use with care !!!)
  1276.     void addref();
  1277.     // decrements the reference counter. Dealloctes the data when
  1278.     // the reference counter reaches zero.
  1279.     void release();
  1280.     // converts the matrix to 2D Mat or to the old-style CvMatND.
  1281.     // In either case the data is not copied.
  1282.     operator Mat() const;
  1283.     operator CvMatND() const;
  1284.     // returns true if the array data is stored continuously 
  1285.     bool isContinuous() const;
  1286.     // returns size of each element in bytes
  1287.     size_t elemSize() const;
  1288.     // returns size of each element channel in bytes
  1289.     size_t elemSize1() const;
  1290.     // returns OpenCV data type id (CV_8UC1, ... CV_64FC4,...)
  1291.     int type() const;
  1292.     // returns depth (CV_8U ... CV_64F)
  1293.     int depth() const;
  1294.     // returns the number of channels
  1295.     int channels() const;
  1296.     // step1() ~ step()/elemSize1()
  1297.     size_t step1(int i) const;
  1298.     // return pointer to the element (versions for 1D, 2D, 3D and generic nD cases)
  1299.     uchar* ptr(int i0);
  1300.     const uchar* ptr(int i0) const;
  1301.     uchar* ptr(int i0, int i1);
  1302.     const uchar* ptr(int i0, int i1) const;
  1303.     uchar* ptr(int i0, int i1, int i2);
  1304.     const uchar* ptr(int i0, int i1, int i2) const;
  1305.     uchar* ptr(const int* idx);
  1306.     const uchar* ptr(const int* idx) const;
  1307.     // convenient template methods for element access.
  1308.     // note that _Tp must match the actual matrix type -
  1309.     // the functions do not do any on-fly type conversion
  1310.     template<typename _Tp> _Tp& at(int i0);
  1311.     template<typename _Tp> const _Tp& at(int i0) const;
  1312.     template<typename _Tp> _Tp& at(int i0, int i1);
  1313.     template<typename _Tp> const _Tp& at(int i0, int i1) const;
  1314.     template<typename _Tp> _Tp& at(int i0, int i1, int i2);
  1315.     template<typename _Tp> const _Tp& at(int i0, int i1, int i2) const;
  1316.     template<typename _Tp> _Tp& at(const int* idx);
  1317.     template<typename _Tp> const _Tp& at(const int* idx) const;
  1318.     enum { MAGIC_VAL=0x42FE0000, AUTO_STEP=-1,
  1319.         CONTINUOUS_FLAG=CV_MAT_CONT_FLAG, MAX_DIM=CV_MAX_DIM };
  1320.     // combines data type, continuity flag, signature (magic value) 
  1321.     int flags;
  1322.     // the array dimensionality
  1323.     int dims;
  1324.     // data reference counter
  1325.     int* refcount;
  1326.     // pointer to the data
  1327.     uchar* data;
  1328.     // and its actual beginning and end
  1329.     uchar* datastart;
  1330.     uchar* dataend;
  1331.     // step and size for each dimension, MAX_DIM at max
  1332.     int size[MAX_DIM];
  1333.     size_t step[MAX_DIM];
  1334. };
  1335. class CV_EXPORTS NAryMatNDIterator
  1336. {
  1337. public:
  1338.     NAryMatNDIterator();
  1339.     NAryMatNDIterator(const MatND* arrays, size_t count);
  1340.     NAryMatNDIterator(const MatND** arrays, size_t count);
  1341.     NAryMatNDIterator(const MatND& m1);
  1342.     NAryMatNDIterator(const MatND& m1, const MatND& m2);
  1343.     NAryMatNDIterator(const MatND& m1, const MatND& m2, const MatND& m3);
  1344.     NAryMatNDIterator(const MatND& m1, const MatND& m2, const MatND& m3, const MatND& m4);
  1345.     NAryMatNDIterator(const MatND& m1, const MatND& m2, const MatND& m3,
  1346.                       const MatND& m4, const MatND& m5);
  1347.     NAryMatNDIterator(const MatND& m1, const MatND& m2, const MatND& m3,
  1348.                       const MatND& m4, const MatND& m5, const MatND& m6);
  1349.     
  1350.     void init(const MatND** arrays, size_t count);
  1351.     NAryMatNDIterator& operator ++();
  1352.     NAryMatNDIterator operator ++(int);
  1353.     
  1354.     vector<MatND> arrays;
  1355.     vector<Mat> planes;
  1356.     int nplanes;
  1357. protected:
  1358.     int iterdepth, idx;
  1359. };
  1360. CV_EXPORTS void add(const MatND& a, const MatND& b, MatND& c, const MatND& mask);
  1361. CV_EXPORTS void subtract(const MatND& a, const MatND& b, MatND& c, const MatND& mask);
  1362. CV_EXPORTS void add(const MatND& a, const MatND& b, MatND& c);
  1363. CV_EXPORTS void subtract(const MatND& a, const MatND& b, MatND& c);
  1364. CV_EXPORTS void add(const MatND& a, const Scalar& s, MatND& c, const MatND& mask=MatND());
  1365. CV_EXPORTS void multiply(const MatND& a, const MatND& b, MatND& c, double scale=1);
  1366. CV_EXPORTS void divide(const MatND& a, const MatND& b, MatND& c, double scale=1);
  1367. CV_EXPORTS void divide(double scale, const MatND& b, MatND& c);
  1368. CV_EXPORTS void subtract(const Scalar& s, const MatND& a, MatND& c, const MatND& mask=MatND());
  1369. CV_EXPORTS void scaleAdd(const MatND& a, double alpha, const MatND& b, MatND& c);
  1370. CV_EXPORTS void addWeighted(const MatND& a, double alpha, const MatND& b,
  1371.                             double beta, double gamma, MatND& c);
  1372. CV_EXPORTS Scalar sum(const MatND& m);
  1373. CV_EXPORTS int countNonZero( const MatND& m );
  1374. CV_EXPORTS Scalar mean(const MatND& m);
  1375. CV_EXPORTS Scalar mean(const MatND& m, const MatND& mask);
  1376. CV_EXPORTS void meanStdDev(const MatND& m, Scalar& mean, Scalar& stddev, const MatND& mask=MatND());
  1377. CV_EXPORTS double norm(const MatND& a, int normType=NORM_L2, const MatND& mask=MatND());
  1378. CV_EXPORTS double norm(const MatND& a, const MatND& b,
  1379.                        int normType=NORM_L2, const MatND& mask=MatND());
  1380. CV_EXPORTS void normalize( const MatND& a, MatND& b, double alpha=1, double beta=0,
  1381.                            int norm_type=NORM_L2, int rtype=-1, const MatND& mask=MatND());
  1382. CV_EXPORTS void minMaxLoc(const MatND& a, double* minVal,
  1383.                        double* maxVal, int* minIdx=0, int* maxIdx=0,
  1384.                        const MatND& mask=MatND());
  1385. CV_EXPORTS void merge(const MatND* mvbegin, size_t count, MatND& dst);
  1386. CV_EXPORTS void split(const MatND& m, MatND* mv);
  1387. CV_EXPORTS void mixChannels(const MatND* src, int nsrcs, MatND* dst, int ndsts,
  1388.                             const int* fromTo, size_t npairs);
  1389. CV_EXPORTS void bitwise_and(const MatND& a, const MatND& b, MatND& c, const MatND& mask=MatND());
  1390. CV_EXPORTS void bitwise_or(const MatND& a, const MatND& b, MatND& c, const MatND& mask=MatND());
  1391. CV_EXPORTS void bitwise_xor(const MatND& a, const MatND& b, MatND& c, const MatND& mask=MatND());
  1392. CV_EXPORTS void bitwise_and(const MatND& a, const Scalar& s, MatND& c, const MatND& mask=MatND());
  1393. CV_EXPORTS void bitwise_or(const MatND& a, const Scalar& s, MatND& c, const MatND& mask=MatND());
  1394. CV_EXPORTS void bitwise_xor(const MatND& a, const Scalar& s, MatND& c, const MatND& mask=MatND());
  1395. CV_EXPORTS void bitwise_not(const MatND& a, MatND& c);
  1396. CV_EXPORTS void absdiff(const MatND& a, const MatND& b, MatND& c);
  1397. CV_EXPORTS void absdiff(const MatND& a, const Scalar& s, MatND& c);
  1398. CV_EXPORTS void inRange(const MatND& src, const MatND& lowerb,
  1399.                         const MatND& upperb, MatND& dst);
  1400. CV_EXPORTS void inRange(const MatND& src, const Scalar& lowerb,
  1401.                         const Scalar& upperb, MatND& dst);
  1402. CV_EXPORTS void compare(const MatND& a, const MatND& b, MatND& c, int cmpop);
  1403. CV_EXPORTS void compare(const MatND& a, double s, MatND& c, int cmpop);
  1404. CV_EXPORTS void min(const MatND& a, const MatND& b, MatND& c);
  1405. CV_EXPORTS void min(const MatND& a, double alpha, MatND& c);
  1406. CV_EXPORTS void max(const MatND& a, const MatND& b, MatND& c);
  1407. CV_EXPORTS void max(const MatND& a, double alpha, MatND& c);
  1408. CV_EXPORTS void sqrt(const MatND& a, MatND& b);
  1409. CV_EXPORTS void pow(const MatND& a, double power, MatND& b);
  1410. CV_EXPORTS void exp(const MatND& a, MatND& b);
  1411. CV_EXPORTS void log(const MatND& a, MatND& b);
  1412. CV_EXPORTS bool checkRange(const MatND& a, bool quiet=true, int* idx=0,
  1413.                            double minVal=-DBL_MAX, double maxVal=DBL_MAX);
  1414. typedef void (*ConvertData)(const void* from, void* to, int cn);
  1415. typedef void (*ConvertScaleData)(const void* from, void* to, int cn, double alpha, double beta);
  1416. CV_EXPORTS ConvertData getConvertElem(int fromType, int toType);
  1417. CV_EXPORTS ConvertScaleData getConvertScaleElem(int fromType, int toType);
  1418. template<typename _Tp> class CV_EXPORTS MatND_ : public MatND
  1419. {
  1420. public:
  1421.     typedef _Tp value_type;
  1422.     typedef typename DataType<_Tp>::channel_type channel_type;
  1423.     MatND_();
  1424.     MatND_(int dims, const int* _sizes);
  1425.     MatND_(int dims, const int* _sizes, const _Tp& _s);
  1426.     MatND_(const MatND& m);
  1427.     MatND_(const MatND_& m);
  1428.     MatND_(const MatND_& m, const Range* ranges);
  1429.     MatND_(const CvMatND* m, bool copyData=false);
  1430.     MatND_& operator = (const MatND& m);
  1431.     MatND_& operator = (const MatND_& m);
  1432.     MatND_& operator = (const _Tp& s);
  1433.     void create(int dims, const int* _sizes);
  1434.     template<typename T2> operator MatND_<T2>() const;
  1435.     MatND_ clone() const;
  1436.     MatND_ operator()(const Range* ranges) const;
  1437.     size_t elemSize() const;
  1438.     size_t elemSize1() const;
  1439.     int type() const;
  1440.     int depth() const;
  1441.     int channels() const;
  1442.     size_t stepT(int i) const;
  1443.     size_t step1(int i) const;
  1444.     _Tp& operator ()(const int* idx);
  1445.     const _Tp& operator ()(const int* idx) const;
  1446.     _Tp& operator ()(int idx0);
  1447.     const _Tp& operator ()(int idx0) const;
  1448.     _Tp& operator ()(int idx0, int idx1);
  1449.     const _Tp& operator ()(int idx0, int idx1) const;
  1450.     _Tp& operator ()(int idx0, int idx1, int idx2);
  1451.     const _Tp& operator ()(int idx0, int idx1, int idx2) const;
  1452. };
  1453. /////////////////////////// multi-dimensional sparse matrix //////////////////////////
  1454. class SparseMatIterator;
  1455. class SparseMatConstIterator;
  1456. template<typename _Tp> class SparseMatIterator_;
  1457. template<typename _Tp> class SparseMatConstIterator_;
  1458. class CV_EXPORTS SparseMat
  1459. {
  1460. public:
  1461.     typedef SparseMatIterator iterator;
  1462.     typedef SparseMatConstIterator const_iterator;
  1463.     struct CV_EXPORTS Hdr
  1464.     {
  1465.         Hdr(int _dims, const int* _sizes, int _type);
  1466.         void clear();
  1467.         int refcount;
  1468.         int dims;
  1469.         int valueOffset;
  1470.         size_t nodeSize;
  1471.         size_t nodeCount;
  1472.         size_t freeList;
  1473.         vector<uchar> pool;
  1474.         vector<size_t> hashtab;
  1475.         int size[CV_MAX_DIM];
  1476.     };
  1477.     // sparse matrix node - element of a hash table
  1478.     struct CV_EXPORTS Node
  1479.     {
  1480.         size_t hashval;
  1481.         size_t next;
  1482.         int idx[CV_MAX_DIM];
  1483.     };
  1484.     ////////// constructors and destructor //////////
  1485.     // default constructor
  1486.     SparseMat();
  1487.     // creates matrix of the specified size and type
  1488.     SparseMat(int dims, const int* _sizes, int _type);
  1489.     // copy constructor
  1490.     SparseMat(const SparseMat& m);
  1491.     // converts dense 2d matrix to the sparse form,
  1492.     // if try1d is true and matrix is a single-column matrix (Nx1),
  1493.     // then the sparse matrix will be 1-dimensional.
  1494.     SparseMat(const Mat& m, bool try1d=false);
  1495.     // converts dense n-d matrix to the sparse form
  1496.     SparseMat(const MatND& m);
  1497.     // converts old-style sparse matrix to the new-style.
  1498.     // all the data is copied, so that "m" can be safely
  1499.     // deleted after the conversion
  1500.     SparseMat(const CvSparseMat* m);
  1501.     // destructor
  1502.     ~SparseMat();
  1503.     
  1504.     ///////// assignment operations /////////// 
  1505.     
  1506.     // this is O(1) operation; no data is copied
  1507.     SparseMat& operator = (const SparseMat& m);
  1508.     // (equivalent to the corresponding constructor with try1d=false)
  1509.     SparseMat& operator = (const Mat& m);
  1510.     SparseMat& operator = (const MatND& m);
  1511.     // creates full copy of the matrix
  1512.     SparseMat clone() const;
  1513.     
  1514.     // copy all the data to the destination matrix.
  1515.     // the destination will be reallocated if needed.
  1516.     void copyTo( SparseMat& m ) const;
  1517.     // converts 1D or 2D sparse matrix to dense 2D matrix.
  1518.     // If the sparse matrix is 1D, then the result will
  1519.     // be a single-column matrix.
  1520.     void copyTo( Mat& m ) const;
  1521.     // converts arbitrary sparse matrix to dense matrix.
  1522.     // watch out the memory!
  1523.     void copyTo( MatND& m ) const;
  1524.     // multiplies all the matrix elements by the specified scalar
  1525.     void convertTo( SparseMat& m, int rtype, double alpha=1 ) const;
  1526.     // converts sparse matrix to dense matrix with optional type conversion and scaling.
  1527.     // When rtype=-1, the destination element type will be the same
  1528.     // as the sparse matrix element type.
  1529.     // Otherwise rtype will specify the depth and
  1530.     // the number of channels will remain the same is in the sparse matrix
  1531.     void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const;
  1532.     void convertTo( MatND& m, int rtype, double alpha=1, double beta=0 ) const;
  1533.     // not used now
  1534.     void assignTo( SparseMat& m, int type=-1 ) const;
  1535.     // reallocates sparse matrix. If it was already of the proper size and type,
  1536.     // it is simply cleared with clear(), otherwise,
  1537.     // the old matrix is released (using release()) and the new one is allocated.
  1538.     void create(int dims, const int* _sizes, int _type);
  1539.     // sets all the matrix elements to 0, which means clearing the hash table.
  1540.     void clear();
  1541.     // manually increases reference counter to the header.
  1542.     void addref();
  1543.     // decreses the header reference counter, when it reaches 0,
  1544.     // the header and all the underlying data are deallocated.
  1545.     void release();
  1546.     // converts sparse matrix to the old-style representation.
  1547.     // all the elements are copied.
  1548.     operator CvSparseMat*() const;
  1549.     // size of each element in bytes
  1550.     // (the matrix nodes will be bigger because of
  1551.     //  element indices and other SparseMat::Node elements).
  1552.     size_t elemSize() const;
  1553.     // elemSize()/channels()
  1554.     size_t elemSize1() const;
  1555.     
  1556.     // the same is in Mat and MatND
  1557.     int type() const;
  1558.     int depth() const;
  1559.     int channels() const;
  1560.     
  1561.     // returns the array of sizes and 0 if the matrix is not allocated
  1562.     const int* size() const;
  1563.     // returns i-th size (or 0)
  1564.     int size(int i) const;
  1565.     // returns the matrix dimensionality
  1566.     int dims() const;
  1567.     // returns the number of non-zero elements
  1568.     size_t nzcount() const;
  1569.     
  1570.     // compute element hash value from the element indices:
  1571.     // 1D case
  1572.     size_t hash(int i0) const;
  1573.     // 2D case
  1574.     size_t hash(int i0, int i1) const;
  1575.     // 3D case
  1576.     size_t hash(int i0, int i1, int i2) const;
  1577.     // n-D case
  1578.     size_t hash(const int* idx) const;
  1579.     
  1580.     // low-level element-acccess functions,
  1581.     // special variants for 1D, 2D, 3D cases and the generic one for n-D case.
  1582.     //
  1583.     // return pointer to the matrix element.
  1584.     //  if the element is there (it's non-zero), the pointer to it is returned
  1585.     //  if it's not there and createMissing=false, NULL pointer is returned
  1586.     //  if it's not there and createMissing=true, then the new element
  1587.     //    is created and initialized with 0. Pointer to it is returned
  1588.     //  If the optional hashval pointer is not NULL, the element hash value is
  1589.     //  not computed, but *hashval is taken instead.
  1590.     uchar* ptr(int i0, bool createMissing, size_t* hashval=0);
  1591.     uchar* ptr(int i0, int i1, bool createMissing, size_t* hashval=0);
  1592.     uchar* ptr(int i0, int i1, int i2, bool createMissing, size_t* hashval=0);
  1593.     uchar* ptr(const int* idx, bool createMissing, size_t* hashval=0);
  1594.     // higher-level element access functions:
  1595.     // ref<_Tp>(i0,...[,hashval]) - equivalent to *(_Tp*)ptr(i0,...true[,hashval]).
  1596.     //    always return valid reference to the element.
  1597.     //    If it's did not exist, it is created.
  1598.     // find<_Tp>(i0,...[,hashval]) - equivalent to (_const Tp*)ptr(i0,...false[,hashval]).
  1599.     //    return pointer to the element or NULL pointer if the element is not there.
  1600.     // value<_Tp>(i0,...[,hashval]) - equivalent to
  1601.     //    { const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); }
  1602.     //    that is, 0 is returned when the element is not there.
  1603.     // note that _Tp must match the actual matrix type -
  1604.     // the functions do not do any on-fly type conversion
  1605.     
  1606.     // 1D case
  1607.     template<typename _Tp> _Tp& ref(int i0, size_t* hashval=0);   
  1608.     template<typename _Tp> _Tp value(int i0, size_t* hashval=0) const;
  1609.     template<typename _Tp> const _Tp* find(int i0, size_t* hashval=0) const;
  1610.     // 2D case
  1611.     template<typename _Tp> _Tp& ref(int i0, int i1, size_t* hashval=0);   
  1612.     template<typename _Tp> _Tp value(int i0, int i1, size_t* hashval=0) const;
  1613.     template<typename _Tp> const _Tp* find(int i0, int i1, size_t* hashval=0) const;
  1614.     
  1615.     // 3D case
  1616.     template<typename _Tp> _Tp& ref(int i0, int i1, int i2, size_t* hashval=0);
  1617.     template<typename _Tp> _Tp value(int i0, int i1, int i2, size_t* hashval=0) const;
  1618.     template<typename _Tp> const _Tp* find(int i0, int i1, int i2, size_t* hashval=0) const;
  1619.     // n-D case
  1620.     template<typename _Tp> _Tp& ref(const int* idx, size_t* hashval=0);
  1621.     template<typename _Tp> _Tp value(const int* idx, size_t* hashval=0) const;
  1622.     template<typename _Tp> const _Tp* find(const int* idx, size_t* hashval=0) const;
  1623.     // erase the specified matrix element.
  1624.     // When there is no such element, the methods do nothing
  1625.     void erase(int i0, int i1, size_t* hashval=0);
  1626.     void erase(int i0, int i1, int i2, size_t* hashval=0);
  1627.     void erase(const int* idx, size_t* hashval=0);
  1628.     // return the matrix iterators,
  1629.     //   pointing to the first sparse matrix element,
  1630.     SparseMatIterator begin();
  1631.     SparseMatConstIterator begin() const;
  1632.     //   ... or to the point after the last sparse matrix element
  1633.     SparseMatIterator end();
  1634.     SparseMatConstIterator end() const;
  1635.     
  1636.     // and the template forms of the above methods.
  1637.     // _Tp must match the actual matrix type.
  1638.     template<typename _Tp> SparseMatIterator_<_Tp> begin();
  1639.     template<typename _Tp> SparseMatConstIterator_<_Tp> begin() const;
  1640.     template<typename _Tp> SparseMatIterator_<_Tp> end();
  1641.     template<typename _Tp> SparseMatConstIterator_<_Tp> end() const;
  1642.     // return value stored in the sparse martix node
  1643.     template<typename _Tp> _Tp& value(Node* n);
  1644.     template<typename _Tp> const _Tp& value(const Node* n) const;
  1645.     
  1646.     ////////////// some internal-use methods ///////////////
  1647.     Node* node(size_t nidx);
  1648.     const Node* node(size_t nidx) const;
  1649.     uchar* newNode(const int* idx, size_t hashval);
  1650.     void removeNode(size_t hidx, size_t nidx, size_t previdx);
  1651.     void resizeHashTab(size_t newsize);
  1652.     enum { MAGIC_VAL=0x42FD0000, MAX_DIM=CV_MAX_DIM, HASH_SCALE=0x5bd1e995, HASH_BIT=0x80000000 };
  1653.     int flags;
  1654.     Hdr* hdr;
  1655. };
  1656. CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal,
  1657.                           double* maxVal, int* minIdx=0, int* maxIdx=0);
  1658. CV_EXPORTS double norm( const SparseMat& src, int normType );
  1659. CV_EXPORTS void normalize( const SparseMat& src, SparseMat& dst, double alpha, int normType );
  1660. class CV_EXPORTS SparseMatConstIterator
  1661. {
  1662. public:
  1663.     SparseMatConstIterator();
  1664.     SparseMatConstIterator(const SparseMat* _m);
  1665.     SparseMatConstIterator(const SparseMatConstIterator& it);
  1666.     SparseMatConstIterator& operator = (const SparseMatConstIterator& it);
  1667.     template<typename _Tp> const _Tp& value() const;
  1668.     const SparseMat::Node* node() const;
  1669.     
  1670.     SparseMatConstIterator& operator --();
  1671.     SparseMatConstIterator operator --(int);
  1672.     SparseMatConstIterator& operator ++();
  1673.     SparseMatConstIterator operator ++(int);
  1674.     
  1675.     void seekEnd();
  1676.     const SparseMat* m;
  1677.     size_t hashidx;
  1678.     uchar* ptr;
  1679. };
  1680. class CV_EXPORTS SparseMatIterator : public SparseMatConstIterator
  1681. {
  1682. public:
  1683.     SparseMatIterator();
  1684.     SparseMatIterator(SparseMat* _m);
  1685.     SparseMatIterator(SparseMat* _m, const int* idx);
  1686.     SparseMatIterator(const SparseMatIterator& it);
  1687.     SparseMatIterator& operator = (const SparseMatIterator& it);
  1688.     template<typename _Tp> _Tp& value() const;
  1689.     SparseMat::Node* node() const;
  1690.     
  1691.     SparseMatIterator& operator ++();
  1692.     SparseMatIterator operator ++(int);
  1693. };
  1694. template<typename _Tp> class CV_EXPORTS SparseMat_ : public SparseMat
  1695. {
  1696. public:
  1697.     typedef SparseMatIterator_<_Tp> iterator;
  1698.     typedef SparseMatConstIterator_<_Tp> const_iterator;
  1699.     SparseMat_();
  1700.     SparseMat_(int dims, const int* _sizes);
  1701.     SparseMat_(const SparseMat& m);
  1702.     SparseMat_(const SparseMat_& m);
  1703.     SparseMat_(const Mat& m);
  1704.     SparseMat_(const MatND& m);
  1705.     SparseMat_(const CvSparseMat* m);
  1706.     SparseMat_& operator = (const SparseMat& m);
  1707.     SparseMat_& operator = (const SparseMat_& m);
  1708.     SparseMat_& operator = (const Mat& m);
  1709.     SparseMat_& operator = (const MatND& m);
  1710.     SparseMat_ clone() const;
  1711.     void create(int dims, const int* _sizes);
  1712.     operator CvSparseMat*() const;
  1713.     int type() const;
  1714.     int depth() const;
  1715.     int channels() const;
  1716.     
  1717.     _Tp& ref(int i0, size_t* hashval=0);
  1718.     _Tp operator()(int i0, size_t* hashval=0) const;
  1719.     _Tp& ref(int i0, int i1, size_t* hashval=0);
  1720.     _Tp operator()(int i0, int i1, size_t* hashval=0) const;
  1721.     _Tp& ref(int i0, int i1, int i2, size_t* hashval=0);
  1722.     _Tp operator()(int i0, int i1, int i2, size_t* hashval=0) const;
  1723.     _Tp& ref(const int* idx, size_t* hashval=0);
  1724.     _Tp operator()(const int* idx, size_t* hashval=0) const;
  1725.     SparseMatIterator_<_Tp> begin();
  1726.     SparseMatConstIterator_<_Tp> begin() const;
  1727.     SparseMatIterator_<_Tp> end();
  1728.     SparseMatConstIterator_<_Tp> end() const;
  1729. };
  1730. template<typename _Tp> class CV_EXPORTS SparseMatConstIterator_ : public SparseMatConstIterator
  1731. {
  1732. public:
  1733.     typedef std::forward_iterator_tag iterator_category;
  1734.     
  1735.     SparseMatConstIterator_();
  1736.     SparseMatConstIterator_(const SparseMat_<_Tp>* _m);
  1737.     SparseMatConstIterator_(const SparseMatConstIterator_& it);
  1738.     SparseMatConstIterator_& operator = (const SparseMatConstIterator_& it);
  1739.     const _Tp& operator *() const;
  1740.     
  1741.     SparseMatConstIterator_& operator ++();
  1742.     SparseMatConstIterator_ operator ++(int);
  1743. };
  1744. template<typename _Tp> class CV_EXPORTS SparseMatIterator_ : public SparseMatConstIterator_<_Tp>
  1745. {
  1746. public:
  1747.     typedef std::forward_iterator_tag iterator_category;
  1748.     
  1749.     SparseMatIterator_();
  1750.     SparseMatIterator_(SparseMat_<_Tp>* _m);
  1751.     SparseMatIterator_(const SparseMatIterator_& it);
  1752.     SparseMatIterator_& operator = (const SparseMatIterator_& it);
  1753.     _Tp& operator *() const;
  1754.     
  1755.     SparseMatIterator_& operator ++();
  1756.     SparseMatIterator_ operator ++(int);
  1757. };
  1758. //////////////////// Fast Nearest-Neighbor Search Structure ////////////////////
  1759. class CV_EXPORTS KDTree
  1760. {
  1761. public:
  1762.     struct Node
  1763.     {
  1764.         Node() : idx(-1), left(-1), right(-1), boundary(0.f) {}
  1765.         Node(int _idx, int _left, int _right, float _boundary)
  1766.             : idx(_idx), left(_left), right(_right), boundary(_boundary) {}
  1767.         int idx;            // split dimension; >=0 for nodes (dim),
  1768.                             // < 0 for leaves (index of the point)
  1769.         int left, right;    // node indices of left and right branches
  1770.         float boundary;     // left if vec[dim]<=boundary, otherwise right
  1771.     };
  1772.     KDTree();
  1773.     KDTree(const Mat& _points, bool copyPoints=true);
  1774.     void build(const Mat& _points, bool copyPoints=true);
  1775.     int findNearest(const float* vec, int K, int Emax, int* neighborsIdx,
  1776.                     Mat* neighbors=0, float* dist=0) const;
  1777.     int findNearest(const float* vec, int K, int Emax,
  1778.                     vector<int>* neighborsIdx,
  1779.                     Mat* neighbors=0, vector<float>* dist=0) const;
  1780.     void findOrthoRange(const float* minBounds, const float* maxBounds,
  1781.                         vector<int>* neighborsIdx, Mat* neighbors=0) const;
  1782.     void getPoints(const int* idx, size_t nidx, Mat& pts) const;
  1783.     void getPoints(const Mat& idxs, Mat& pts) const;
  1784.     const float* getPoint(int ptidx) const;
  1785.     int dims() const;
  1786.     vector<Node> nodes;
  1787.     Mat points;
  1788.     int maxDepth;
  1789.     int normType;
  1790. };
  1791. //////////////////////////////////////// XML & YAML I/O ////////////////////////////////////
  1792. class CV_EXPORTS FileNode;
  1793. class CV_EXPORTS FileStorage
  1794. {
  1795. public:
  1796.     enum { READ=0, WRITE=1, APPEND=2 };
  1797.     enum { UNDEFINED=0, VALUE_EXPECTED=1, NAME_EXPECTED=2, INSIDE_MAP=4 };
  1798.     FileStorage();
  1799.     FileStorage(const string& filename, int flags);
  1800.     FileStorage(CvFileStorage* fs);
  1801.     virtual ~FileStorage();
  1802.     virtual bool open(const string& filename, int flags);
  1803.     virtual bool isOpened() const;
  1804.     virtual void release();
  1805.     FileNode getFirstTopLevelNode() const;
  1806.     FileNode root(int streamidx=0) const;
  1807.     FileNode operator[](const string& nodename) const;
  1808.     FileNode operator[](const char* nodename) const;
  1809.     CvFileStorage* operator *() { return fs; }
  1810.     const CvFileStorage* operator *() const { return fs; }
  1811.     void writeRaw( const string& fmt, const uchar* vec, size_t len );
  1812.     void writeObj( const string& name, const void* obj );
  1813.     static string getDefaultObjectName(const string& filename);
  1814.     Ptr<CvFileStorage> fs;
  1815.     string elname;
  1816.     vector<char> structs;
  1817.     int state;
  1818. };
  1819. class CV_EXPORTS FileNodeIterator;
  1820. class CV_EXPORTS FileNode
  1821. {
  1822. public:
  1823.     enum { NONE=0, INT=1, REAL=2, FLOAT=REAL, STR=3, STRING=STR, REF=4, SEQ=5, MAP=6, TYPE_MASK=7,
  1824.         FLOW=8, USER=16, EMPTY=32, NAMED=64 };
  1825.     FileNode();
  1826.     FileNode(const CvFileStorage* fs, const CvFileNode* node);
  1827.     FileNode(const FileNode& node);
  1828.     FileNode operator[](const string& nodename) const;
  1829.     FileNode operator[](const char* nodename) const;
  1830.     FileNode operator[](int i) const;
  1831.     int type() const;
  1832.     int rawDataSize(const string& fmt) const;
  1833.     bool empty() const;
  1834.     bool isNone() const;
  1835.     bool isSeq() const;
  1836.     bool isMap() const;
  1837.     bool isInt() const;
  1838.     bool isReal() const;
  1839.     bool isString() const;
  1840.     bool isNamed() const;
  1841.     string name() const;
  1842.     size_t size() const;
  1843.     operator int() const;
  1844.     operator float() const;
  1845.     operator double() const;
  1846.     operator string() const;
  1847.     
  1848.     CvFileNode* operator *();
  1849.     const CvFileNode* operator* () const;
  1850.     
  1851.     FileNodeIterator begin() const;
  1852.     FileNodeIterator end() const;
  1853.     void readRaw( const string& fmt, uchar* vec, size_t len ) const;
  1854.     void* readObj() const;
  1855.     // do not use wrapper pointer classes for better efficiency
  1856.     const CvFileStorage* fs;
  1857.     const CvFileNode* node;
  1858. };
  1859. class CV_EXPORTS FileNodeIterator
  1860. {
  1861. public:
  1862.     FileNodeIterator();
  1863.     FileNodeIterator(const CvFileStorage* fs, const CvFileNode* node, size_t ofs=0);
  1864.     FileNodeIterator(const FileNodeIterator& it);
  1865.     FileNode operator *() const;
  1866.     FileNode operator ->() const;
  1867.     FileNodeIterator& operator ++();
  1868.     FileNodeIterator operator ++(int);
  1869.     FileNodeIterator& operator --();
  1870.     FileNodeIterator operator --(int);
  1871.     FileNodeIterator& operator += (int);
  1872.     FileNodeIterator& operator -= (int);
  1873.     FileNodeIterator& readRaw( const string& fmt, uchar* vec,
  1874.                                size_t maxCount=(size_t)INT_MAX );
  1875.     const CvFileStorage* fs;
  1876.     const CvFileNode* container;
  1877.     CvSeqReader reader;
  1878.     size_t remaining;
  1879. };
  1880. ////////////// convenient wrappers for operating old-style dynamic structures //////////////
  1881. // !!! NOTE that the wrappers are "thin", i.e. they do not call
  1882. // any element constructors/destructors
  1883. template<typename _Tp> class SeqIterator;
  1884. typedef Ptr<CvMemStorage> MemStorage;
  1885. template<typename _Tp> class CV_EXPORTS Seq
  1886. {
  1887. public:
  1888.     typedef SeqIterator<_Tp> iterator;
  1889.     typedef SeqIterator<_Tp> const_iterator;
  1890.     
  1891.     Seq();
  1892.     Seq(const CvSeq* seq);
  1893.     Seq(MemStorage& storage, int headerSize = sizeof(CvSeq));
  1894.     _Tp& operator [](int idx);
  1895.     const _Tp& operator[](int idx) const;
  1896.     SeqIterator<_Tp> begin() const;
  1897.     SeqIterator<_Tp> end() const;
  1898.     size_t size() const;
  1899.     int type() const;
  1900.     int depth() const;
  1901.     int channels() const;
  1902.     size_t elemSize() const;
  1903.     size_t index(const _Tp& elem) const;
  1904.     void push_back(const _Tp& elem);
  1905.     void push_front(const _Tp& elem);
  1906.     void push_back(const _Tp* elems, size_t count);
  1907.     void push_front(const _Tp* elems, size_t count);
  1908.     void insert(int idx, const _Tp& elem);
  1909.     void insert(int idx, const _Tp* elems, size_t count);
  1910.     void remove(int idx);
  1911.     void remove(const Range& r);
  1912.     
  1913.     _Tp& front();
  1914.     const _Tp& front() const;
  1915.     _Tp& back();
  1916.     const _Tp& back() const;
  1917.     bool empty() const;
  1918.     void clear();
  1919.     void pop_front();
  1920.     void pop_back();
  1921.     void pop_front(_Tp* elems, size_t count);
  1922.     void pop_back(_Tp* elems, size_t count);
  1923.     void copyTo(vector<_Tp>& vec, const Range& range=Range::all()) const;
  1924.     operator vector<_Tp>() const;
  1925.     
  1926.     CvSeq* seq;
  1927. };
  1928. template<typename _Tp> class CV_EXPORTS SeqIterator : public CvSeqReader
  1929. {
  1930. public:
  1931.     SeqIterator();
  1932.     SeqIterator(const Seq<_Tp>& seq, bool seekEnd=false);
  1933.     void seek(size_t pos);
  1934.     size_t tell() const;
  1935.     _Tp& operator *();
  1936.     const _Tp& operator *() const;
  1937.     SeqIterator& operator ++();
  1938.     SeqIterator operator ++(int) const;
  1939.     SeqIterator& operator --();
  1940.     SeqIterator operator --(int) const;
  1941.     SeqIterator& operator +=(int);
  1942.     SeqIterator& operator -=(int);
  1943.     // this is index of the current element module seq->total*2
  1944.     // (to distinguish between 0 and seq->total)
  1945.     int index;
  1946. };
  1947. }
  1948. #endif // __cplusplus
  1949. #include "cxoperations.hpp"
  1950. #include "cxmat.hpp"
  1951. #include "cxflann.h" // FLANN (Fast Library for Approximate Nearest Neighbors)
  1952. #endif /*_CXCORE_HPP_*/