43 #ifndef __OPENCV_CORE_TYPES_H__
44 #define __OPENCV_CORE_TYPES_H__
46 #if !defined _CRT_SECURE_NO_DEPRECATE && _MSC_VER > 1300
47 #define _CRT_SECURE_NO_DEPRECATE
57 #if !defined _MSC_VER && !defined __BORLANDC__
69 #elif defined __INTEL_COMPILER
70 #define CV_ICC __INTEL_COMPILER
73 #if (_MSC_VER >= 1400 && defined _M_X64) || (__GNUC__ >= 4 && defined __x86_64__)
77 #include <emmintrin.h>
80 #if defined __BORLANDC__
88 #if defined WIN32 || defined _WIN32
94 #elif defined __IPL_H__
97 #endif // SKIP_INCLUDES
99 #if defined WIN32 || defined _WIN32
100 #define CV_CDECL __cdecl
101 #define CV_STDCALL __stdcall
109 #define CV_EXTERN_C extern "C"
110 #define CV_DEFAULT(val) = val
113 #define CV_DEFAULT(val)
117 #ifndef CV_EXTERN_C_FUNCPTR
119 #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
121 #define CV_EXTERN_C_FUNCPTR(x) typedef x
126 #if defined __cplusplus
127 #define CV_INLINE inline
128 #elif (defined WIN32 || defined _WIN32 || defined WINCE) && !defined __GNUC__
129 #define CV_INLINE __inline
131 #define CV_INLINE static
135 #if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
136 #define CV_EXPORTS __declspec(dllexport)
142 #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
145 #if defined _MSC_VER || defined __BORLANDC__
146 typedef __int64
int64;
147 typedef unsigned __int64
uint64;
161 #define CV_CARRAY(counter)
162 #define CV_CUSTOM_CARRAY(args)
163 #define CV_EXPORTS_W CV_EXPORTS
164 #define CV_EXPORTS_W_SIMPLE CV_EXPORTS
165 #define CV_EXPORTS_AS(synonym) CV_EXPORTS
166 #define CV_EXPORTS_W_MAP CV_EXPORTS
172 #define CV_WRAP_AS(synonym)
173 #define CV_WRAP_DEFAULT(value)
257 #define CV_PI 3.1415926535897932384626433832795
258 #define CV_LOG2 0.69314718055994530941723212145818
260 #define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
263 #define MIN(a,b) ((a) > (b) ? (b) : (a))
267 #define MAX(a,b) ((a) < (b) ? (b) : (a))
271 #define CV_IMIN(a, b) ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))
273 #define CV_IMAX(a, b) ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))
277 #define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
279 #define CV_IABS(a) abs(a)
281 #define CV_CMP(a,b) (((a) > (b)) - ((a) < (b)))
282 #define CV_SIGN(a) CV_CMP((a),0)
286 #if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ && !defined __APPLE__)
287 __m128d t = _mm_set_sd( value );
288 return _mm_cvtsd_si32(t);
289 #elif defined _MSC_VER && defined _M_IX86
297 #elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__
298 return (
int)lrint(value);
301 return (
int)(value + (value >= 0 ? 0.5 : -0.5));
310 return i - (i > value);
311 #elif defined _MSC_VER && defined _M_X64
312 __m128d t = _mm_set_sd( value );
313 int i = _mm_cvtsd_si32(t);
314 return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i)));
318 diff.
f = (float)(value - i);
319 return i - (diff.
i < 0);
328 return i + (i < value);
329 #elif defined _MSC_VER && defined _M_X64
330 __m128d t = _mm_set_sd( value );
331 int i = _mm_cvtsd_si32(t);
332 return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t));
336 diff.
f = (float)(i - value);
337 return i + (diff.
i < 0);
341 #define cvInvSqrt(value) ((float)(1./sqrt(value)))
342 #define cvSqrt(value) ((float)sqrt(value))
353 return ((
unsigned)(ieee754.
u >> 32) & 0x7fffffff) +
354 ((unsigned)ieee754.
u != 0) > 0x7ff00000;
368 return ((
unsigned)(ieee754.
u >> 32) & 0x7fffffff) == 0x7ff00000 &&
369 (unsigned)ieee754.
u == 0;
388 temp = (
uint64)(
unsigned)temp*4164903690U + (temp >> 32);
390 return (
unsigned)temp;
396 return cvRandInt(rng)*2.3283064365386962890625e-10 ;
410 #define IPL_DEPTH_SIGN 0x80000000
412 #define IPL_DEPTH_1U 1
413 #define IPL_DEPTH_8U 8
414 #define IPL_DEPTH_16U 16
415 #define IPL_DEPTH_32F 32
417 #define IPL_DEPTH_8S (IPL_DEPTH_SIGN| 8)
418 #define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
419 #define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)
421 #define IPL_DATA_ORDER_PIXEL 0
422 #define IPL_DATA_ORDER_PLANE 1
424 #define IPL_ORIGIN_TL 0
425 #define IPL_ORIGIN_BL 1
427 #define IPL_ALIGN_4BYTES 4
428 #define IPL_ALIGN_8BYTES 8
429 #define IPL_ALIGN_16BYTES 16
430 #define IPL_ALIGN_32BYTES 32
432 #define IPL_ALIGN_DWORD IPL_ALIGN_4BYTES
433 #define IPL_ALIGN_QWORD IPL_ALIGN_8BYTES
435 #define IPL_BORDER_CONSTANT 0
436 #define IPL_BORDER_REPLICATE 1
437 #define IPL_BORDER_REFLECT 2
438 #define IPL_BORDER_WRAP 3
508 #define IPL_IMAGE_HEADER 1
509 #define IPL_IMAGE_DATA 2
510 #define IPL_IMAGE_ROI 4
515 #define IPL_BORDER_REFLECT_101 4
516 #define IPL_BORDER_TRANSPARENT 5
518 #define IPL_IMAGE_MAGIC_VAL ((int)sizeof(IplImage))
519 #define CV_TYPE_NAME_IMAGE "opencv-image"
521 #define CV_IS_IMAGE_HDR(img) \
522 ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))
524 #define CV_IS_IMAGE(img) \
525 (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)
529 #define IPL_DEPTH_64F 64
533 #define CV_IMAGE_ELEM( image, elemtype, row, col ) \
534 (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
540 #define CV_CN_MAX 512
541 #define CV_CN_SHIFT 3
542 #define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
551 #define CV_USRTYPE1 7
553 #define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
554 #define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
556 #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
557 #define CV_MAKE_TYPE CV_MAKETYPE
559 #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
560 #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
561 #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
562 #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
563 #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
565 #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
566 #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
567 #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
568 #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
569 #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
571 #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
572 #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
573 #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
574 #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
575 #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
577 #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
578 #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
579 #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
580 #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
581 #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
583 #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
584 #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
585 #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
586 #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
587 #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
589 #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
590 #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
591 #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
592 #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
593 #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
595 #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
596 #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
597 #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
598 #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
599 #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
601 #define CV_AUTO_STEP 0x7fffffff
602 #define CV_WHOLE_ARR cvSlice( 0, 0x3fffffff )
604 #define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT)
605 #define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
606 #define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1)
607 #define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK)
608 #define CV_MAT_CONT_FLAG_SHIFT 14
609 #define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT)
610 #define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG)
611 #define CV_IS_CONT_MAT CV_IS_MAT_CONT
612 #define CV_SUBMAT_FLAG_SHIFT 15
613 #define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT)
614 #define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG)
616 #define CV_MAGIC_MASK 0xFFFF0000
617 #define CV_MAT_MAGIC_VAL 0x42420000
618 #define CV_TYPE_NAME_MAT "opencv-matrix"
659 #define CV_IS_MAT_HDR(mat) \
661 (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \
662 ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)
664 #define CV_IS_MAT_HDR_Z(mat) \
666 (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \
667 ((const CvMat*)(mat))->cols >= 0 && ((const CvMat*)(mat))->rows >= 0)
669 #define CV_IS_MAT(mat) \
670 (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)
672 #define CV_IS_MASK_ARR(mat) \
673 (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)
675 #define CV_ARE_TYPES_EQ(mat1, mat2) \
676 ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)
678 #define CV_ARE_CNS_EQ(mat1, mat2) \
679 ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)
681 #define CV_ARE_DEPTHS_EQ(mat1, mat2) \
682 ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)
684 #define CV_ARE_SIZES_EQ(mat1, mat2) \
685 ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)
687 #define CV_IS_MAT_CONST(mat) \
688 (((mat)->rows|(mat)->cols) == 1)
692 #define CV_ELEM_SIZE1(type) \
693 ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
696 #define CV_ELEM_SIZE(type) \
697 (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
699 #define IPL2CV_DEPTH(depth) \
700 ((((CV_8U)+(CV_16U<<4)+(CV_32F<<8)+(CV_64F<<16)+(CV_8S<<20)+ \
701 (CV_16S<<24)+(CV_32S<<28)) >> ((((depth) & 0xF0) >> 2) + \
702 (((depth) & IPL_DEPTH_SIGN) ? 20 : 0))) & 15)
726 #define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size ) \
727 (assert( (unsigned)(row) < (unsigned)(mat).rows && \
728 (unsigned)(col) < (unsigned)(mat).cols ), \
729 (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
731 #define CV_MAT_ELEM_PTR( mat, row, col ) \
732 CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )
734 #define CV_MAT_ELEM( mat, elemtype, row, col ) \
735 (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
743 assert( (
unsigned)row < (
unsigned)mat->
rows &&
744 (
unsigned)col < (
unsigned)mat->
cols );
747 return ((
float*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col];
751 return ((
double*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col];
760 assert( (
unsigned)row < (
unsigned)mat->
rows &&
761 (
unsigned)col < (
unsigned)mat->
cols );
764 ((
float*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col] = (float)value;
768 ((
double*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col] = (double)value;
785 #define CV_MATND_MAGIC_VAL 0x42430000
786 #define CV_TYPE_NAME_MATND "opencv-nd-matrix"
788 #define CV_MAX_DIM 32
789 #define CV_MAX_DIM_HEAP (1 << 16)
817 #define CV_IS_MATND_HDR(mat) \
818 ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)
820 #define CV_IS_MATND(mat) \
821 (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)
828 #define CV_SPARSE_MAT_MAGIC_VAL 0x42440000
829 #define CV_TYPE_NAME_SPARSE_MAT "opencv-sparse-matrix"
849 #define CV_IS_SPARSE_MAT_HDR(mat) \
851 (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)
853 #define CV_IS_SPARSE_MAT(mat) \
854 CV_IS_SPARSE_MAT_HDR(mat)
873 #define CV_NODE_VAL(mat,node) ((void*)((uchar*)(node) + (mat)->valoffset))
874 #define CV_NODE_IDX(mat,node) ((int*)((uchar*)(node) + (mat)->idxoffset))
882 #define CV_HIST_MAGIC_VAL 0x42450000
883 #define CV_HIST_UNIFORM_FLAG (1 << 10)
886 #define CV_HIST_RANGES_FLAG (1 << 11)
888 #define CV_HIST_ARRAY 0
889 #define CV_HIST_SPARSE 1
890 #define CV_HIST_TREE CV_HIST_SPARSE
894 #define CV_HIST_UNIFORM 1
906 #define CV_IS_HIST( hist ) \
908 (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \
909 (hist)->bins != NULL)
911 #define CV_IS_UNIFORM_HIST( hist ) \
912 (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)
914 #define CV_IS_SPARSE_HIST( hist ) \
915 CV_IS_SPARSE_MAT((hist)->bins)
917 #define CV_HIST_HAS_RANGES( hist ) \
918 (((hist)->type & CV_HIST_RANGES_FLAG) != 0)
968 #define CV_TERMCRIT_ITER 1
969 #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER
970 #define CV_TERMCRIT_EPS 2
1142 s.
width = (float)width;
1143 s.
height = (float)height;
1192 #define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
1193 #define CV_WHOLE_SEQ cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
1208 scalar.
val[0] = val0; scalar.
val[1] = val1;
1209 scalar.
val[2] = val2; scalar.
val[3] = val3;
1217 scalar.
val[0] = val0;
1218 scalar.
val[1] = scalar.
val[2] = scalar.
val[3] = 0;
1225 scalar.
val[0] = val0123;
1226 scalar.
val[1] = val0123;
1227 scalar.
val[2] = val0123;
1228 scalar.
val[3] = val0123;
1245 #define CV_STORAGE_MAGIC_VAL 0x42890000
1258 #define CV_IS_STORAGE(storage) \
1259 ((storage) != NULL && \
1260 (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)
1285 #define CV_TREE_NODE_FIELDS(node_type) \
1288 struct node_type* h_prev; \
1289 struct node_type* h_next; \
1290 struct node_type* v_prev; \
1291 struct node_type* v_next
1297 #define CV_SEQUENCE_FIELDS() \
1298 CV_TREE_NODE_FIELDS(CvSeq); \
1304 CvMemStorage* storage; \
1305 CvSeqBlock* free_blocks; \
1314 #define CV_TYPE_NAME_SEQ "opencv-sequence"
1315 #define CV_TYPE_NAME_SEQ_TREE "opencv-sequence-tree"
1324 #define CV_SET_ELEM_FIELDS(elem_type) \
1326 struct elem_type* next_free;
1334 #define CV_SET_FIELDS() \
1335 CV_SEQUENCE_FIELDS() \
1336 CvSetElem* free_elems; \
1346 #define CV_SET_ELEM_IDX_MASK ((1 << 26) - 1)
1347 #define CV_SET_ELEM_FREE_FLAG (1 << (sizeof(int)*8-1))
1350 #define CV_IS_SET_ELEM( ptr ) (((CvSetElem*)(ptr))->flags >= 0)
1372 #define CV_GRAPH_EDGE_FIELDS() \
1375 struct CvGraphEdge* next[2]; \
1376 struct CvGraphVtx* vtx[2];
1379 #define CV_GRAPH_VERTEX_FIELDS() \
1381 struct CvGraphEdge* first;
1407 #define CV_GRAPH_FIELDS() \
1417 #define CV_TYPE_NAME_GRAPH "opencv-graph"
1428 #define CV_CONTOUR_FIELDS() \
1429 CV_SEQUENCE_FIELDS() \
1446 #define CV_SEQ_MAGIC_VAL 0x42990000
1448 #define CV_IS_SEQ(seq) \
1449 ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)
1451 #define CV_SET_MAGIC_VAL 0x42980000
1452 #define CV_IS_SET(set) \
1453 ((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL)
1455 #define CV_SEQ_ELTYPE_BITS 12
1456 #define CV_SEQ_ELTYPE_MASK ((1 << CV_SEQ_ELTYPE_BITS) - 1)
1458 #define CV_SEQ_ELTYPE_POINT CV_32SC2
1459 #define CV_SEQ_ELTYPE_CODE CV_8UC1
1460 #define CV_SEQ_ELTYPE_GENERIC 0
1461 #define CV_SEQ_ELTYPE_PTR CV_USRTYPE1
1462 #define CV_SEQ_ELTYPE_PPOINT CV_SEQ_ELTYPE_PTR
1463 #define CV_SEQ_ELTYPE_INDEX CV_32SC1
1464 #define CV_SEQ_ELTYPE_GRAPH_EDGE 0
1465 #define CV_SEQ_ELTYPE_GRAPH_VERTEX 0
1466 #define CV_SEQ_ELTYPE_TRIAN_ATR 0
1467 #define CV_SEQ_ELTYPE_CONNECTED_COMP 0
1468 #define CV_SEQ_ELTYPE_POINT3D CV_32FC3
1470 #define CV_SEQ_KIND_BITS 2
1471 #define CV_SEQ_KIND_MASK (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)
1474 #define CV_SEQ_KIND_GENERIC (0 << CV_SEQ_ELTYPE_BITS)
1475 #define CV_SEQ_KIND_CURVE (1 << CV_SEQ_ELTYPE_BITS)
1476 #define CV_SEQ_KIND_BIN_TREE (2 << CV_SEQ_ELTYPE_BITS)
1479 #define CV_SEQ_KIND_GRAPH (1 << CV_SEQ_ELTYPE_BITS)
1480 #define CV_SEQ_KIND_SUBDIV2D (2 << CV_SEQ_ELTYPE_BITS)
1482 #define CV_SEQ_FLAG_SHIFT (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)
1485 #define CV_SEQ_FLAG_CLOSED (1 << CV_SEQ_FLAG_SHIFT)
1486 #define CV_SEQ_FLAG_SIMPLE (0 << CV_SEQ_FLAG_SHIFT)
1487 #define CV_SEQ_FLAG_CONVEX (0 << CV_SEQ_FLAG_SHIFT)
1488 #define CV_SEQ_FLAG_HOLE (2 << CV_SEQ_FLAG_SHIFT)
1491 #define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)
1493 #define CV_GRAPH CV_SEQ_KIND_GRAPH
1494 #define CV_ORIENTED_GRAPH (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)
1497 #define CV_SEQ_POINT_SET (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT)
1498 #define CV_SEQ_POINT3D_SET (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT3D)
1499 #define CV_SEQ_POLYLINE (CV_SEQ_KIND_CURVE | CV_SEQ_ELTYPE_POINT)
1500 #define CV_SEQ_POLYGON (CV_SEQ_FLAG_CLOSED | CV_SEQ_POLYLINE )
1501 #define CV_SEQ_CONTOUR CV_SEQ_POLYGON
1502 #define CV_SEQ_SIMPLE_POLYGON (CV_SEQ_FLAG_SIMPLE | CV_SEQ_POLYGON )
1505 #define CV_SEQ_CHAIN (CV_SEQ_KIND_CURVE | CV_SEQ_ELTYPE_CODE)
1506 #define CV_SEQ_CHAIN_CONTOUR (CV_SEQ_FLAG_CLOSED | CV_SEQ_CHAIN)
1509 #define CV_SEQ_POLYGON_TREE (CV_SEQ_KIND_BIN_TREE | CV_SEQ_ELTYPE_TRIAN_ATR)
1512 #define CV_SEQ_CONNECTED_COMP (CV_SEQ_KIND_GENERIC | CV_SEQ_ELTYPE_CONNECTED_COMP)
1515 #define CV_SEQ_INDEX (CV_SEQ_KIND_GENERIC | CV_SEQ_ELTYPE_INDEX)
1517 #define CV_SEQ_ELTYPE( seq ) ((seq)->flags & CV_SEQ_ELTYPE_MASK)
1518 #define CV_SEQ_KIND( seq ) ((seq)->flags & CV_SEQ_KIND_MASK )
1521 #define CV_IS_SEQ_INDEX( seq ) ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \
1522 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))
1524 #define CV_IS_SEQ_CURVE( seq ) (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE)
1525 #define CV_IS_SEQ_CLOSED( seq ) (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0)
1526 #define CV_IS_SEQ_CONVEX( seq ) 0
1527 #define CV_IS_SEQ_HOLE( seq ) (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0)
1528 #define CV_IS_SEQ_SIMPLE( seq ) 1
1531 #define CV_IS_SEQ_POINT_SET( seq ) \
1532 ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))
1534 #define CV_IS_SEQ_POINT_SUBSET( seq ) \
1535 (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)
1537 #define CV_IS_SEQ_POLYLINE( seq ) \
1538 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))
1540 #define CV_IS_SEQ_POLYGON( seq ) \
1541 (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))
1543 #define CV_IS_SEQ_CHAIN( seq ) \
1544 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)
1546 #define CV_IS_SEQ_CONTOUR( seq ) \
1547 (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))
1549 #define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \
1550 (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))
1552 #define CV_IS_SEQ_POLYGON_TREE( seq ) \
1553 (CV_SEQ_ELTYPE (seq) == CV_SEQ_ELTYPE_TRIAN_ATR && \
1554 CV_SEQ_KIND( seq ) == CV_SEQ_KIND_BIN_TREE )
1556 #define CV_IS_GRAPH( seq ) \
1557 (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)
1559 #define CV_IS_GRAPH_ORIENTED( seq ) \
1560 (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)
1562 #define CV_IS_SUBDIV2D( seq ) \
1563 (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)
1569 #define CV_SEQ_WRITER_FIELDS() \
1572 CvSeqBlock* block; \
1584 #define CV_SEQ_READER_FIELDS() \
1587 CvSeqBlock* block; \
1605 #define CV_SEQ_ELEM( seq, elem_type, index ) \
1607 ( assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) && \
1608 (seq)->elem_size == sizeof(elem_type)), \
1609 (elem_type*)((seq)->first && (unsigned)index < \
1610 (unsigned)((seq)->first->count) ? \
1611 (seq)->first->data + (index) * sizeof(elem_type) : \
1612 cvGetSeqElem( (CvSeq*)(seq), (index) )))
1613 #define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )
1616 #define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer ) \
1618 if( (writer).ptr >= (writer).block_max ) \
1620 cvCreateSeqBlock( &writer); \
1622 memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\
1623 (writer).ptr += (writer).seq->elem_size; \
1626 #define CV_WRITE_SEQ_ELEM( elem, writer ) \
1628 assert( (writer).seq->elem_size == sizeof(elem)); \
1629 if( (writer).ptr >= (writer).block_max ) \
1631 cvCreateSeqBlock( &writer); \
1633 assert( (writer).ptr <= (writer).block_max - sizeof(elem));\
1634 memcpy((writer).ptr, &(elem), sizeof(elem)); \
1635 (writer).ptr += sizeof(elem); \
1640 #define CV_NEXT_SEQ_ELEM( elem_size, reader ) \
1642 if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \
1644 cvChangeSeqBlock( &(reader), 1 ); \
1650 #define CV_PREV_SEQ_ELEM( elem_size, reader ) \
1652 if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \
1654 cvChangeSeqBlock( &(reader), -1 ); \
1659 #define CV_READ_SEQ_ELEM( elem, reader ) \
1661 assert( (reader).seq->elem_size == sizeof(elem)); \
1662 memcpy( &(elem), (reader).ptr, sizeof((elem))); \
1663 CV_NEXT_SEQ_ELEM( sizeof(elem), reader ) \
1667 #define CV_REV_READ_SEQ_ELEM( elem, reader ) \
1669 assert( (reader).seq->elem_size == sizeof(elem)); \
1670 memcpy(&(elem), (reader).ptr, sizeof((elem))); \
1671 CV_PREV_SEQ_ELEM( sizeof(elem), reader ) \
1675 #define CV_READ_CHAIN_POINT( _pt, reader ) \
1677 (_pt) = (reader).pt; \
1678 if( (reader).ptr ) \
1680 CV_READ_SEQ_ELEM( (reader).code, (reader)); \
1681 assert( ((reader).code & ~7) == 0 ); \
1682 (reader).pt.x += (reader).deltas[(int)(reader).code][0]; \
1683 (reader).pt.y += (reader).deltas[(int)(reader).code][1]; \
1687 #define CV_CURRENT_POINT( reader ) (*((CvPoint*)((reader).ptr)))
1688 #define CV_PREV_POINT( reader ) (*((CvPoint*)((reader).prev_elem)))
1690 #define CV_READ_EDGE( pt1, pt2, reader ) \
1692 assert( sizeof(pt1) == sizeof(CvPoint) && \
1693 sizeof(pt2) == sizeof(CvPoint) && \
1694 reader.seq->elem_size == sizeof(CvPoint)); \
1695 (pt1) = CV_PREV_POINT( reader ); \
1696 (pt2) = CV_CURRENT_POINT( reader ); \
1697 (reader).prev_elem = (reader).ptr; \
1698 CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader)); \
1704 #define CV_NEXT_GRAPH_EDGE( edge, vertex ) \
1705 (assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)), \
1706 (edge)->next[(edge)->vtx[1] == (vertex)])
1718 #define CV_STORAGE_READ 0
1719 #define CV_STORAGE_WRITE 1
1720 #define CV_STORAGE_WRITE_TEXT CV_STORAGE_WRITE
1721 #define CV_STORAGE_WRITE_BINARY CV_STORAGE_WRITE
1722 #define CV_STORAGE_APPEND 2
1744 #define CV_NODE_NONE 0
1745 #define CV_NODE_INT 1
1746 #define CV_NODE_INTEGER CV_NODE_INT
1747 #define CV_NODE_REAL 2
1748 #define CV_NODE_FLOAT CV_NODE_REAL
1749 #define CV_NODE_STR 3
1750 #define CV_NODE_STRING CV_NODE_STR
1751 #define CV_NODE_REF 4
1752 #define CV_NODE_SEQ 5
1753 #define CV_NODE_MAP 6
1754 #define CV_NODE_TYPE_MASK 7
1756 #define CV_NODE_TYPE(flags) ((flags) & CV_NODE_TYPE_MASK)
1759 #define CV_NODE_FLOW 8
1760 #define CV_NODE_USER 16
1761 #define CV_NODE_EMPTY 32
1762 #define CV_NODE_NAMED 64
1764 #define CV_NODE_IS_INT(flags) (CV_NODE_TYPE(flags) == CV_NODE_INT)
1765 #define CV_NODE_IS_REAL(flags) (CV_NODE_TYPE(flags) == CV_NODE_REAL)
1766 #define CV_NODE_IS_STRING(flags) (CV_NODE_TYPE(flags) == CV_NODE_STRING)
1767 #define CV_NODE_IS_SEQ(flags) (CV_NODE_TYPE(flags) == CV_NODE_SEQ)
1768 #define CV_NODE_IS_MAP(flags) (CV_NODE_TYPE(flags) == CV_NODE_MAP)
1769 #define CV_NODE_IS_COLLECTION(flags) (CV_NODE_TYPE(flags) >= CV_NODE_SEQ)
1770 #define CV_NODE_IS_FLOW(flags) (((flags) & CV_NODE_FLOW) != 0)
1771 #define CV_NODE_IS_EMPTY(flags) (((flags) & CV_NODE_EMPTY) != 0)
1772 #define CV_NODE_IS_USER(flags) (((flags) & CV_NODE_USER) != 0)
1773 #define CV_NODE_HAS_NAME(flags) (((flags) & CV_NODE_NAMED) != 0)
1775 #define CV_NODE_SEQ_SIMPLE 256
1776 #define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)
1821 const void* struct_ptr,
CvAttrList attributes );