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