opencv之types_c.h

#ifndef __OPENCV_CORE_TYPES_H__

#define __OPENCV_CORE_TYPES_H__

#ifdef HAVE_IPL

#  ifndef __IPL_H__

#    if defined WIN32 || defined _WIN32

#      include <ipl.h>

#    else

#      include <ipl/ipl.h>

#    endif

#  endif

#elif defined __IPL_H__

#  define HAVE_IPL

#endif

#include "opencv2/core/cvdef.h"

#ifndef SKIP_INCLUDES

#include <assert.h>

#include <stdlib.h>

#include <string.h>

#include <float.h>

#endif // SKIP_INCLUDES

#if defined WIN32 || defined _WIN32

#  define CV_CDECL __cdecl

#  define CV_STDCALL __stdcall

#else

#  define CV_CDECL

#  define CV_STDCALL

#endif

#ifndef CV_DEFAULT

#  ifdef __cplusplus

#    define CV_DEFAULT(val) = val

#  else

#    define CV_DEFAULT(val)

#  endif

#endif

#ifndef CV_EXTERN_C_FUNCPTR

#  ifdef __cplusplus

#    define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }

#  else

#    define CV_EXTERN_C_FUNCPTR(x) typedef x

#  endif

#endif

#ifndef CVAPI

#  define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL

#endif

#ifndef CV_IMPL

#  define CV_IMPL CV_EXTERN_C

#endif

#ifdef __cplusplus

#  include "opencv2/core.hpp"

#endif

/* CvArr* is used to pass arbitrary

* array-like data structures

* into functions where the particular

* array type is recognized at runtime:

*/

typedef void CvArr;

typedef union Cv32suf

{

int i;

unsigned u;

float f;

}

Cv32suf;

typedef union Cv64suf

{

int64 i;

uint64 u;

double f;

}

Cv64suf;

typedef int CVStatus;

enum {

CV_StsOk=                       0,  /* everithing is ok                */

CV_StsBackTrace=               -1,  /* pseudo error for back trace     */

CV_StsError=                   -2,  /* unknown /unspecified error      */

CV_StsInternal=                -3,  /* internal error (bad state)      */

CV_StsNoMem=                   -4,  /* insufficient memory             */

CV_StsBadArg=                  -5,  /* function arg/param is bad       */

CV_StsBadFunc=                 -6,  /* unsupported function            */

CV_StsNoConv=                  -7,  /* iter. didn‘t converge           */

CV_StsAutoTrace=               -8,  /* tracing                         */

CV_HeaderIsNull=               -9,  /* image header is NULL            */

CV_BadImageSize=              -10, /* image size is invalid           */

CV_BadOffset=                 -11, /* offset is invalid               */

CV_BadDataPtr=                -12, /**/

CV_BadStep=                   -13, /**/

CV_BadModelOrChSeq=           -14, /**/

CV_BadNumChannels=            -15, /**/

CV_BadNumChannel1U=           -16, /**/

CV_BadDepth=                  -17, /**/

CV_BadAlphaChannel=           -18, /**/

CV_BadOrder=                  -19, /**/

CV_BadOrigin=                 -20, /**/

CV_BadAlign=                  -21, /**/

CV_BadCallBack=               -22, /**/

CV_BadTileSize=               -23, /**/

CV_BadCOI=                    -24, /**/

CV_BadROISize=                -25, /**/

CV_MaskIsTiled=               -26, /**/

CV_StsNullPtr=                -27, /* null pointer */

CV_StsVecLengthErr=           -28, /* incorrect vector length */

CV_StsFilterStructContentErr= -29, /* incorr. filter structure content */

CV_StsKernelStructContentErr= -30, /* incorr. transform kernel content */

CV_StsFilterOffsetErr=        -31, /* incorrect filter offset value */

CV_StsBadSize=                -201, /* the input/output structure size is incorrect  */

CV_StsDivByZero=              -202, /* division by zero */

CV_StsInplaceNotSupported=    -203, /* in-place operation is not supported */

CV_StsObjectNotFound=         -204, /* request can‘t be completed */

CV_StsUnmatchedFormats=       -205, /* formats of input/output arrays differ */

CV_StsBadFlag=                -206, /* flag is wrong or not supported */

CV_StsBadPoint=               -207, /* bad CvPoint */

CV_StsBadMask=                -208, /* bad format of mask (neither 8uC1 nor 8sC1)*/

CV_StsUnmatchedSizes=         -209, /* sizes of input/output structures do not match */

CV_StsUnsupportedFormat=      -210, /* the data format/type is not supported by the function*/

CV_StsOutOfRange=             -211, /* some of parameters are out of range */

CV_StsParseError=             -212, /* invalid syntax/structure of the parsed file */

CV_StsNotImplemented=         -213, /* the requested function/feature is not implemented */

CV_StsBadMemBlock=            -214, /* an allocated block has been corrupted */

CV_StsAssert=                 -215, /* assertion failed */

CV_GpuNotSupported=           -216,

CV_GpuApiCallError=           -217,

CV_OpenGlNotSupported=        -218,

CV_OpenGlApiCallError=        -219,

CV_OpenCLApiCallError=        -220,

CV_OpenCLDoubleNotSupported=  -221,

CV_OpenCLInitError=           -222,

CV_OpenCLNoAMDBlasFft=        -223

};

/****************************************************************************************\

*                             Common macros and inline functions                         *

\****************************************************************************************/

#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))

/* min & max without jumps */

#define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))

#define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))

/* absolute value without jumps */

#ifndef __cplusplus

#  define  CV_IABS(a)     (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))

#else

#  define  CV_IABS(a)     abs(a)

#endif

#define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))

#define  CV_SIGN(a)     CV_CMP((a),0)

#define cvInvSqrt(value) ((float)(1./sqrt(value)))

#define cvSqrt(value)  ((float)sqrt(value))

/*************** Random number generation *******************/

typedef uint64 CvRNG;

#define CV_RNG_COEFF 4164903690U

CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))

{

CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;

return rng;

}

/* Return random 32-bit unsigned integer: */

CV_INLINE unsigned cvRandInt( CvRNG* rng )

{

uint64 temp = *rng;

temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> 32);

*rng = temp;

return (unsigned)temp;

}

/* Returns random floating-point number between 0 and 1: */

CV_INLINE double cvRandReal( CvRNG* rng )

{

return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;

}

/****************************************************************************************\

*                                  Image type (IplImage)                                 *

\****************************************************************************************/

#ifndef HAVE_IPL

/*

* The following definitions (until #endif)

* is an extract from IPL headers.

* Copyright (c) 1995 Intel Corporation.

*/

#define IPL_DEPTH_SIGN 0x80000000

#define IPL_DEPTH_1U     1

#define IPL_DEPTH_8U     8

#define IPL_DEPTH_16U   16

#define IPL_DEPTH_32F   32

#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)

#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)

#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)

#define IPL_DATA_ORDER_PIXEL  0

#define IPL_DATA_ORDER_PLANE  1

#define IPL_ORIGIN_TL 0

#define IPL_ORIGIN_BL 1

#define IPL_ALIGN_4BYTES   4

#define IPL_ALIGN_8BYTES   8

#define IPL_ALIGN_16BYTES 16

#define IPL_ALIGN_32BYTES 32

#define IPL_ALIGN_DWORD   IPL_ALIGN_4BYTES

#define IPL_ALIGN_QWORD   IPL_ALIGN_8BYTES

#define IPL_BORDER_CONSTANT   0

#define IPL_BORDER_REPLICATE  1

#define IPL_BORDER_REFLECT    2

#define IPL_BORDER_WRAP       3

typedef struct

#ifdef __cplusplus

CV_EXPORTS

#endif

_IplImage

{

int  nSize;             /* sizeof(IplImage) */

int  ID;                /* version (=0)*/

int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */

int  alphaChannel;      /* Ignored by OpenCV */

int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,

IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */

char colorModel[4];     /* Ignored by OpenCV */

char channelSeq[4];     /* ditto */

int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.

cvCreateImage can only create interleaved images */

int  origin;            /* 0 - top-left origin,

1 - bottom-left origin (Windows bitmaps style).  */

int  align;             /* Alignment of image rows (4 or 8).

OpenCV ignores it and uses widthStep instead.    */

int  width;             /* Image width in pixels.                           */

int  height;            /* Image height in pixels.                          */

struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */

struct _IplImage *maskROI;      /* Must be NULL. */

void  *imageId;                 /* "           " */

struct _IplTileInfo *tileInfo;  /* "           " */

int  imageSize;         /* Image data size in bytes

(==image->height*image->widthStep

in case of interleaved data)*/

char *imageData;        /* Pointer to aligned image data.         */

int  widthStep;         /* Size of aligned image row in bytes.    */

int  BorderMode[4];     /* Ignored by OpenCV.                     */

int  BorderConst[4];    /* Ditto.                                 */

char *imageDataOrigin;  /* Pointer to very origin of image data

(not necessarily aligned) -

needed for correct deallocation */

#ifdef __cplusplus

_IplImage() {}

_IplImage(const cv::Mat& m);

#endif

}

IplImage;

typedef struct _IplTileInfo IplTileInfo;

typedef struct _IplROI

{

int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/

int  xOffset;

int  yOffset;

int  width;

int  height;

}

IplROI;

typedef struct _IplConvKernel

{

int  nCols;

int  nRows;

int  anchorX;

int  anchorY;

int *values;

int  nShiftR;

}

IplConvKernel;

typedef struct _IplConvKernelFP

{

int  nCols;

int  nRows;

int  anchorX;

int  anchorY;

float *values;

}

IplConvKernelFP;

#define IPL_IMAGE_HEADER 1

#define IPL_IMAGE_DATA   2

#define IPL_IMAGE_ROI    4

#endif/*HAVE_IPL*/

/* extra border mode */

#define IPL_BORDER_REFLECT_101    4

#define IPL_BORDER_TRANSPARENT    5

#define IPL_IMAGE_MAGIC_VAL  ((int)sizeof(IplImage))

#define CV_TYPE_NAME_IMAGE "opencv-image"

#define CV_IS_IMAGE_HDR(img) \

((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))

#define CV_IS_IMAGE(img) \

(CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)

/* for storing double-precision

floating point data in IplImage‘s */

#define IPL_DEPTH_64F  64

/* get reference to pixel at (col,row),

for multi-channel images (col) should be multiplied by number of channels */

#define CV_IMAGE_ELEM( image, elemtype, row, col )       \

(((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])

/****************************************************************************************\

*                                  Matrix type (CvMat)                                   *

\****************************************************************************************/

#define CV_AUTO_STEP  0x7fffffff

#define CV_WHOLE_ARR  cvSlice( 0, 0x3fffffff )

#define CV_MAGIC_MASK       0xFFFF0000

#define CV_MAT_MAGIC_VAL    0x42420000

#define CV_TYPE_NAME_MAT    "opencv-matrix"

typedef struct CvMat

{

int type;

int step;

/* for internal use only */

int* refcount;

int hdr_refcount;

union

{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

#ifdef __cplusplus

union

{

int rows;

int height;

};

union

{

int cols;

int width;

};

#else

int rows;

int cols;

#endif

#ifdef __cplusplus

CvMat() {}

CvMat(const CvMat& m) { memcpy(this, &m, sizeof(CvMat));}

CvMat(const cv::Mat& m);

#endif

}

CvMat;

#define CV_IS_MAT_HDR(mat) \

((mat) != NULL && \

(((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \

((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)

#define CV_IS_MAT_HDR_Z(mat) \

((mat) != NULL && \

(((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \

((const CvMat*)(mat))->cols >= 0 && ((const CvMat*)(mat))->rows >= 0)

#define CV_IS_MAT(mat) \

(CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)

#define CV_IS_MASK_ARR(mat) \

(((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)

#define CV_ARE_TYPES_EQ(mat1, mat2) \

((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)

#define CV_ARE_CNS_EQ(mat1, mat2) \

((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)

#define CV_ARE_DEPTHS_EQ(mat1, mat2) \

((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)

#define CV_ARE_SIZES_EQ(mat1, mat2) \

((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)

#define CV_IS_MAT_CONST(mat)  \

(((mat)->rows|(mat)->cols) == 1)

#define IPL2CV_DEPTH(depth) \

((((CV_8U)+(CV_16U<<4)+(CV_32F<<8)+(CV_64F<<16)+(CV_8S<<20)+ \

(CV_16S<<24)+(CV_32S<<28)) >> ((((depth) & 0xF0) >> 2) + \

(((depth) & IPL_DEPTH_SIGN) ? 20 : 0))) & 15)

/* Inline constructor. No data is allocated internally!!!

* (Use together with cvCreateData, or use cvCreateMat instead to

* get a matrix with allocated data):

*/

CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))

{

CvMat m;

assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );

type = CV_MAT_TYPE(type);

m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;

m.cols = cols;

m.rows = rows;

m.step = m.cols*CV_ELEM_SIZE(type);

m.data.ptr = (uchar*)data;

m.refcount = NULL;

m.hdr_refcount = 0;

return m;

}

#ifdef __cplusplus

inline CvMat::CvMat(const cv::Mat& m)

{

CV_DbgAssert(m.dims <= 2);

*this = cvMat(m.rows, m.dims == 1 ? 1 : m.cols, m.type(), m.data);

step = (int)m.step[0];

type = (type & ~cv::Mat::CONTINUOUS_FLAG) | (m.flags & cv::Mat::CONTINUOUS_FLAG);

}

#endif

#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  \

(assert( (unsigned)(row) < (unsigned)(mat).rows &&   \

(unsigned)(col) < (unsigned)(mat).cols ),   \

(mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))

#define CV_MAT_ELEM_PTR( mat, row, col )                 \

CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )

#define CV_MAT_ELEM( mat, elemtype, row, col )           \

(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

CV_INLINE  double  cvmGet( const CvMat* mat, int row, int col )

{

int type;

type = CV_MAT_TYPE(mat->type);

assert( (unsigned)row < (unsigned)mat->rows &&

(unsigned)col < (unsigned)mat->cols );

if( type == CV_32FC1 )

return ((float*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col];

else

{

assert( type == CV_64FC1 );

return ((double*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col];

}

}

CV_INLINE  void  cvmSet( CvMat* mat, int row, int col, double value )

{

int type;

type = CV_MAT_TYPE(mat->type);

assert( (unsigned)row < (unsigned)mat->rows &&

(unsigned)col < (unsigned)mat->cols );

if( type == CV_32FC1 )

((float*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col] = (float)value;

else

{

assert( type == CV_64FC1 );

((double*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col] = value;

}

}

CV_INLINE int cvIplDepth( int type )

{

int depth = CV_MAT_DEPTH(type);

return CV_ELEM_SIZE1(depth)*8 | (depth == CV_8S || depth == CV_16S ||

depth == CV_32S ? IPL_DEPTH_SIGN : 0);

}

/****************************************************************************************\

*                       Multi-dimensional dense array (CvMatND)                          *

\****************************************************************************************/

#define CV_MATND_MAGIC_VAL    0x42430000

#define CV_TYPE_NAME_MATND    "opencv-nd-matrix"

#define CV_MAX_DIM            32

#define CV_MAX_DIM_HEAP       1024

typedef struct

#ifdef __cplusplus

CV_EXPORTS

#endif

CvMatND

{

int type;

int dims;

int* refcount;

int hdr_refcount;

union

{

uchar* ptr;

float* fl;

double* db;

int* i;

short* s;

} data;

struct

{

int size;

int step;

}

dim[CV_MAX_DIM];

#ifdef __cplusplus

CvMatND() {}

CvMatND(const cv::Mat& m);

#endif

}

CvMatND;

#define CV_IS_MATND_HDR(mat) \

((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)

#define CV_IS_MATND(mat) \

(CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)

/****************************************************************************************\

*                      Multi-dimensional sparse array (CvSparseMat)                      *

\****************************************************************************************/

#define CV_SPARSE_MAT_MAGIC_VAL    0x42440000

#define CV_TYPE_NAME_SPARSE_MAT    "opencv-sparse-matrix"

struct CvSet;

typedef struct

#ifdef __cplusplus

CV_EXPORTS

#endif

CvSparseMat

{

int type;

int dims;

int* refcount;

int hdr_refcount;

struct CvSet* heap;

void** hashtable;

int hashsize;

int valoffset;

int idxoffset;

int size[CV_MAX_DIM];

#ifdef __cplusplus

void copyToSparseMat(cv::SparseMat& m) const;

#endif

}

CvSparseMat;

#ifdef __cplusplus

CV_EXPORTS CvSparseMat* cvCreateSparseMat(const cv::SparseMat& m);

#endif

#define CV_IS_SPARSE_MAT_HDR(mat) \

((mat) != NULL && \

(((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)

#define CV_IS_SPARSE_MAT(mat) \

CV_IS_SPARSE_MAT_HDR(mat)

/**************** iteration through a sparse array *****************/

typedef struct CvSparseNode

{

unsigned hashval;

struct CvSparseNode* next;

}

CvSparseNode;

typedef struct CvSparseMatIterator

{

CvSparseMat* mat;

CvSparseNode* node;

int curidx;

}

CvSparseMatIterator;

#define CV_NODE_VAL(mat,node)   ((void*)((uchar*)(node) + (mat)->valoffset))

#define CV_NODE_IDX(mat,node)   ((int*)((uchar*)(node) + (mat)->idxoffset))

/****************************************************************************************\

*                                         Histogram                                      *

\****************************************************************************************/

typedef int CvHistType;

#define CV_HIST_MAGIC_VAL     0x42450000

#define CV_HIST_UNIFORM_FLAG  (1 << 10)

/* indicates whether bin ranges are set already or not */

#define CV_HIST_RANGES_FLAG   (1 << 11)

#define CV_HIST_ARRAY         0

#define CV_HIST_SPARSE        1

#define CV_HIST_TREE          CV_HIST_SPARSE

/* should be used as a parameter only,

it turns to CV_HIST_UNIFORM_FLAG of hist->type */

#define CV_HIST_UNIFORM       1

typedef struct CvHistogram

{

int     type;

CvArr*  bins;

float   thresh[CV_MAX_DIM][2];  /* For uniform histograms.                      */

float** thresh2;                /* For non-uniform histograms.                  */

CvMatND mat;                    /* Embedded matrix header for array histograms. */

}

CvHistogram;

#define CV_IS_HIST( hist ) \

((hist) != NULL  && \

(((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \

(hist)->bins != NULL)

#define CV_IS_UNIFORM_HIST( hist ) \

(((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)

#define CV_IS_SPARSE_HIST( hist ) \

CV_IS_SPARSE_MAT((hist)->bins)

#define CV_HIST_HAS_RANGES( hist ) \

(((hist)->type & CV_HIST_RANGES_FLAG) != 0)

/****************************************************************************************\

*                      Other supplementary data type definitions                         *

\****************************************************************************************/

/*************************************** CvRect *****************************************/

typedef struct CvRect

{

int x;

int y;

int width;

int height;

#ifdef __cplusplus

CvRect(int _x = 0, int _y = 0, int w = 0, int h = 0): x(_x), y(_y), width(w), height(h) {}

template<typename _Tp>

CvRect(const cv::Rect_<_Tp>& r): x(cv::saturate_cast<int>(r.x)), y(cv::saturate_cast<int>(r.y)), width(cv::saturate_cast<int>(r.width)), height(cv::saturate_cast<int>(r.height)) {}

template<typename _Tp>

operator cv::Rect_<_Tp>() const { return cv::Rect_<_Tp>((_Tp)x, (_Tp)y, (_Tp)width, (_Tp)height); }

#endif

}

CvRect;

CV_INLINE  CvRect  cvRect( int x, int y, int width, int height )

{

CvRect r;

r.x = x;

r.y = y;

r.width = width;

r.height = height;

return r;

}

CV_INLINE  IplROI  cvRectToROI( CvRect rect, int coi )

{

IplROI roi;

roi.xOffset = rect.x;

roi.yOffset = rect.y;

roi.width = rect.width;

roi.height = rect.height;

roi.coi = coi;

return roi;

}

CV_INLINE  CvRect  cvROIToRect( IplROI roi )

{

return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );

}

/*********************************** CvTermCriteria *************************************/

#define CV_TERMCRIT_ITER    1

#define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER

#define CV_TERMCRIT_EPS     2

typedef struct CvTermCriteria

{

int    type;  /* may be combination of

CV_TERMCRIT_ITER

CV_TERMCRIT_EPS */

int    max_iter;

double epsilon;

#ifdef __cplusplus

CvTermCriteria(int _type = 0, int _iter = 0, double _eps = 0) : type(_type), max_iter(_iter), epsilon(_eps)  {}

CvTermCriteria(const cv::TermCriteria& t) : type(t.type), max_iter(t.maxCount), epsilon(t.epsilon)  {}

operator cv::TermCriteria() const { return cv::TermCriteria(type, max_iter, epsilon); }

#endif

}

CvTermCriteria;

CV_INLINE  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon )

{

CvTermCriteria t;

t.type = type;

t.max_iter = max_iter;

t.epsilon = (float)epsilon;

return t;

}

/******************************* CvPoint and variants ***********************************/

typedef struct CvPoint

{

int x;

int y;

#ifdef __cplusplus

CvPoint(int _x = 0, int _y = 0): x(_x), y(_y) {}

template<typename _Tp>

CvPoint(const cv::Point_<_Tp>& pt): x((int)pt.x), y((int)pt.y) {}

template<typename _Tp>

operator cv::Point_<_Tp>() const { return cv::Point_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y)); }

#endif

}

CvPoint;

CV_INLINE  CvPoint  cvPoint( int x, int y )

{

CvPoint p;

p.x = x;

p.y = y;

return p;

}

typedef struct CvPoint2D32f

{

float x;

float y;

#ifdef __cplusplus

CvPoint2D32f(float _x = 0, float _y = 0): x(_x), y(_y) {}

template<typename _Tp>

CvPoint2D32f(const cv::Point_<_Tp>& pt): x((float)pt.x), y((float)pt.y) {}

template<typename _Tp>

operator cv::Point_<_Tp>() const { return cv::Point_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y)); }

#endif

}

CvPoint2D32f;

CV_INLINE  CvPoint2D32f  cvPoint2D32f( double x, double y )

{

CvPoint2D32f p;

p.x = (float)x;

p.y = (float)y;

return p;

}

CV_INLINE  CvPoint2D32f  cvPointTo32f( CvPoint point )

{

return cvPoint2D32f( (float)point.x, (float)point.y );

}

CV_INLINE  CvPoint  cvPointFrom32f( CvPoint2D32f point )

{

CvPoint ipt;

ipt.x = cvRound(point.x);

ipt.y = cvRound(point.y);

return ipt;

}

typedef struct CvPoint3D32f

{

float x;

float y;

float z;

#ifdef __cplusplus

CvPoint3D32f(float _x = 0, float _y = 0, float _z = 0): x(_x), y(_y), z(_z) {}

template<typename _Tp>

CvPoint3D32f(const cv::Point3_<_Tp>& pt): x((float)pt.x), y((float)pt.y), z((float)pt.z) {}

template<typename _Tp>

operator cv::Point3_<_Tp>() const { return cv::Point3_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y), cv::saturate_cast<_Tp>(z)); }

#endif

}

CvPoint3D32f;

CV_INLINE  CvPoint3D32f  cvPoint3D32f( double x, double y, double z )

{

CvPoint3D32f p;

p.x = (float)x;

p.y = (float)y;

p.z = (float)z;

return p;

}

typedef struct CvPoint2D64f

{

double x;

double y;

}

CvPoint2D64f;

CV_INLINE  CvPoint2D64f  cvPoint2D64f( double x, double y )

{

CvPoint2D64f p;

p.x = x;

p.y = y;

return p;

}

typedef struct CvPoint3D64f

{

double x;

double y;

double z;

}

CvPoint3D64f;

CV_INLINE  CvPoint3D64f  cvPoint3D64f( double x, double y, double z )

{

CvPoint3D64f p;

p.x = x;

p.y = y;

p.z = z;

return p;

}

/******************************** CvSize‘s & CvBox **************************************/

typedef struct CvSize

{

int width;

int height;

#ifdef __cplusplus

CvSize(int w = 0, int h = 0): width(w), height(h) {}

template<typename _Tp>

CvSize(const cv::Size_<_Tp>& sz): width(cv::saturate_cast<int>(sz.width)), height(cv::saturate_cast<int>(sz.height)) {}

template<typename _Tp>

operator cv::Size_<_Tp>() const { return cv::Size_<_Tp>(cv::saturate_cast<_Tp>(width), cv::saturate_cast<_Tp>(height)); }

#endif

}

CvSize;

CV_INLINE  CvSize  cvSize( int width, int height )

{

CvSize s;

s.width = width;

s.height = height;

return s;

}

typedef struct CvSize2D32f

{

float width;

float height;

#ifdef __cplusplus

CvSize2D32f(float w = 0, float h = 0): width(w), height(h) {}

template<typename _Tp>

CvSize2D32f(const cv::Size_<_Tp>& sz): width(cv::saturate_cast<float>(sz.width)), height(cv::saturate_cast<float>(sz.height)) {}

template<typename _Tp>

operator cv::Size_<_Tp>() const { return cv::Size_<_Tp>(cv::saturate_cast<_Tp>(width), cv::saturate_cast<_Tp>(height)); }

#endif

}

CvSize2D32f;

CV_INLINE  CvSize2D32f  cvSize2D32f( double width, double height )

{

CvSize2D32f s;

s.width = (float)width;

s.height = (float)height;

return s;

}

typedef struct CvBox2D

{

CvPoint2D32f center;  /* Center of the box.                          */

CvSize2D32f  size;    /* Box width and length.                       */

float angle;          /* Angle between the horizontal axis           */

/* and the first side (i.e. length) in degrees */

#ifdef __cplusplus

CvBox2D(CvPoint2D32f c = CvPoint2D32f(), CvSize2D32f s = CvSize2D32f(), float a = 0) : center(c), size(s), angle(a) {}

CvBox2D(const cv::RotatedRect& rr) : center(rr.center), size(rr.size), angle(rr.angle) {}

operator cv::RotatedRect() const { return cv::RotatedRect(center, size, angle); }

#endif

}

CvBox2D;

/* Line iterator state: */

typedef struct CvLineIterator

{

/* Pointer to the current point: */

uchar* ptr;

/* Bresenham algorithm state: */

int  err;

int  plus_delta;

int  minus_delta;

int  plus_step;

int  minus_step;

}

CvLineIterator;

/************************************* CvSlice ******************************************/

#define CV_WHOLE_SEQ_END_INDEX 0x3fffffff

#define CV_WHOLE_SEQ  cvSlice(0, CV_WHOLE_SEQ_END_INDEX)

typedef struct CvSlice

{

int  start_index, end_index;

#if defined(__cplusplus) && !defined(__CUDACC__)

CvSlice(int start = 0, int end = 0) : start_index(start), end_index(end) {}

CvSlice(const cv::Range& r) { *this = (r.start != INT_MIN && r.end != INT_MAX) ? CvSlice(r.start, r.end) : CvSlice(0, CV_WHOLE_SEQ_END_INDEX); }

operator cv::Range() const { return (start_index == 0 && end_index == CV_WHOLE_SEQ_END_INDEX ) ? cv::Range::all() : cv::Range(start_index, end_index); }

#endif

}

CvSlice;

CV_INLINE  CvSlice  cvSlice( int start, int end )

{

CvSlice slice;

slice.start_index = start;

slice.end_index = end;

return slice;

}

/************************************* CvScalar *****************************************/

typedef struct CvScalar

{

double val[4];

#ifdef __cplusplus

CvScalar() {}

CvScalar(double d0, double d1 = 0, double d2 = 0, double d3 = 0) { val[0] = d0; val[1] = d1; val[2] = d2; val[3] = d3; }

template<typename _Tp>

CvScalar(const cv::Scalar_<_Tp>& s) { val[0] = s.val[0]; val[1] = s.val[1]; val[2] = s.val[2]; val[3] = s.val[3]; }

template<typename _Tp>

operator cv::Scalar_<_Tp>() const { return cv::Scalar_<_Tp>(cv::saturate_cast<_Tp>(val[0]), cv::saturate_cast<_Tp>(val[1]), cv::saturate_cast<_Tp>(val[2]), cv::saturate_cast<_Tp>(val[3])); }

template<typename _Tp, int cn>

CvScalar(const cv::Vec<_Tp, cn>& v)

{

int i;

for( i = 0; i < (cn < 4 ? cn : 4); i++ ) val[i] = v.val[i];

for( ; i < 4; i++ ) val[i] = 0;

}

#endif

}

CvScalar;

CV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),

double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))

{

CvScalar scalar;

scalar.val[0] = val0; scalar.val[1] = val1;

scalar.val[2] = val2; scalar.val[3] = val3;

return scalar;

}

CV_INLINE  CvScalar  cvRealScalar( double val0 )

{

CvScalar scalar;

scalar.val[0] = val0;

scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;

return scalar;

}

CV_INLINE  CvScalar  cvScalarAll( double val0123 )

{

CvScalar scalar;

scalar.val[0] = val0123;

scalar.val[1] = val0123;

scalar.val[2] = val0123;

scalar.val[3] = val0123;

return scalar;

}

/****************************************************************************************\

*                                   Dynamic Data structures                              *

\****************************************************************************************/

/******************************** Memory storage ****************************************/

typedef struct CvMemBlock

{

struct CvMemBlock*  prev;

struct CvMemBlock*  next;

}

CvMemBlock;

#define CV_STORAGE_MAGIC_VAL    0x42890000

typedef struct CvMemStorage

{

int signature;

CvMemBlock* bottom;           /* First allocated block.                   */

CvMemBlock* top;              /* Current memory block - top of the stack. */

struct  CvMemStorage* parent; /* We get new blocks from parent as needed. */

int block_size;               /* Block size.                              */

int free_space;               /* Remaining free space in current block.   */

}

CvMemStorage;

#define CV_IS_STORAGE(storage)  \

((storage) != NULL &&       \

(((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)

typedef struct CvMemStoragePos

{

CvMemBlock* top;

int free_space;

}

CvMemStoragePos;

/*********************************** Sequence *******************************************/

typedef struct CvSeqBlock

{

struct CvSeqBlock*  prev; /* Previous sequence block.                   */

struct CvSeqBlock*  next; /* Next sequence block.                       */

int    start_index;         /* Index of the first element in the block +  */

/* sequence->first->start_index.              */

int    count;             /* Number of elements in the block.           */

schar* data;              /* Pointer to the first element of the block. */

}

CvSeqBlock;

#define CV_TREE_NODE_FIELDS(node_type)                               \

int       flags;             /* Miscellaneous flags.     */      \

int       header_size;       /* Size of sequence header. */      \

struct    node_type* h_prev; /* Previous sequence.       */      \

struct    node_type* h_next; /* Next sequence.           */      \

struct    node_type* v_prev; /* 2nd previous sequence.   */      \

struct    node_type* v_next  /* 2nd next sequence.       */

/*

Read/Write sequence.

Elements can be dynamically inserted to or deleted from the sequence.

*/

#define CV_SEQUENCE_FIELDS()                                              \

CV_TREE_NODE_FIELDS(CvSeq);                                           \

int       total;          /* Total number of elements.            */  \

int       elem_size;      /* Size of sequence element in bytes.   */  \

schar*    block_max;      /* Maximal bound of the last block.     */  \

schar*    ptr;            /* Current write pointer.               */  \

int       delta_elems;    /* Grow seq this many at a time.        */  \

CvMemStorage* storage;    /* Where the seq is stored.             */  \

CvSeqBlock* free_blocks;  /* Free blocks list.                    */  \

CvSeqBlock* first;        /* Pointer to the first sequence block. */

typedef struct CvSeq

{

CV_SEQUENCE_FIELDS()

}

CvSeq;

#define CV_TYPE_NAME_SEQ             "opencv-sequence"

#define CV_TYPE_NAME_SEQ_TREE        "opencv-sequence-tree"

/*************************************** Set ********************************************/

/*

Set.

Order is not preserved. There can be gaps between sequence elements.

After the element has been inserted it stays in the same place all the time.

The MSB(most-significant or sign bit) of the first field (flags) is 0 iff the element exists.

*/

#define CV_SET_ELEM_FIELDS(elem_type)   \

int  flags;                         \

struct elem_type* next_free;

typedef struct CvSetElem

{

CV_SET_ELEM_FIELDS(CvSetElem)

}

CvSetElem;

#define CV_SET_FIELDS()      \

CV_SEQUENCE_FIELDS()     \

CvSetElem* free_elems;   \

int active_count;

typedef struct CvSet

{

CV_SET_FIELDS()

}

CvSet;

#define CV_SET_ELEM_IDX_MASK   ((1 << 26) - 1)

#define CV_SET_ELEM_FREE_FLAG  (1 << (sizeof(int)*8-1))

/* Checks whether the element pointed by ptr belongs to a set or not */

#define CV_IS_SET_ELEM( ptr )  (((CvSetElem*)(ptr))->flags >= 0)

/************************************* Graph ********************************************/

/*

We represent a graph as a set of vertices.

Vertices contain their adjacency lists (more exactly, pointers to first incoming or

outcoming edge (or 0 if isolated vertex)). Edges are stored in another set.

There is a singly-linked list of incoming/outcoming edges for each vertex.

Each edge consists of

o   Two pointers to the starting and ending vertices

(vtx[0] and vtx[1] respectively).

A graph may be oriented or not. In the latter case, edges between

vertex i to vertex j are not distinguished during search operations.

o   Two pointers to next edges for the starting and ending vertices, where

next[0] points to the next edge in the vtx[0] adjacency list and

next[1] points to the next edge in the vtx[1] adjacency list.

*/

#define CV_GRAPH_EDGE_FIELDS()      \

int flags;                      \

float weight;                   \

struct CvGraphEdge* next[2];    \

struct CvGraphVtx* vtx[2];

#define CV_GRAPH_VERTEX_FIELDS()    \

int flags;                      \

struct CvGraphEdge* first;

typedef struct CvGraphEdge

{

CV_GRAPH_EDGE_FIELDS()

}

CvGraphEdge;

typedef struct CvGraphVtx

{

CV_GRAPH_VERTEX_FIELDS()

}

CvGraphVtx;

typedef struct CvGraphVtx2D

{

CV_GRAPH_VERTEX_FIELDS()

CvPoint2D32f* ptr;

}

CvGraphVtx2D;

/*

Graph is "derived" from the set (this is set a of vertices)

and includes another set (edges)

*/

#define  CV_GRAPH_FIELDS()   \

CV_SET_FIELDS()          \

CvSet* edges;

typedef struct CvGraph

{

CV_GRAPH_FIELDS()

}

CvGraph;

#define CV_TYPE_NAME_GRAPH "opencv-graph"

/*********************************** Chain/Countour *************************************/

typedef struct CvChain

{

CV_SEQUENCE_FIELDS()

CvPoint  origin;

}

CvChain;

#define CV_CONTOUR_FIELDS()  \

CV_SEQUENCE_FIELDS()     \

CvRect rect;             \

int color;               \

int reserved[3];

typedef struct CvContour

{

CV_CONTOUR_FIELDS()

}

CvContour;

typedef CvContour CvPoint2DSeq;

/****************************************************************************************\

*                                    Sequence types                                      *

\****************************************************************************************/

#define CV_SEQ_MAGIC_VAL             0x42990000

#define CV_IS_SEQ(seq) \

((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)

#define CV_SET_MAGIC_VAL             0x42980000

#define CV_IS_SET(set) \

((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL)

#define CV_SEQ_ELTYPE_BITS           12

#define CV_SEQ_ELTYPE_MASK           ((1 << CV_SEQ_ELTYPE_BITS) - 1)

#define CV_SEQ_ELTYPE_POINT          CV_32SC2  /* (x,y) */

#define CV_SEQ_ELTYPE_CODE           CV_8UC1   /* freeman code: 0..7 */

#define CV_SEQ_ELTYPE_GENERIC        0

#define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1

#define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /* &(x,y) */

#define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /* #(x,y) */

#define CV_SEQ_ELTYPE_GRAPH_EDGE     0  /* &next_o, &next_d, &vtx_o, &vtx_d */

#define CV_SEQ_ELTYPE_GRAPH_VERTEX   0  /* first_edge, &(x,y) */

#define CV_SEQ_ELTYPE_TRIAN_ATR      0  /* vertex of the binary tree   */

#define CV_SEQ_ELTYPE_CONNECTED_COMP 0  /* connected component  */

#define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /* (x,y,z)  */

#define CV_SEQ_KIND_BITS        2

#define CV_SEQ_KIND_MASK        (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)

/* types of sequences */

#define CV_SEQ_KIND_GENERIC     (0 << CV_SEQ_ELTYPE_BITS)

#define CV_SEQ_KIND_CURVE       (1 << CV_SEQ_ELTYPE_BITS)

#define CV_SEQ_KIND_BIN_TREE    (2 << CV_SEQ_ELTYPE_BITS)

/* types of sparse sequences (sets) */

#define CV_SEQ_KIND_GRAPH       (1 << CV_SEQ_ELTYPE_BITS)

#define CV_SEQ_KIND_SUBDIV2D    (2 << CV_SEQ_ELTYPE_BITS)

#define CV_SEQ_FLAG_SHIFT       (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)

/* flags for curves */

#define CV_SEQ_FLAG_CLOSED     (1 << CV_SEQ_FLAG_SHIFT)

#define CV_SEQ_FLAG_SIMPLE     (0 << CV_SEQ_FLAG_SHIFT)

#define CV_SEQ_FLAG_CONVEX     (0 << CV_SEQ_FLAG_SHIFT)

#define CV_SEQ_FLAG_HOLE       (2 << CV_SEQ_FLAG_SHIFT)

/* flags for graphs */

#define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)

#define CV_GRAPH               CV_SEQ_KIND_GRAPH

#define CV_ORIENTED_GRAPH      (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)

/* point sets */

#define CV_SEQ_POINT_SET       (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT)

#define CV_SEQ_POINT3D_SET     (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT3D)

#define CV_SEQ_POLYLINE        (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_POINT)

#define CV_SEQ_POLYGON         (CV_SEQ_FLAG_CLOSED | CV_SEQ_POLYLINE )

#define CV_SEQ_CONTOUR         CV_SEQ_POLYGON

#define CV_SEQ_SIMPLE_POLYGON  (CV_SEQ_FLAG_SIMPLE | CV_SEQ_POLYGON  )

/* chain-coded curves */

#define CV_SEQ_CHAIN           (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_CODE)

#define CV_SEQ_CHAIN_CONTOUR   (CV_SEQ_FLAG_CLOSED | CV_SEQ_CHAIN)

/* binary tree for the contour */

#define CV_SEQ_POLYGON_TREE    (CV_SEQ_KIND_BIN_TREE  | CV_SEQ_ELTYPE_TRIAN_ATR)

/* sequence of the connected components */

#define CV_SEQ_CONNECTED_COMP  (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_CONNECTED_COMP)

/* sequence of the integer numbers */

#define CV_SEQ_INDEX           (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_INDEX)

#define CV_SEQ_ELTYPE( seq )   ((seq)->flags & CV_SEQ_ELTYPE_MASK)

#define CV_SEQ_KIND( seq )     ((seq)->flags & CV_SEQ_KIND_MASK )

/* flag checking */

#define CV_IS_SEQ_INDEX( seq )      ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \

(CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))

#define CV_IS_SEQ_CURVE( seq )      (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE)

#define CV_IS_SEQ_CLOSED( seq )     (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0)

#define CV_IS_SEQ_CONVEX( seq )     0

#define CV_IS_SEQ_HOLE( seq )       (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0)

#define CV_IS_SEQ_SIMPLE( seq )     1

/* type checking macros */

#define CV_IS_SEQ_POINT_SET( seq ) \

((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))

#define CV_IS_SEQ_POINT_SUBSET( seq ) \

(CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)

#define CV_IS_SEQ_POLYLINE( seq )   \

(CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))

#define CV_IS_SEQ_POLYGON( seq )   \

(CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))

#define CV_IS_SEQ_CHAIN( seq )   \

(CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)

#define CV_IS_SEQ_CONTOUR( seq )   \

(CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))

#define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \

(CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))

#define CV_IS_SEQ_POLYGON_TREE( seq ) \

(CV_SEQ_ELTYPE (seq) ==  CV_SEQ_ELTYPE_TRIAN_ATR &&    \

CV_SEQ_KIND( seq ) ==  CV_SEQ_KIND_BIN_TREE )

#define CV_IS_GRAPH( seq )    \

(CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)

#define CV_IS_GRAPH_ORIENTED( seq )   \

(((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)

#define CV_IS_SUBDIV2D( seq )  \

(CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)

/****************************************************************************************/

/*                            Sequence writer & reader                                  */

/****************************************************************************************/

#define CV_SEQ_WRITER_FIELDS()                                     \

int          header_size;                                      \

CvSeq*       seq;        /* the sequence written */            \

CvSeqBlock*  block;      /* current block */                   \

schar*       ptr;        /* pointer to free space */           \

schar*       block_min;  /* pointer to the beginning of block*/\

schar*       block_max;  /* pointer to the end of block */

typedef struct CvSeqWriter

{

CV_SEQ_WRITER_FIELDS()

}

CvSeqWriter;

#define CV_SEQ_READER_FIELDS()                                      \

int          header_size;                                       \

CvSeq*       seq;        /* sequence, beign read */             \

CvSeqBlock*  block;      /* current block */                    \

schar*       ptr;        /* pointer to element be read next */  \

schar*       block_min;  /* pointer to the beginning of block */\

schar*       block_max;  /* pointer to the end of block */      \

int          delta_index;/* = seq->first->start_index   */      \

schar*       prev_elem;  /* pointer to previous element */

typedef struct CvSeqReader

{

CV_SEQ_READER_FIELDS()

}

CvSeqReader;

/****************************************************************************************/

/*                                Operations on sequences                               */

/****************************************************************************************/

#define  CV_SEQ_ELEM( seq, elem_type, index )                    \

/* assert gives some guarantee that <seq> parameter is valid */  \

(   assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) &&      \

(seq)->elem_size == sizeof(elem_type)),                      \

(elem_type*)((seq)->first && (unsigned)index <               \

(unsigned)((seq)->first->count) ?                            \

(seq)->first->data + (index) * sizeof(elem_type) :           \

cvGetSeqElem( (CvSeq*)(seq), (index) )))

#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )

/* Add element to sequence: */

#define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer )     \

{                                                     \

if( (writer).ptr >= (writer).block_max )          \

{                                                 \

cvCreateSeqBlock( &writer);                   \

}                                                 \

memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\

(writer).ptr += (writer).seq->elem_size;          \

}

#define CV_WRITE_SEQ_ELEM( elem, writer )             \

{                                                     \

assert( (writer).seq->elem_size == sizeof(elem)); \

if( (writer).ptr >= (writer).block_max )          \

{                                                 \

cvCreateSeqBlock( &writer);                   \

}                                                 \

assert( (writer).ptr <= (writer).block_max - sizeof(elem));\

memcpy((writer).ptr, &(elem), sizeof(elem));      \

(writer).ptr += sizeof(elem);                     \

}

/* Move reader position forward: */

#define CV_NEXT_SEQ_ELEM( elem_size, reader )                 \

{                                                             \

if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \

{                                                         \

cvChangeSeqBlock( &(reader), 1 );                     \

}                                                         \

}

/* Move reader position backward: */

#define CV_PREV_SEQ_ELEM( elem_size, reader )                \

{                                                            \

if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \

{                                                        \

cvChangeSeqBlock( &(reader), -1 );                   \

}                                                        \

}

/* Read element and move read position forward: */

#define CV_READ_SEQ_ELEM( elem, reader )                       \

{                                                              \

assert( (reader).seq->elem_size == sizeof(elem));          \

memcpy( &(elem), (reader).ptr, sizeof((elem)));            \

CV_NEXT_SEQ_ELEM( sizeof(elem), reader )                   \

}

/* Read element and move read position backward: */

#define CV_REV_READ_SEQ_ELEM( elem, reader )                     \

{                                                                \

assert( (reader).seq->elem_size == sizeof(elem));            \

memcpy(&(elem), (reader).ptr, sizeof((elem)));               \

CV_PREV_SEQ_ELEM( sizeof(elem), reader )                     \

}

#define CV_READ_CHAIN_POINT( _pt, reader )                              \

{                                                                       \

(_pt) = (reader).pt;                                                \

if( (reader).ptr )                                                  \

{                                                                   \

CV_READ_SEQ_ELEM( (reader).code, (reader));                     \

assert( ((reader).code & ~7) == 0 );                            \

(reader).pt.x += (reader).deltas[(int)(reader).code][0];        \

(reader).pt.y += (reader).deltas[(int)(reader).code][1];        \

}                                                                   \

}

#define CV_CURRENT_POINT( reader )  (*((CvPoint*)((reader).ptr)))

#define CV_PREV_POINT( reader )     (*((CvPoint*)((reader).prev_elem)))

#define CV_READ_EDGE( pt1, pt2, reader )               \

{                                                      \

assert( sizeof(pt1) == sizeof(CvPoint) &&          \

sizeof(pt2) == sizeof(CvPoint) &&          \

reader.seq->elem_size == sizeof(CvPoint)); \

(pt1) = CV_PREV_POINT( reader );                   \

(pt2) = CV_CURRENT_POINT( reader );                \

(reader).prev_elem = (reader).ptr;                 \

CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader));      \

}

/************ Graph macros ************/

/* Return next graph edge for given vertex: */

#define  CV_NEXT_GRAPH_EDGE( edge, vertex )                              \

(assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)),  \

(edge)->next[(edge)->vtx[1] == (vertex)])

/****************************************************************************************\

*             Data structures for persistence (a.k.a serialization) functionality        *

\****************************************************************************************/

/* "black box" file storage */

typedef struct CvFileStorage CvFileStorage;

/* Storage flags: */

#define CV_STORAGE_READ          0

#define CV_STORAGE_WRITE         1

#define CV_STORAGE_WRITE_TEXT    CV_STORAGE_WRITE

#define CV_STORAGE_WRITE_BINARY  CV_STORAGE_WRITE

#define CV_STORAGE_APPEND        2

#define CV_STORAGE_MEMORY        4

#define CV_STORAGE_FORMAT_MASK   (7<<3)

#define CV_STORAGE_FORMAT_AUTO   0

#define CV_STORAGE_FORMAT_XML    8

#define CV_STORAGE_FORMAT_YAML  16

/* List of attributes: */

typedef struct CvAttrList

{

const char** attr;         /* NULL-terminated array of (attribute_name,attribute_value) pairs. */

struct CvAttrList* next;   /* Pointer to next chunk of the attributes list.                    */

}

CvAttrList;

CV_INLINE CvAttrList cvAttrList( const char** attr CV_DEFAULT(NULL),

CvAttrList* next CV_DEFAULT(NULL) )

{

CvAttrList l;

l.attr = attr;

l.next = next;

return l;

}

struct CvTypeInfo;

#define CV_NODE_NONE        0

#define CV_NODE_INT         1

#define CV_NODE_INTEGER     CV_NODE_INT

#define CV_NODE_REAL        2

#define CV_NODE_FLOAT       CV_NODE_REAL

#define CV_NODE_STR         3

#define CV_NODE_STRING      CV_NODE_STR

#define CV_NODE_REF         4 /* not used */

#define CV_NODE_SEQ         5

#define CV_NODE_MAP         6

#define CV_NODE_TYPE_MASK   7

#define CV_NODE_TYPE(flags)  ((flags) & CV_NODE_TYPE_MASK)

/* file node flags */

#define CV_NODE_FLOW        8 /* Used only for writing structures in YAML format. */

#define CV_NODE_USER        16

#define CV_NODE_EMPTY       32

#define CV_NODE_NAMED       64

#define CV_NODE_IS_INT(flags)        (CV_NODE_TYPE(flags) == CV_NODE_INT)

#define CV_NODE_IS_REAL(flags)       (CV_NODE_TYPE(flags) == CV_NODE_REAL)

#define CV_NODE_IS_STRING(flags)     (CV_NODE_TYPE(flags) == CV_NODE_STRING)

#define CV_NODE_IS_SEQ(flags)        (CV_NODE_TYPE(flags) == CV_NODE_SEQ)

#define CV_NODE_IS_MAP(flags)        (CV_NODE_TYPE(flags) == CV_NODE_MAP)

#define CV_NODE_IS_COLLECTION(flags) (CV_NODE_TYPE(flags) >= CV_NODE_SEQ)

#define CV_NODE_IS_FLOW(flags)       (((flags) & CV_NODE_FLOW) != 0)

#define CV_NODE_IS_EMPTY(flags)      (((flags) & CV_NODE_EMPTY) != 0)

#define CV_NODE_IS_USER(flags)       (((flags) & CV_NODE_USER) != 0)

#define CV_NODE_HAS_NAME(flags)      (((flags) & CV_NODE_NAMED) != 0)

#define CV_NODE_SEQ_SIMPLE 256

#define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)

typedef struct CvString

{

int len;

char* ptr;

}

CvString;

/* All the keys (names) of elements in the readed file storage

are stored in the hash to speed up the lookup operations: */

typedef struct CvStringHashNode

{

unsigned hashval;

CvString str;

struct CvStringHashNode* next;

}

CvStringHashNode;

typedef struct CvGenericHash CvFileNodeHash;

/* Basic element of the file storage - scalar or collection: */

typedef struct CvFileNode

{

int tag;

struct CvTypeInfo* info; /* type information

(only for user-defined object, for others it is 0) */

union

{

double f; /* scalar floating-point number */

int i;    /* scalar integer number */

CvString str; /* text string */

CvSeq* seq; /* sequence (ordered collection of file nodes) */

CvFileNodeHash* map; /* map (collection of named file nodes) */

} data;

}

CvFileNode;

#ifdef __cplusplus

extern "C" {

#endif

typedef int (CV_CDECL *CvIsInstanceFunc)( const void* struct_ptr );

typedef void (CV_CDECL *CvReleaseFunc)( void** struct_dblptr );

typedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node );

typedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name,

const void* struct_ptr, CvAttrList attributes );

typedef void* (CV_CDECL *CvCloneFunc)( const void* struct_ptr );

#ifdef __cplusplus

}

#endif

typedef struct CvTypeInfo

{

int flags;

int header_size;

struct CvTypeInfo* prev;

struct CvTypeInfo* next;

const char* type_name;

CvIsInstanceFunc is_instance;

CvReleaseFunc release;

CvReadFunc read;

CvWriteFunc write;

CvCloneFunc clone;

}

CvTypeInfo;

/**** System data types ******/

typedef struct CvPluginFuncInfo

{

void** func_addr;

void* default_func_addr;

const char* func_names;

int search_modules;

int loaded_from;

}

CvPluginFuncInfo;

typedef struct CvModuleInfo

{

struct CvModuleInfo* next;

const char* name;

const char* version;

CvPluginFuncInfo* func_tab;

}

CvModuleInfo;

#endif /*__OPENCV_CORE_TYPES_H__*/

时间: 2024-11-08 12:59:56

opencv之types_c.h的相关文章

基于opencv网络摄像头在ubuntu下的视频获取

 基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参考http://blog.csdn.net/xiabodan/article/details/23547847 3  测试代码 编译 g++ cameraCaptrue.cpp -o test `pkg-config --libs --cflags opencv` cameraCaptrue.cpp

如何利用openCV做灰度图片

将彩色图片变成灰度图片的两种方式: 1.使用openCV 2.使用IOS系统自带的开发库实现 3.实现架构布局(设计模式:策略模式) 第一:使用openCV 1.下载openCV框架:http://opencv.org/ 2.导入项目 3.创建渲染灰度图片类: #import "ImageUtils.h" //第一步导入OpenCV 头文件 #import <opencv2/opencv.hpp> #import <opencv2/imgcodecs/ios.h>

OpenCV图像的二值化

图像的二值化: 与边缘检测相比,轮廓检测有时能更好的反映图像的内容.而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果.在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓. 下面就介绍OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测函数原型:void cvThreshold( 

OpenCV学习 6:平滑滤波器 cvSmooth()——2

原创文章,欢迎转载,转载请注明出处 前面进行了彩色的模糊处理,我们对黑白图片进行同样的平滑处理,看看效果.首先是需要创建黑白图片,我对opencv的各种函数还不是很熟悉,我们可以先用熟悉的创建单通道的图片. 1 IplImage* img = cvCreateImage(cvSize(300, 300), IPL_DEPTH_8U,1); 创建一张300*300pixel大小的图片,然后我们需要对像素进行操作,让图片编程全黑,然后让中心像素为白. 对像素的操作也有不少方法,我们用简单暴力的. I

[OpenCV] IplImage and Functions

In this chapter, APIs will make U crazy. Good luck! "modules/core/include/opencv2/core/types_c.h" typedef struct _IplImage { int nSize; /* sizeof(IplImage) */ int ID; /* version (=0)*/ int nChannels; /* Most of OpenCV functions support 1,2,3 or

基于opencv在摄像头ubuntu根据视频获取

 基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考http://blog.csdn.net/xiabodan/article/details/23547847 提前下载OPENCV源代码包 官方:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/ 我的:http://dow

OpenCV中对图像进行二值化的关键函数——cvThreshold()。

函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); 函数说明: 第一个参数表示输入图像,必须为单通道灰度图. 第二个参数表示输出的边缘图像,为单通道黑白图. 第三个参数表示阈值 第四个参数表示最大值. 第五个参数表示运算方法. 在OpenCV的imgproc\types_c.h中

OpenCV图像的全局阈值二值化函数(OTSU)

cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最佳阈值算法.该方法在类间方差最大的情况下是最佳的,就图像的灰度值而言,OTSU给出最好的类间分离的阈值. OpenCV阈值分割的几种方法(types_c.h中的定义): /* Threshold types */ enum { CV_THRESH_BINARY =0, /* value = valu

[openCV] Basic data types

http://docs.opencv.org/2.4.13/ Basis 矩形 "modules/core/src/drawing.cpp" CV_IMPL void cvRectangle( CvArr* _img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness, int line_type, int shift ) { cv::Mat img = cv::cvarrToMat(_img); cv::rectangle