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

波变换

开发平台:

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_TYPES_H_
  43. #define _CXCORE_TYPES_H_
  44. #if !defined _CRT_SECURE_NO_DEPRECATE && _MSC_VER > 1300
  45. #define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio 2005 warnings */
  46. #endif
  47. #if _MSC_VER >= 1500
  48. #ifndef _BIND_TO_CURRENT_CRT_VERSION
  49.   #define _BIND_TO_CURRENT_CRT_VERSION 1
  50. #endif
  51. #ifndef _BIND_TO_CURRENT_VCLIBS_VERSION
  52.   #define _BIND_TO_CURRENT_VCLIBS_VERSION 1
  53. #endif
  54. #endif
  55. #ifndef SKIP_INCLUDES
  56.   #include <assert.h>
  57.   #include <stdlib.h>
  58.   #include <string.h>
  59.   #include <float.h>
  60. #if !defined _MSC_VER && !defined __BORLANDC__
  61.   #include <stdint.h>
  62. #endif
  63.   #if defined __ICL
  64.     #define CV_ICC   __ICL
  65.   #elif defined __ICC
  66.     #define CV_ICC   __ICC
  67.   #elif defined __ECL
  68.     #define CV_ICC   __ECL
  69.   #elif defined __ECC
  70.     #define CV_ICC   __ECC
  71.   #endif
  72.   #if ((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && 
  73.       (_MSC_VER >= 1400 || defined CV_ICC)) 
  74.       || (defined __SSE2__ && defined __GNUC__ && __GNUC__ >= 4)
  75.     #include <emmintrin.h>
  76.     #define CV_SSE2 1
  77.   #else
  78.     #define CV_SSE2 0
  79.   #endif
  80.   #if ((defined __SSE__ || defined __MMX__) && defined __GNUC__ && __GNUC__ >= 3)
  81.     #include <mmintrin.h>
  82.   #endif
  83.   #if defined __BORLANDC__
  84.     #include <fastmath.h>
  85.   #else
  86.     #include <math.h>
  87.   #endif
  88.   #ifdef HAVE_IPL
  89.       #ifndef __IPL_H__
  90.           #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
  91.               #include <ipl.h>
  92.           #else
  93.               #include <ipl/ipl.h>
  94.           #endif
  95.       #endif
  96.   #elif defined __IPL_H__
  97.       #define HAVE_IPL
  98.   #endif
  99. #endif // SKIP_INCLUDES
  100. #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
  101.     #define CV_CDECL __cdecl
  102.     #define CV_STDCALL __stdcall
  103. #else
  104.     #define CV_CDECL
  105.     #define CV_STDCALL
  106. #endif
  107. #ifndef CV_EXTERN_C
  108.     #ifdef __cplusplus
  109.         #define CV_EXTERN_C extern "C"
  110.         #define CV_DEFAULT(val) = val
  111.     #else
  112.         #define CV_EXTERN_C
  113.         #define CV_DEFAULT(val)
  114.     #endif
  115. #endif
  116. #ifndef CV_EXTERN_C_FUNCPTR
  117.     #ifdef __cplusplus
  118.         #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
  119.     #else
  120.         #define CV_EXTERN_C_FUNCPTR(x) typedef x
  121.     #endif
  122. #endif
  123. #ifndef CV_INLINE
  124. #if defined __cplusplus
  125.     #define CV_INLINE inline
  126. #elif (defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 || defined WINCE) && !defined __GNUC__
  127.     #define CV_INLINE __inline
  128. #else
  129.     #define CV_INLINE static
  130. #endif
  131. #endif /* CV_INLINE */
  132. #if (defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 || defined WINCE) && defined CVAPI_EXPORTS
  133.     #define CV_EXPORTS __declspec(dllexport)
  134. #else
  135.     #define CV_EXPORTS
  136. #endif
  137. #ifndef CVAPI
  138.     #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
  139. #endif
  140. #if defined _MSC_VER || defined __BORLANDC__
  141. typedef __int64 int64;
  142. typedef unsigned __int64 uint64;
  143. #else
  144. typedef int64_t int64;
  145. typedef uint64_t uint64;
  146. #endif
  147. #ifndef HAVE_IPL
  148. typedef unsigned char uchar;
  149. typedef unsigned short ushort;
  150. #endif
  151. typedef signed char schar;
  152. /* CvArr* is used to pass arbitrary
  153.  * array-like data structures
  154.  * into functions where the particular
  155.  * array type is recognized at runtime:
  156.  */
  157. typedef void CvArr;
  158. typedef union Cv32suf
  159. {
  160.     int i;
  161.     unsigned u;
  162.     float f;
  163. }
  164. Cv32suf;
  165. typedef union Cv64suf
  166. {
  167.     int64 i;
  168.     uint64 u;
  169.     double f;
  170. }
  171. Cv64suf;
  172. /****************************************************************************************
  173. *                             Common macros and inline functions                         *
  174. ****************************************************************************************/
  175. #define CV_PI   3.1415926535897932384626433832795
  176. #define CV_LOG2 0.69314718055994530941723212145818
  177. #define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
  178. #ifndef MIN
  179. #define MIN(a,b)  ((a) > (b) ? (b) : (a))
  180. #endif
  181. #ifndef MAX
  182. #define MAX(a,b)  ((a) < (b) ? (b) : (a))
  183. #endif
  184. /* min & max without jumps */
  185. #define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))
  186. #define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))
  187. /* absolute value without jumps */
  188. #ifndef __cplusplus
  189. #define  CV_IABS(a)     (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
  190. #else
  191. #define  CV_IABS(a)     abs(a)
  192. #endif
  193. #define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))
  194. #define  CV_SIGN(a)     CV_CMP((a),0)
  195. CV_INLINE  int  cvRound( double value )
  196. {
  197. #if CV_SSE2 && !defined __APPLE__
  198.     __m128d t = _mm_set_sd( value );
  199.     return _mm_cvtsd_si32(t);
  200. #elif (defined WIN32 || defined _WIN32) && !defined WIN64 && !defined _WIN64 && defined _MSC_VER
  201.     int t;
  202.     __asm
  203.     {
  204.         fld value;
  205.         fistp t;
  206.     }
  207.     return t;
  208. #elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__
  209.     return (int)lrint(value);
  210. #else
  211.     // while this is not IEEE754-compliant rounding, it's usually a good enough approximation
  212.     return (int)(value + 0.5);
  213. #endif
  214. }
  215. CV_INLINE  int  cvFloor( double value )
  216. {
  217. #ifdef __GNUC__
  218.     int i = (int)value;
  219.     return i - (i > value);
  220. #elif CV_SSE2
  221.     __m128d t = _mm_set_sd( value );
  222.     int i = _mm_cvtsd_si32(t);
  223.     return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i)));
  224. #else
  225.     int i = cvRound(value);
  226.     Cv32suf diff;
  227.     diff.f = (float)(value - i);
  228.     return i - (diff.i < 0);
  229. #endif
  230. }
  231. CV_INLINE  int  cvCeil( double value )
  232. {
  233. #ifdef __GNUC__
  234.     int i = (int)value;
  235.     return i + (i < value);
  236. #elif CV_SSE2
  237.     __m128d t = _mm_set_sd( value );
  238.     int i = _mm_cvtsd_si32(t);
  239.     return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t));
  240. #else
  241.     int i = cvRound(value);
  242.     Cv32suf diff;
  243.     diff.f = (float)(i - value);
  244.     return i + (diff.i < 0);
  245. #endif
  246. }
  247. #define cvInvSqrt(value) ((float)(1./sqrt(value)))
  248. #define cvSqrt(value)  ((float)sqrt(value))
  249. CV_INLINE int cvIsNaN( double value )
  250. {
  251. #if 1/*defined _MSC_VER || defined __BORLANDC__
  252.     return _isnan(value);
  253. #elif defined __GNUC__
  254.     return isnan(value);
  255. #else*/
  256.     Cv64suf ieee754;
  257.     ieee754.f = value;
  258.     return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
  259.            ((unsigned)ieee754.u != 0) > 0x7ff00000;
  260. #endif
  261. }
  262. CV_INLINE int cvIsInf( double value )
  263. {
  264. #if 1/*defined _MSC_VER || defined __BORLANDC__
  265.     return !_finite(value);
  266. #elif defined __GNUC__
  267.     return isinf(value);
  268. #else*/
  269.     Cv64suf ieee754;
  270.     ieee754.f = value;
  271.     return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
  272.            (unsigned)ieee754.u == 0;
  273. #endif
  274. }
  275. /*************** Random number generation *******************/
  276. typedef uint64 CvRNG;
  277. CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))
  278. {
  279.     CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
  280.     return rng;
  281. }
  282. /* Return random 32-bit unsigned integer: */
  283. CV_INLINE unsigned cvRandInt( CvRNG* rng )
  284. {
  285.     uint64 temp = *rng;
  286.     temp = (uint64)(unsigned)temp*4164903690U + (temp >> 32);
  287.     *rng = temp;
  288.     return (unsigned)temp;
  289. }
  290. /* Returns random floating-point number between 0 and 1: */
  291. CV_INLINE double cvRandReal( CvRNG* rng )
  292. {
  293.     return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
  294. }
  295. /****************************************************************************************
  296. *                                  Image type (IplImage)                                 *
  297. ****************************************************************************************/
  298. #ifndef HAVE_IPL
  299. /*
  300.  * The following definitions (until #endif)
  301.  * is an extract from IPL headers.
  302.  * Copyright (c) 1995 Intel Corporation.
  303.  */
  304. #define IPL_DEPTH_SIGN 0x80000000
  305. #define IPL_DEPTH_1U     1
  306. #define IPL_DEPTH_8U     8
  307. #define IPL_DEPTH_16U   16
  308. #define IPL_DEPTH_32F   32
  309. #define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)
  310. #define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
  311. #define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)
  312. #define IPL_DATA_ORDER_PIXEL  0
  313. #define IPL_DATA_ORDER_PLANE  1
  314. #define IPL_ORIGIN_TL 0
  315. #define IPL_ORIGIN_BL 1
  316. #define IPL_ALIGN_4BYTES   4
  317. #define IPL_ALIGN_8BYTES   8
  318. #define IPL_ALIGN_16BYTES 16
  319. #define IPL_ALIGN_32BYTES 32
  320. #define IPL_ALIGN_DWORD   IPL_ALIGN_4BYTES
  321. #define IPL_ALIGN_QWORD   IPL_ALIGN_8BYTES
  322. #define IPL_BORDER_CONSTANT   0
  323. #define IPL_BORDER_REPLICATE  1
  324. #define IPL_BORDER_REFLECT    2
  325. #define IPL_BORDER_WRAP       3
  326. typedef struct _IplImage
  327. {
  328.     int  nSize;             /* sizeof(IplImage) */
  329.     int  ID;                /* version (=0)*/
  330.     int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
  331.     int  alphaChannel;      /* Ignored by OpenCV */
  332.     int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
  333.                                IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
  334.     char colorModel[4];     /* Ignored by OpenCV */
  335.     char channelSeq[4];     /* ditto */
  336.     int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
  337.                                cvCreateImage can only create interleaved images */
  338.     int  origin;            /* 0 - top-left origin,
  339.                                1 - bottom-left origin (Windows bitmaps style).  */
  340.     int  align;             /* Alignment of image rows (4 or 8).
  341.                                OpenCV ignores it and uses widthStep instead.    */
  342.     int  width;             /* Image width in pixels.                           */
  343.     int  height;            /* Image height in pixels.                          */
  344.     struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
  345.     struct _IplImage *maskROI;      /* Must be NULL. */
  346.     void  *imageId;                 /* "           " */
  347.     struct _IplTileInfo *tileInfo;  /* "           " */
  348.     int  imageSize;         /* Image data size in bytes
  349.                                (==image->height*image->widthStep
  350.                                in case of interleaved data)*/
  351.     char *imageData;        /* Pointer to aligned image data.         */
  352.     int  widthStep;         /* Size of aligned image row in bytes.    */
  353.     int  BorderMode[4];     /* Ignored by OpenCV.                     */
  354.     int  BorderConst[4];    /* Ditto.                                 */
  355.     char *imageDataOrigin;  /* Pointer to very origin of image data
  356.                                (not necessarily aligned) -
  357.                                needed for correct deallocation */
  358. }
  359. IplImage;
  360. typedef struct _IplTileInfo IplTileInfo;
  361. typedef struct _IplROI
  362. {
  363.     int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/
  364.     int  xOffset;
  365.     int  yOffset;
  366.     int  width;
  367.     int  height;
  368. }
  369. IplROI;
  370. typedef struct _IplConvKernel
  371. {
  372.     int  nCols;
  373.     int  nRows;
  374.     int  anchorX;
  375.     int  anchorY;
  376.     int *values;
  377.     int  nShiftR;
  378. }
  379. IplConvKernel;
  380. typedef struct _IplConvKernelFP
  381. {
  382.     int  nCols;
  383.     int  nRows;
  384.     int  anchorX;
  385.     int  anchorY;
  386.     float *values;
  387. }
  388. IplConvKernelFP;
  389. #define IPL_IMAGE_HEADER 1
  390. #define IPL_IMAGE_DATA   2
  391. #define IPL_IMAGE_ROI    4
  392. #endif/*HAVE_IPL*/
  393. /* extra border mode */
  394. #define IPL_BORDER_REFLECT_101    4
  395. #define IPL_IMAGE_MAGIC_VAL  ((int)sizeof(IplImage))
  396. #define CV_TYPE_NAME_IMAGE "opencv-image"
  397. #define CV_IS_IMAGE_HDR(img) 
  398.     ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))
  399. #define CV_IS_IMAGE(img) 
  400.     (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)
  401. /* for storing double-precision
  402.    floating point data in IplImage's */
  403. #define IPL_DEPTH_64F  64
  404. /* get reference to pixel at (col,row),
  405.    for multi-channel images (col) should be multiplied by number of channels */
  406. #define CV_IMAGE_ELEM( image, elemtype, row, col )       
  407.     (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
  408. /****************************************************************************************
  409. *                                  Matrix type (CvMat)                                   *
  410. ****************************************************************************************/
  411. #define CV_CN_MAX     64
  412. #define CV_CN_SHIFT   3
  413. #define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
  414. #define CV_8U   0
  415. #define CV_8S   1
  416. #define CV_16U  2
  417. #define CV_16S  3
  418. #define CV_32S  4
  419. #define CV_32F  5
  420. #define CV_64F  6
  421. #define CV_USRTYPE1 7
  422. #define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
  423. #define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
  424. #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
  425. #define CV_MAKE_TYPE CV_MAKETYPE
  426. #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
  427. #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
  428. #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
  429. #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
  430. #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
  431. #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
  432. #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
  433. #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
  434. #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
  435. #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
  436. #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
  437. #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
  438. #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
  439. #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
  440. #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
  441. #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
  442. #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
  443. #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
  444. #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
  445. #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
  446. #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
  447. #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
  448. #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
  449. #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
  450. #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
  451. #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
  452. #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
  453. #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
  454. #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
  455. #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
  456. #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
  457. #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
  458. #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
  459. #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
  460. #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
  461. #define CV_AUTO_STEP  0x7fffffff
  462. #define CV_WHOLE_ARR  cvSlice( 0, 0x3fffffff )
  463. #define CV_MAT_CN_MASK          ((CV_CN_MAX - 1) << CV_CN_SHIFT)
  464. #define CV_MAT_CN(flags)        ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
  465. #define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)
  466. #define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)
  467. #define CV_MAT_CONT_FLAG_SHIFT  14
  468. #define CV_MAT_CONT_FLAG        (1 << CV_MAT_CONT_FLAG_SHIFT)
  469. #define CV_IS_MAT_CONT(flags)   ((flags) & CV_MAT_CONT_FLAG)
  470. #define CV_IS_CONT_MAT          CV_IS_MAT_CONT
  471. #define CV_MAT_TEMP_FLAG_SHIFT  15
  472. #define CV_MAT_TEMP_FLAG        (1 << CV_MAT_TEMP_FLAG_SHIFT)
  473. #define CV_IS_TEMP_MAT(flags)   ((flags) & CV_MAT_TEMP_FLAG)
  474. #define CV_MAGIC_MASK       0xFFFF0000
  475. #define CV_MAT_MAGIC_VAL    0x42420000
  476. #define CV_TYPE_NAME_MAT    "opencv-matrix"
  477. typedef struct CvMat
  478. {
  479.     int type;
  480.     int step;
  481.     /* for internal use only */
  482.     int* refcount;
  483.     int hdr_refcount;
  484.     union
  485.     {
  486.         uchar* ptr;
  487.         short* s;
  488.         int* i;
  489.         float* fl;
  490.         double* db;
  491.     } data;
  492. #ifdef __cplusplus
  493.     union
  494.     {
  495.         int rows;
  496.         int height;
  497.     };
  498.     union
  499.     {
  500.         int cols;
  501.         int width;
  502.     };
  503. #else
  504.     int rows;
  505.     int cols;
  506. #endif
  507. }
  508. CvMat;
  509. #define CV_IS_MAT_HDR(mat) 
  510.     ((mat) != NULL && 
  511.     (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && 
  512.     ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)
  513. #define CV_IS_MAT(mat) 
  514.     (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)
  515. #define CV_IS_MASK_ARR(mat) 
  516.     (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)
  517. #define CV_ARE_TYPES_EQ(mat1, mat2) 
  518.     ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)
  519. #define CV_ARE_CNS_EQ(mat1, mat2) 
  520.     ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)
  521. #define CV_ARE_DEPTHS_EQ(mat1, mat2) 
  522.     ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)
  523. #define CV_ARE_SIZES_EQ(mat1, mat2) 
  524.     ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)
  525. #define CV_IS_MAT_CONST(mat)  
  526.     (((mat)->rows|(mat)->cols) == 1)
  527. /* Size of each channel item,
  528.    0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
  529. #define CV_ELEM_SIZE1(type) 
  530.     ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
  531. /* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
  532. #define CV_ELEM_SIZE(type) 
  533.     (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
  534. /* Inline constructor. No data is allocated internally!!!
  535.  * (Use together with cvCreateData, or use cvCreateMat instead to
  536.  * get a matrix with allocated data):
  537.  */
  538. CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))
  539. {
  540.     CvMat m;
  541.     assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );
  542.     type = CV_MAT_TYPE(type);
  543.     m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;
  544.     m.cols = cols;
  545.     m.rows = rows;
  546.     m.step = m.cols*CV_ELEM_SIZE(type);
  547.     m.data.ptr = (uchar*)data;
  548.     m.refcount = NULL;
  549.     m.hdr_refcount = 0;
  550.     return m;
  551. }
  552. #define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  
  553.     (assert( (unsigned)(row) < (unsigned)(mat).rows &&   
  554.              (unsigned)(col) < (unsigned)(mat).cols ),   
  555.      (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
  556. #define CV_MAT_ELEM_PTR( mat, row, col )                 
  557.     CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )
  558. #define CV_MAT_ELEM( mat, elemtype, row, col )           
  559.     (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
  560. CV_INLINE  double  cvmGet( const CvMat* mat, int row, int col )
  561. {
  562.     int type;
  563.     type = CV_MAT_TYPE(mat->type);
  564.     assert( (unsigned)row < (unsigned)mat->rows &&
  565.             (unsigned)col < (unsigned)mat->cols );
  566.     if( type == CV_32FC1 )
  567.         return ((float*)(mat->data.ptr + (size_t)mat->step*row))[col];
  568.     else
  569.     {
  570.         assert( type == CV_64FC1 );
  571.         return ((double*)(mat->data.ptr + (size_t)mat->step*row))[col];
  572.     }
  573. }
  574. CV_INLINE  void  cvmSet( CvMat* mat, int row, int col, double value )
  575. {
  576.     int type;
  577.     type = CV_MAT_TYPE(mat->type);
  578.     assert( (unsigned)row < (unsigned)mat->rows &&
  579.             (unsigned)col < (unsigned)mat->cols );
  580.     if( type == CV_32FC1 )
  581.         ((float*)(mat->data.ptr + (size_t)mat->step*row))[col] = (float)value;
  582.     else
  583.     {
  584.         assert( type == CV_64FC1 );
  585.         ((double*)(mat->data.ptr + (size_t)mat->step*row))[col] = (double)value;
  586.     }
  587. }
  588. CV_INLINE int cvIplDepth( int type )
  589. {
  590.     int depth = CV_MAT_DEPTH(type);
  591.     return CV_ELEM_SIZE1(depth)*8 | (depth == CV_8S || depth == CV_16S ||
  592.            depth == CV_32S ? IPL_DEPTH_SIGN : 0);
  593. }
  594. /****************************************************************************************
  595. *                       Multi-dimensional dense array (CvMatND)                          *
  596. ****************************************************************************************/
  597. #define CV_MATND_MAGIC_VAL    0x42430000
  598. #define CV_TYPE_NAME_MATND    "opencv-nd-matrix"
  599. #define CV_MAX_DIM            32
  600. #define CV_MAX_DIM_HEAP       (1 << 16)
  601. typedef struct CvMatND
  602. {
  603.     int type;
  604.     int dims;
  605.     int* refcount;
  606.     int hdr_refcount;
  607.     union
  608.     {
  609.         uchar* ptr;
  610.         float* fl;
  611.         double* db;
  612.         int* i;
  613.         short* s;
  614.     } data;
  615.     struct
  616.     {
  617.         int size;
  618.         int step;
  619.     }
  620.     dim[CV_MAX_DIM];
  621. }
  622. CvMatND;
  623. #define CV_IS_MATND_HDR(mat) 
  624.     ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)
  625. #define CV_IS_MATND(mat) 
  626.     (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)
  627. /****************************************************************************************
  628. *                      Multi-dimensional sparse array (CvSparseMat)                      *
  629. ****************************************************************************************/
  630. #define CV_SPARSE_MAT_MAGIC_VAL    0x42440000
  631. #define CV_TYPE_NAME_SPARSE_MAT    "opencv-sparse-matrix"
  632. struct CvSet;
  633. typedef struct CvSparseMat
  634. {
  635.     int type;
  636.     int dims;
  637.     int* refcount;
  638.     int hdr_refcount;
  639.     struct CvSet* heap;
  640.     void** hashtable;
  641.     int hashsize;
  642.     int valoffset;
  643.     int idxoffset;
  644.     int size[CV_MAX_DIM];
  645. }
  646. CvSparseMat;
  647. #define CV_IS_SPARSE_MAT_HDR(mat) 
  648.     ((mat) != NULL && 
  649.     (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)
  650. #define CV_IS_SPARSE_MAT(mat) 
  651.     CV_IS_SPARSE_MAT_HDR(mat)
  652. /**************** iteration through a sparse array *****************/
  653. typedef struct CvSparseNode
  654. {
  655.     unsigned hashval;
  656.     struct CvSparseNode* next;
  657. }
  658. CvSparseNode;
  659. typedef struct CvSparseMatIterator
  660. {
  661.     CvSparseMat* mat;
  662.     CvSparseNode* node;
  663.     int curidx;
  664. }
  665. CvSparseMatIterator;
  666. #define CV_NODE_VAL(mat,node)   ((void*)((uchar*)(node) + (mat)->valoffset))
  667. #define CV_NODE_IDX(mat,node)   ((int*)((uchar*)(node) + (mat)->idxoffset))
  668. /****************************************************************************************
  669. *                                         Histogram                                      *
  670. ****************************************************************************************/
  671. typedef int CvHistType;
  672. #define CV_HIST_MAGIC_VAL     0x42450000
  673. #define CV_HIST_UNIFORM_FLAG  (1 << 10)
  674. /* indicates whether bin ranges are set already or not */
  675. #define CV_HIST_RANGES_FLAG   (1 << 11)
  676. #define CV_HIST_ARRAY         0
  677. #define CV_HIST_SPARSE        1
  678. #define CV_HIST_TREE          CV_HIST_SPARSE
  679. /* should be used as a parameter only,
  680.    it turns to CV_HIST_UNIFORM_FLAG of hist->type */
  681. #define CV_HIST_UNIFORM       1
  682. typedef struct CvHistogram
  683. {
  684.     int     type;
  685.     CvArr*  bins;
  686.     float   thresh[CV_MAX_DIM][2];  /* For uniform histograms.                      */
  687.     float** thresh2;                /* For non-uniform histograms.                  */
  688.     CvMatND mat;                    /* Embedded matrix header for array histograms. */
  689. }
  690. CvHistogram;
  691. #define CV_IS_HIST( hist ) 
  692.     ((hist) != NULL  && 
  693.      (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && 
  694.      (hist)->bins != NULL)
  695. #define CV_IS_UNIFORM_HIST( hist ) 
  696.     (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)
  697. #define CV_IS_SPARSE_HIST( hist ) 
  698.     CV_IS_SPARSE_MAT((hist)->bins)
  699. #define CV_HIST_HAS_RANGES( hist ) 
  700.     (((hist)->type & CV_HIST_RANGES_FLAG) != 0)
  701. /****************************************************************************************
  702. *                      Other supplementary data type definitions                         *
  703. ****************************************************************************************/
  704. /*************************************** CvRect *****************************************/
  705. typedef struct CvRect
  706. {
  707.     int x;
  708.     int y;
  709.     int width;
  710.     int height;
  711. }
  712. CvRect;
  713. CV_INLINE  CvRect  cvRect( int x, int y, int width, int height )
  714. {
  715.     CvRect r;
  716.     r.x = x;
  717.     r.y = y;
  718.     r.width = width;
  719.     r.height = height;
  720.     return r;
  721. }
  722. CV_INLINE  IplROI  cvRectToROI( CvRect rect, int coi )
  723. {
  724.     IplROI roi;
  725.     roi.xOffset = rect.x;
  726.     roi.yOffset = rect.y;
  727.     roi.width = rect.width;
  728.     roi.height = rect.height;
  729.     roi.coi = coi;
  730.     return roi;
  731. }
  732. CV_INLINE  CvRect  cvROIToRect( IplROI roi )
  733. {
  734.     return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );
  735. }
  736. /*********************************** CvTermCriteria *************************************/
  737. #define CV_TERMCRIT_ITER    1
  738. #define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER
  739. #define CV_TERMCRIT_EPS     2
  740. typedef struct CvTermCriteria
  741. {
  742.     int    type;  /* may be combination of
  743.                      CV_TERMCRIT_ITER
  744.                      CV_TERMCRIT_EPS */
  745.     int    max_iter;
  746.     double epsilon;
  747. }
  748. CvTermCriteria;
  749. CV_INLINE  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon )
  750. {
  751.     CvTermCriteria t;
  752.     t.type = type;
  753.     t.max_iter = max_iter;
  754.     t.epsilon = (float)epsilon;
  755.     return t;
  756. }
  757. /******************************* CvPoint and variants ***********************************/
  758. typedef struct CvPoint
  759. {
  760.     int x;
  761.     int y;
  762. }
  763. CvPoint;
  764. CV_INLINE  CvPoint  cvPoint( int x, int y )
  765. {
  766.     CvPoint p;
  767.     p.x = x;
  768.     p.y = y;
  769.     return p;
  770. }
  771. typedef struct CvPoint2D32f
  772. {
  773.     float x;
  774.     float y;
  775. }
  776. CvPoint2D32f;
  777. CV_INLINE  CvPoint2D32f  cvPoint2D32f( double x, double y )
  778. {
  779.     CvPoint2D32f p;
  780.     p.x = (float)x;
  781.     p.y = (float)y;
  782.     return p;
  783. }
  784. CV_INLINE  CvPoint2D32f  cvPointTo32f( CvPoint point )
  785. {
  786.     return cvPoint2D32f( (float)point.x, (float)point.y );
  787. }
  788. CV_INLINE  CvPoint  cvPointFrom32f( CvPoint2D32f point )
  789. {
  790.     CvPoint ipt;
  791.     ipt.x = cvRound(point.x);
  792.     ipt.y = cvRound(point.y);
  793.     return ipt;
  794. }
  795. typedef struct CvPoint3D32f
  796. {
  797.     float x;
  798.     float y;
  799.     float z;
  800. }
  801. CvPoint3D32f;
  802. CV_INLINE  CvPoint3D32f  cvPoint3D32f( double x, double y, double z )
  803. {
  804.     CvPoint3D32f p;
  805.     p.x = (float)x;
  806.     p.y = (float)y;
  807.     p.z = (float)z;
  808.     return p;
  809. }
  810. typedef struct CvPoint2D64f
  811. {
  812.     double x;
  813.     double y;
  814. }
  815. CvPoint2D64f;
  816. CV_INLINE  CvPoint2D64f  cvPoint2D64f( double x, double y )
  817. {
  818.     CvPoint2D64f p;
  819.     p.x = x;
  820.     p.y = y;
  821.     return p;
  822. }
  823. typedef struct CvPoint3D64f
  824. {
  825.     double x;
  826.     double y;
  827.     double z;
  828. }
  829. CvPoint3D64f;
  830. CV_INLINE  CvPoint3D64f  cvPoint3D64f( double x, double y, double z )
  831. {
  832.     CvPoint3D64f p;
  833.     p.x = x;
  834.     p.y = y;
  835.     p.z = z;
  836.     return p;
  837. }
  838. /******************************** CvSize's & CvBox **************************************/
  839. typedef struct
  840. {
  841.     int width;
  842.     int height;
  843. }
  844. CvSize;
  845. CV_INLINE  CvSize  cvSize( int width, int height )
  846. {
  847.     CvSize s;
  848.     s.width = width;
  849.     s.height = height;
  850.     return s;
  851. }
  852. typedef struct CvSize2D32f
  853. {
  854.     float width;
  855.     float height;
  856. }
  857. CvSize2D32f;
  858. CV_INLINE  CvSize2D32f  cvSize2D32f( double width, double height )
  859. {
  860.     CvSize2D32f s;
  861.     s.width = (float)width;
  862.     s.height = (float)height;
  863.     return s;
  864. }
  865. typedef struct CvBox2D
  866. {
  867.     CvPoint2D32f center;  /* Center of the box.                          */
  868.     CvSize2D32f  size;    /* Box width and length.                       */
  869.     float angle;          /* Angle between the horizontal axis           */
  870.                           /* and the first side (i.e. length) in degrees */
  871. }
  872. CvBox2D;
  873. /* Line iterator state: */
  874. typedef struct CvLineIterator
  875. {
  876.     /* Pointer to the current point: */
  877.     uchar* ptr;
  878.     /* Bresenham algorithm state: */
  879.     int  err;
  880.     int  plus_delta;
  881.     int  minus_delta;
  882.     int  plus_step;
  883.     int  minus_step;
  884. }
  885. CvLineIterator;
  886. /************************************* CvSlice ******************************************/
  887. typedef struct CvSlice
  888. {
  889.     int  start_index, end_index;
  890. }
  891. CvSlice;
  892. CV_INLINE  CvSlice  cvSlice( int start, int end )
  893. {
  894.     CvSlice slice;
  895.     slice.start_index = start;
  896.     slice.end_index = end;
  897.     return slice;
  898. }
  899. #define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
  900. #define CV_WHOLE_SEQ  cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
  901. /************************************* CvScalar *****************************************/
  902. typedef struct CvScalar
  903. {
  904.     double val[4];
  905. }
  906. CvScalar;
  907. CV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),
  908.                                double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
  909. {
  910.     CvScalar scalar;
  911.     scalar.val[0] = val0; scalar.val[1] = val1;
  912.     scalar.val[2] = val2; scalar.val[3] = val3;
  913.     return scalar;
  914. }
  915. CV_INLINE  CvScalar  cvRealScalar( double val0 )
  916. {
  917.     CvScalar scalar;
  918.     scalar.val[0] = val0;
  919.     scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
  920.     return scalar;
  921. }
  922. CV_INLINE  CvScalar  cvScalarAll( double val0123 )
  923. {
  924.     CvScalar scalar;
  925.     scalar.val[0] = val0123;
  926.     scalar.val[1] = val0123;
  927.     scalar.val[2] = val0123;
  928.     scalar.val[3] = val0123;
  929.     return scalar;
  930. }
  931. /****************************************************************************************
  932. *                                   Dynamic Data structures                              *
  933. ****************************************************************************************/
  934. /******************************** Memory storage ****************************************/
  935. typedef struct CvMemBlock
  936. {
  937.     struct CvMemBlock*  prev;
  938.     struct CvMemBlock*  next;
  939. }
  940. CvMemBlock;
  941. #define CV_STORAGE_MAGIC_VAL    0x42890000
  942. typedef struct CvMemStorage
  943. {
  944.     int signature;
  945.     CvMemBlock* bottom;           /* First allocated block.                   */
  946.     CvMemBlock* top;              /* Current memory block - top of the stack. */
  947.     struct  CvMemStorage* parent; /* We get new blocks from parent as needed. */
  948.     int block_size;               /* Block size.                              */
  949.     int free_space;               /* Remaining free space in current block.   */
  950. }
  951. CvMemStorage;
  952. #define CV_IS_STORAGE(storage)  
  953.     ((storage) != NULL &&       
  954.     (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)
  955. typedef struct CvMemStoragePos
  956. {
  957.     CvMemBlock* top;
  958.     int free_space;
  959. }
  960. CvMemStoragePos;
  961. /*********************************** Sequence *******************************************/
  962. typedef struct CvSeqBlock
  963. {
  964.     struct CvSeqBlock*  prev; /* Previous sequence block.                   */
  965.     struct CvSeqBlock*  next; /* Next sequence block.                       */
  966.   int    start_index;         /* Index of the first element in the block +  */
  967.                               /* sequence->first->start_index.              */
  968.     int    count;             /* Number of elements in the block.           */
  969.     schar* data;              /* Pointer to the first element of the block. */
  970. }
  971. CvSeqBlock;
  972. #define CV_TREE_NODE_FIELDS(node_type)                               
  973.     int       flags;             /* Miscellaneous flags.     */      
  974.     int       header_size;       /* Size of sequence header. */      
  975.     struct    node_type* h_prev; /* Previous sequence.       */      
  976.     struct    node_type* h_next; /* Next sequence.           */      
  977.     struct    node_type* v_prev; /* 2nd previous sequence.   */      
  978.     struct    node_type* v_next  /* 2nd next sequence.       */
  979. /*
  980.    Read/Write sequence.
  981.    Elements can be dynamically inserted to or deleted from the sequence.
  982. */
  983. #define CV_SEQUENCE_FIELDS()                                              
  984.     CV_TREE_NODE_FIELDS(CvSeq);                                           
  985.     int       total;          /* Total number of elements.            */  
  986.     int       elem_size;      /* Size of sequence element in bytes.   */  
  987.     schar*    block_max;      /* Maximal bound of the last block.     */  
  988.     schar*    ptr;            /* Current write pointer.               */  
  989.     int       delta_elems;    /* Grow seq this many at a time.        */  
  990.     CvMemStorage* storage;    /* Where the seq is stored.             */  
  991.     CvSeqBlock* free_blocks;  /* Free blocks list.                    */  
  992.     CvSeqBlock* first;        /* Pointer to the first sequence block. */
  993. typedef struct CvSeq
  994. {
  995.     CV_SEQUENCE_FIELDS()
  996. }
  997. CvSeq;
  998. #define CV_TYPE_NAME_SEQ             "opencv-sequence"
  999. #define CV_TYPE_NAME_SEQ_TREE        "opencv-sequence-tree"
  1000. /*************************************** Set ********************************************/
  1001. /*
  1002.   Set.
  1003.   Order is not preserved. There can be gaps between sequence elements.
  1004.   After the element has been inserted it stays in the same place all the time.
  1005.   The MSB(most-significant or sign bit) of the first field (flags) is 0 iff the element exists.
  1006. */
  1007. #define CV_SET_ELEM_FIELDS(elem_type)   
  1008.     int  flags;                         
  1009.     struct elem_type* next_free;
  1010. typedef struct CvSetElem
  1011. {
  1012.     CV_SET_ELEM_FIELDS(CvSetElem)
  1013. }
  1014. CvSetElem;
  1015. #define CV_SET_FIELDS()      
  1016.     CV_SEQUENCE_FIELDS()     
  1017.     CvSetElem* free_elems;   
  1018.     int active_count;
  1019. typedef struct CvSet
  1020. {
  1021.     CV_SET_FIELDS()
  1022. }
  1023. CvSet;
  1024. #define CV_SET_ELEM_IDX_MASK   ((1 << 26) - 1)
  1025. #define CV_SET_ELEM_FREE_FLAG  (1 << (sizeof(int)*8-1))
  1026. /* Checks whether the element pointed by ptr belongs to a set or not */
  1027. #define CV_IS_SET_ELEM( ptr )  (((CvSetElem*)(ptr))->flags >= 0)
  1028. /************************************* Graph ********************************************/
  1029. /*
  1030.   We represent a graph as a set of vertices.
  1031.   Vertices contain their adjacency lists (more exactly, pointers to first incoming or
  1032.   outcoming edge (or 0 if isolated vertex)). Edges are stored in another set.
  1033.   There is a singly-linked list of incoming/outcoming edges for each vertex.
  1034.   Each edge consists of
  1035.      o   Two pointers to the starting and ending vertices
  1036.          (vtx[0] and vtx[1] respectively).
  1037.  A graph may be oriented or not. In the latter case, edges between
  1038.  vertex i to vertex j are not distinguished during search operations.
  1039.      o   Two pointers to next edges for the starting and ending vertices, where
  1040.          next[0] points to the next edge in the vtx[0] adjacency list and
  1041.          next[1] points to the next edge in the vtx[1] adjacency list.
  1042. */
  1043. #define CV_GRAPH_EDGE_FIELDS()      
  1044.     int flags;                      
  1045.     float weight;                   
  1046.     struct CvGraphEdge* next[2];    
  1047.     struct CvGraphVtx* vtx[2];
  1048. #define CV_GRAPH_VERTEX_FIELDS()    
  1049.     int flags;                      
  1050.     struct CvGraphEdge* first;
  1051. typedef struct CvGraphEdge
  1052. {
  1053.     CV_GRAPH_EDGE_FIELDS()
  1054. }
  1055. CvGraphEdge;
  1056. typedef struct CvGraphVtx
  1057. {
  1058.     CV_GRAPH_VERTEX_FIELDS()
  1059. }
  1060. CvGraphVtx;
  1061. typedef struct CvGraphVtx2D
  1062. {
  1063.     CV_GRAPH_VERTEX_FIELDS()
  1064.     CvPoint2D32f* ptr;
  1065. }
  1066. CvGraphVtx2D;
  1067. /*
  1068.    Graph is "derived" from the set (this is set a of vertices)
  1069.    and includes another set (edges)
  1070. */
  1071. #define  CV_GRAPH_FIELDS()   
  1072.     CV_SET_FIELDS()          
  1073.     CvSet* edges;
  1074. typedef struct CvGraph
  1075. {
  1076.     CV_GRAPH_FIELDS()
  1077. }
  1078. CvGraph;
  1079. #define CV_TYPE_NAME_GRAPH "opencv-graph"
  1080. /*********************************** Chain/Countour *************************************/
  1081. typedef struct CvChain
  1082. {
  1083.     CV_SEQUENCE_FIELDS()
  1084.     CvPoint  origin;
  1085. }
  1086. CvChain;
  1087. #define CV_CONTOUR_FIELDS()  
  1088.     CV_SEQUENCE_FIELDS()     
  1089.     CvRect rect;             
  1090.     int color;               
  1091.     int reserved[3];
  1092. typedef struct CvContour
  1093. {
  1094.     CV_CONTOUR_FIELDS()
  1095. }
  1096. CvContour;
  1097. typedef CvContour CvPoint2DSeq;
  1098. /****************************************************************************************
  1099. *                                    Sequence types                                      *
  1100. ****************************************************************************************/
  1101. #define CV_SEQ_MAGIC_VAL             0x42990000
  1102. #define CV_IS_SEQ(seq) 
  1103.     ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)
  1104. #define CV_SET_MAGIC_VAL             0x42980000
  1105. #define CV_IS_SET(set) 
  1106.     ((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL)
  1107. #define CV_SEQ_ELTYPE_BITS           9
  1108. #define CV_SEQ_ELTYPE_MASK           ((1 << CV_SEQ_ELTYPE_BITS) - 1)
  1109. #define CV_SEQ_ELTYPE_POINT          CV_32SC2  /* (x,y) */
  1110. #define CV_SEQ_ELTYPE_CODE           CV_8UC1   /* freeman code: 0..7 */
  1111. #define CV_SEQ_ELTYPE_GENERIC        0
  1112. #define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1
  1113. #define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /* &(x,y) */
  1114. #define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /* #(x,y) */
  1115. #define CV_SEQ_ELTYPE_GRAPH_EDGE     0  /* &next_o, &next_d, &vtx_o, &vtx_d */
  1116. #define CV_SEQ_ELTYPE_GRAPH_VERTEX   0  /* first_edge, &(x,y) */
  1117. #define CV_SEQ_ELTYPE_TRIAN_ATR      0  /* vertex of the binary tree   */
  1118. #define CV_SEQ_ELTYPE_CONNECTED_COMP 0  /* connected component  */
  1119. #define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /* (x,y,z)  */
  1120. #define CV_SEQ_KIND_BITS        3
  1121. #define CV_SEQ_KIND_MASK        (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)
  1122. /* types of sequences */
  1123. #define CV_SEQ_KIND_GENERIC     (0 << CV_SEQ_ELTYPE_BITS)
  1124. #define CV_SEQ_KIND_CURVE       (1 << CV_SEQ_ELTYPE_BITS)
  1125. #define CV_SEQ_KIND_BIN_TREE    (2 << CV_SEQ_ELTYPE_BITS)
  1126. /* types of sparse sequences (sets) */
  1127. #define CV_SEQ_KIND_GRAPH       (3 << CV_SEQ_ELTYPE_BITS)
  1128. #define CV_SEQ_KIND_SUBDIV2D    (4 << CV_SEQ_ELTYPE_BITS)
  1129. #define CV_SEQ_FLAG_SHIFT       (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)
  1130. /* flags for curves */
  1131. #define CV_SEQ_FLAG_CLOSED     (1 << CV_SEQ_FLAG_SHIFT)
  1132. #define CV_SEQ_FLAG_SIMPLE     (2 << CV_SEQ_FLAG_SHIFT)
  1133. #define CV_SEQ_FLAG_CONVEX     (4 << CV_SEQ_FLAG_SHIFT)
  1134. #define CV_SEQ_FLAG_HOLE       (8 << CV_SEQ_FLAG_SHIFT)
  1135. /* flags for graphs */
  1136. #define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)
  1137. #define CV_GRAPH               CV_SEQ_KIND_GRAPH
  1138. #define CV_ORIENTED_GRAPH      (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)
  1139. /* point sets */
  1140. #define CV_SEQ_POINT_SET       (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT)
  1141. #define CV_SEQ_POINT3D_SET     (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT3D)
  1142. #define CV_SEQ_POLYLINE        (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_POINT)
  1143. #define CV_SEQ_POLYGON         (CV_SEQ_FLAG_CLOSED | CV_SEQ_POLYLINE )
  1144. #define CV_SEQ_CONTOUR         CV_SEQ_POLYGON
  1145. #define CV_SEQ_SIMPLE_POLYGON  (CV_SEQ_FLAG_SIMPLE | CV_SEQ_POLYGON  )
  1146. /* chain-coded curves */
  1147. #define CV_SEQ_CHAIN           (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_CODE)
  1148. #define CV_SEQ_CHAIN_CONTOUR   (CV_SEQ_FLAG_CLOSED | CV_SEQ_CHAIN)
  1149. /* binary tree for the contour */
  1150. #define CV_SEQ_POLYGON_TREE    (CV_SEQ_KIND_BIN_TREE  | CV_SEQ_ELTYPE_TRIAN_ATR)
  1151. /* sequence of the connected components */
  1152. #define CV_SEQ_CONNECTED_COMP  (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_CONNECTED_COMP)
  1153. /* sequence of the integer numbers */
  1154. #define CV_SEQ_INDEX           (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_INDEX)
  1155. #define CV_SEQ_ELTYPE( seq )   ((seq)->flags & CV_SEQ_ELTYPE_MASK)
  1156. #define CV_SEQ_KIND( seq )     ((seq)->flags & CV_SEQ_KIND_MASK )
  1157. /* flag checking */
  1158. #define CV_IS_SEQ_INDEX( seq )      ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && 
  1159.                                      (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))
  1160. #define CV_IS_SEQ_CURVE( seq )      (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE)
  1161. #define CV_IS_SEQ_CLOSED( seq )     (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0)
  1162. #define CV_IS_SEQ_CONVEX( seq )     (((seq)->flags & CV_SEQ_FLAG_CONVEX) != 0)
  1163. #define CV_IS_SEQ_HOLE( seq )       (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0)
  1164. #define CV_IS_SEQ_SIMPLE( seq )     ((((seq)->flags & CV_SEQ_FLAG_SIMPLE) != 0) || 
  1165.                                     CV_IS_SEQ_CONVEX(seq))
  1166. /* type checking macros */
  1167. #define CV_IS_SEQ_POINT_SET( seq ) 
  1168.     ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))
  1169. #define CV_IS_SEQ_POINT_SUBSET( seq ) 
  1170.     (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)
  1171. #define CV_IS_SEQ_POLYLINE( seq )   
  1172.     (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))
  1173. #define CV_IS_SEQ_POLYGON( seq )   
  1174.     (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))
  1175. #define CV_IS_SEQ_CHAIN( seq )   
  1176.     (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)
  1177. #define CV_IS_SEQ_CONTOUR( seq )   
  1178.     (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))
  1179. #define CV_IS_SEQ_CHAIN_CONTOUR( seq ) 
  1180.     (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))
  1181. #define CV_IS_SEQ_POLYGON_TREE( seq ) 
  1182.     (CV_SEQ_ELTYPE (seq) ==  CV_SEQ_ELTYPE_TRIAN_ATR &&    
  1183.     CV_SEQ_KIND( seq ) ==  CV_SEQ_KIND_BIN_TREE )
  1184. #define CV_IS_GRAPH( seq )    
  1185.     (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)
  1186. #define CV_IS_GRAPH_ORIENTED( seq )   
  1187.     (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)
  1188. #define CV_IS_SUBDIV2D( seq )  
  1189.     (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)
  1190. /****************************************************************************************/
  1191. /*                            Sequence writer & reader                                  */
  1192. /****************************************************************************************/
  1193. #define CV_SEQ_WRITER_FIELDS()                                     
  1194.     int          header_size;                                      
  1195.     CvSeq*       seq;        /* the sequence written */            
  1196.     CvSeqBlock*  block;      /* current block */                   
  1197.     schar*       ptr;        /* pointer to free space */           
  1198.     schar*       block_min;  /* pointer to the beginning of block*/
  1199.     schar*       block_max;  /* pointer to the end of block */
  1200. typedef struct CvSeqWriter
  1201. {
  1202.     CV_SEQ_WRITER_FIELDS()
  1203. }
  1204. CvSeqWriter;
  1205. #define CV_SEQ_READER_FIELDS()                                      
  1206.     int          header_size;                                       
  1207.     CvSeq*       seq;        /* sequence, beign read */             
  1208.     CvSeqBlock*  block;      /* current block */                    
  1209.     schar*       ptr;        /* pointer to element be read next */  
  1210.     schar*       block_min;  /* pointer to the beginning of block */
  1211.     schar*       block_max;  /* pointer to the end of block */      
  1212.     int          delta_index;/* = seq->first->start_index   */      
  1213.     schar*       prev_elem;  /* pointer to previous element */
  1214. typedef struct CvSeqReader
  1215. {
  1216.     CV_SEQ_READER_FIELDS()
  1217. }
  1218. CvSeqReader;
  1219. /****************************************************************************************/
  1220. /*                                Operations on sequences                               */
  1221. /****************************************************************************************/
  1222. #define  CV_SEQ_ELEM( seq, elem_type, index )                    
  1223. /* assert gives some guarantee that <seq> parameter is valid */  
  1224. (   assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) &&      
  1225.     (seq)->elem_size == sizeof(elem_type)),                      
  1226.     (elem_type*)((seq)->first && (unsigned)index <               
  1227.     (unsigned)((seq)->first->count) ?                            
  1228.     (seq)->first->data + (index) * sizeof(elem_type) :           
  1229.     cvGetSeqElem( (CvSeq*)(seq), (index) )))
  1230. #define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )
  1231. /* Add element to sequence: */
  1232. #define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer )     
  1233. {                                                     
  1234.     if( (writer).ptr >= (writer).block_max )          
  1235.     {                                                 
  1236.         cvCreateSeqBlock( &writer);                   
  1237.     }                                                 
  1238.     memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);
  1239.     (writer).ptr += (writer).seq->elem_size;          
  1240. }
  1241. #define CV_WRITE_SEQ_ELEM( elem, writer )             
  1242. {                                                     
  1243.     assert( (writer).seq->elem_size == sizeof(elem)); 
  1244.     if( (writer).ptr >= (writer).block_max )          
  1245.     {                                                 
  1246.         cvCreateSeqBlock( &writer);                   
  1247.     }                                                 
  1248.     assert( (writer).ptr <= (writer).block_max - sizeof(elem));
  1249.     memcpy((writer).ptr, &(elem), sizeof(elem));      
  1250.     (writer).ptr += sizeof(elem);                     
  1251. }
  1252. /* Move reader position forward: */
  1253. #define CV_NEXT_SEQ_ELEM( elem_size, reader )                 
  1254. {                                                             
  1255.     if( ((reader).ptr += (elem_size)) >= (reader).block_max ) 
  1256.     {                                                         
  1257.         cvChangeSeqBlock( &(reader), 1 );                     
  1258.     }                                                         
  1259. }
  1260. /* Move reader position backward: */
  1261. #define CV_PREV_SEQ_ELEM( elem_size, reader )                
  1262. {                                                            
  1263.     if( ((reader).ptr -= (elem_size)) < (reader).block_min ) 
  1264.     {                                                        
  1265.         cvChangeSeqBlock( &(reader), -1 );                   
  1266.     }                                                        
  1267. }
  1268. /* Read element and move read position forward: */
  1269. #define CV_READ_SEQ_ELEM( elem, reader )                       
  1270. {                                                              
  1271.     assert( (reader).seq->elem_size == sizeof(elem));          
  1272.     memcpy( &(elem), (reader).ptr, sizeof((elem)));            
  1273.     CV_NEXT_SEQ_ELEM( sizeof(elem), reader )                   
  1274. }
  1275. /* Read element and move read position backward: */
  1276. #define CV_REV_READ_SEQ_ELEM( elem, reader )                     
  1277. {                                                                
  1278.     assert( (reader).seq->elem_size == sizeof(elem));            
  1279.     memcpy(&(elem), (reader).ptr, sizeof((elem)));               
  1280.     CV_PREV_SEQ_ELEM( sizeof(elem), reader )                     
  1281. }
  1282. #define CV_READ_CHAIN_POINT( _pt, reader )                              
  1283. {                                                                       
  1284.     (_pt) = (reader).pt;                                                
  1285.     if( (reader).ptr )                                                  
  1286.     {                                                                   
  1287.         CV_READ_SEQ_ELEM( (reader).code, (reader));                     
  1288.         assert( ((reader).code & ~7) == 0 );                            
  1289.         (reader).pt.x += (reader).deltas[(int)(reader).code][0];        
  1290.         (reader).pt.y += (reader).deltas[(int)(reader).code][1];        
  1291.     }                                                                   
  1292. }
  1293. #define CV_CURRENT_POINT( reader )  (*((CvPoint*)((reader).ptr)))
  1294. #define CV_PREV_POINT( reader )     (*((CvPoint*)((reader).prev_elem)))
  1295. #define CV_READ_EDGE( pt1, pt2, reader )               
  1296. {                                                      
  1297.     assert( sizeof(pt1) == sizeof(CvPoint) &&          
  1298.             sizeof(pt2) == sizeof(CvPoint) &&          
  1299.             reader.seq->elem_size == sizeof(CvPoint)); 
  1300.     (pt1) = CV_PREV_POINT( reader );                   
  1301.     (pt2) = CV_CURRENT_POINT( reader );                
  1302.     (reader).prev_elem = (reader).ptr;                 
  1303.     CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader));      
  1304. }
  1305. /************ Graph macros ************/
  1306. /* Return next graph edge for given vertex: */
  1307. #define  CV_NEXT_GRAPH_EDGE( edge, vertex )                              
  1308.      (assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)),  
  1309.       (edge)->next[(edge)->vtx[1] == (vertex)])
  1310. /****************************************************************************************
  1311. *             Data structures for persistence (a.k.a serialization) functionality        *
  1312. ****************************************************************************************/
  1313. /* "black box" file storage */
  1314. typedef struct CvFileStorage CvFileStorage;
  1315. /* Storage flags: */
  1316. #define CV_STORAGE_READ          0
  1317. #define CV_STORAGE_WRITE         1
  1318. #define CV_STORAGE_WRITE_TEXT    CV_STORAGE_WRITE
  1319. #define CV_STORAGE_WRITE_BINARY  CV_STORAGE_WRITE
  1320. #define CV_STORAGE_APPEND        2
  1321. /* List of attributes: */
  1322. typedef struct CvAttrList
  1323. {
  1324.     const char** attr;         /* NULL-terminated array of (attribute_name,attribute_value) pairs. */
  1325.     struct CvAttrList* next;   /* Pointer to next chunk of the attributes list.                    */
  1326. }
  1327. CvAttrList;
  1328. CV_INLINE CvAttrList cvAttrList( const char** attr CV_DEFAULT(NULL),
  1329.                                  CvAttrList* next CV_DEFAULT(NULL) )
  1330. {
  1331.     CvAttrList l;
  1332.     l.attr = attr;
  1333.     l.next = next;
  1334.     return l;
  1335. }
  1336. struct CvTypeInfo;
  1337. #define CV_NODE_NONE        0
  1338. #define CV_NODE_INT         1
  1339. #define CV_NODE_INTEGER     CV_NODE_INT
  1340. #define CV_NODE_REAL        2
  1341. #define CV_NODE_FLOAT       CV_NODE_REAL
  1342. #define CV_NODE_STR         3
  1343. #define CV_NODE_STRING      CV_NODE_STR
  1344. #define CV_NODE_REF         4 /* not used */
  1345. #define CV_NODE_SEQ         5
  1346. #define CV_NODE_MAP         6
  1347. #define CV_NODE_TYPE_MASK   7
  1348. #define CV_NODE_TYPE(flags)  ((flags) & CV_NODE_TYPE_MASK)
  1349. /* file node flags */
  1350. #define CV_NODE_FLOW        8 /* Used only for writing structures in YAML format. */
  1351. #define CV_NODE_USER        16
  1352. #define CV_NODE_EMPTY       32
  1353. #define CV_NODE_NAMED       64
  1354. #define CV_NODE_IS_INT(flags)        (CV_NODE_TYPE(flags) == CV_NODE_INT)
  1355. #define CV_NODE_IS_REAL(flags)       (CV_NODE_TYPE(flags) == CV_NODE_REAL)
  1356. #define CV_NODE_IS_STRING(flags)     (CV_NODE_TYPE(flags) == CV_NODE_STRING)
  1357. #define CV_NODE_IS_SEQ(flags)        (CV_NODE_TYPE(flags) == CV_NODE_SEQ)
  1358. #define CV_NODE_IS_MAP(flags)        (CV_NODE_TYPE(flags) == CV_NODE_MAP)
  1359. #define CV_NODE_IS_COLLECTION(flags) (CV_NODE_TYPE(flags) >= CV_NODE_SEQ)
  1360. #define CV_NODE_IS_FLOW(flags)       (((flags) & CV_NODE_FLOW) != 0)
  1361. #define CV_NODE_IS_EMPTY(flags)      (((flags) & CV_NODE_EMPTY) != 0)
  1362. #define CV_NODE_IS_USER(flags)       (((flags) & CV_NODE_USER) != 0)
  1363. #define CV_NODE_HAS_NAME(flags)      (((flags) & CV_NODE_NAMED) != 0)
  1364. #define CV_NODE_SEQ_SIMPLE 256
  1365. #define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)
  1366. typedef struct CvString
  1367. {
  1368.     int len;
  1369.     char* ptr;
  1370. }
  1371. CvString;
  1372. /* All the keys (names) of elements in the readed file storage
  1373.    are stored in the hash to speed up the lookup operations: */
  1374. typedef struct CvStringHashNode
  1375. {
  1376.     unsigned hashval;
  1377.     CvString str;
  1378.     struct CvStringHashNode* next;
  1379. }
  1380. CvStringHashNode;
  1381. typedef struct CvGenericHash CvFileNodeHash;
  1382. /* Basic element of the file storage - scalar or collection: */
  1383. typedef struct CvFileNode
  1384. {
  1385.     int tag;
  1386.     struct CvTypeInfo* info; /* type information
  1387.             (only for user-defined object, for others it is 0) */
  1388.     union
  1389.     {
  1390.         double f; /* scalar floating-point number */
  1391.         int i;    /* scalar integer number */
  1392.         CvString str; /* text string */
  1393.         CvSeq* seq; /* sequence (ordered collection of file nodes) */
  1394.         CvFileNodeHash* map; /* map (collection of named file nodes) */
  1395.     } data;
  1396. }
  1397. CvFileNode;
  1398. #ifdef __cplusplus
  1399. extern "C" {
  1400. #endif
  1401. typedef int (CV_CDECL *CvIsInstanceFunc)( const void* struct_ptr );
  1402. typedef void (CV_CDECL *CvReleaseFunc)( void** struct_dblptr );
  1403. typedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node );
  1404. typedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name,
  1405.                                       const void* struct_ptr, CvAttrList attributes );
  1406. typedef void* (CV_CDECL *CvCloneFunc)( const void* struct_ptr );
  1407. #ifdef __cplusplus
  1408. }
  1409. #endif
  1410. typedef struct CvTypeInfo
  1411. {
  1412.     int flags;
  1413.     int header_size;
  1414.     struct CvTypeInfo* prev;
  1415.     struct CvTypeInfo* next;
  1416.     const char* type_name;
  1417.     CvIsInstanceFunc is_instance;
  1418.     CvReleaseFunc release;
  1419.     CvReadFunc read;
  1420.     CvWriteFunc write;
  1421.     CvCloneFunc clone;
  1422. }
  1423. CvTypeInfo;
  1424. /**** System data types ******/
  1425. typedef struct CvPluginFuncInfo
  1426. {
  1427.     void** func_addr;
  1428.     void* default_func_addr;
  1429.     const char* func_names;
  1430.     int search_modules;
  1431.     int loaded_from;
  1432. }
  1433. CvPluginFuncInfo;
  1434. typedef struct CvModuleInfo
  1435. {
  1436.     struct CvModuleInfo* next;
  1437.     const char* name;
  1438.     const char* version;
  1439.     CvPluginFuncInfo* func_tab;
  1440. }
  1441. CvModuleInfo;
  1442. #endif /*_CXCORE_TYPES_H_*/
  1443. /* End of file. */