topical media & game development

talk show tell print

lib-of-vs-addons-ofxOpenCv-libs-opencv-include-cvaux.h / h



  /*M
/////////////////////////////////////////////////////////////////////////////////

// // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this license. // If you do not agree to this license, do not download, install, // copy or use the software. // // // Intel License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000, Intel Corporation, all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistribution's of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * The name of Intel Corporation may not be used to endorse or promote products // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and // any express or implied warranties, including, but not limited to, the implied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the Intel Corporation or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages // (including, but not limited to, procurement of substitute goods or services; // loss of use, data, or profits; or business interruption) however caused // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. // //M*/
ifndef __CVAUX__H__ define __CVAUX__H__ include <cv.h> ifdef __cplusplus extern "C" { endif CVAPI(CvSeq*) cvSegmentImage( const CvArr* srcarr, CvArr* dstarr, double canny_threshold, double ffill_threshold, CvMemStorage* storage );
**************************************************************************************\ Eigen objects * \***************************************************************************************

  
  
  typedef int (CV_CDECL * CvCallback)(int index, void* buffer, void* user_data);
  typedef union
  {
      CvCallback callback;
      void* data;
  }
  CvInput;
  
  define CV_EIGOBJ_NO_CALLBACK     0
  define CV_EIGOBJ_INPUT_CALLBACK  1
  define CV_EIGOBJ_OUTPUT_CALLBACK 2
  define CV_EIGOBJ_BOTH_CALLBACK   3
  
  /* Calculates covariation matrix of a set of arrays */
  CVAPI(void)  cvCalcCovarMatrixEx( int nObjects, void* input, int ioFlags,
                                    int ioBufSize, uchar* buffer, void* userData,
                                    IplImage* avg, float* covarMatrix );
  
  /* Calculates eigen values and vectors of covariation matrix of a set of
     arrays */
  CVAPI(void)  cvCalcEigenObjects( int nObjects, void* input, void* output,
                                   int ioFlags, int ioBufSize, void* userData,
                                   CvTermCriteria* calcLimit, IplImage* avg,
                                   float* eigVals );
  
  /* Calculates dot product (obj - avg) * eigObj (i.e. projects image to eigen vector) */
  CVAPI(double)  cvCalcDecompCoeff( IplImage* obj, IplImage* eigObj, IplImage* avg );
  
  /* Projects image to eigen space (finds all decomposion coefficients */
  CVAPI(void)  cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput,
                                   int ioFlags, void* userData, IplImage* avg,
                                   float* coeffs );
  
  /* Projects original objects used to calculate eigen space basis to that space */
  CVAPI(void)  cvEigenProjection( void* eigInput, int nEigObjs, int ioFlags,
                                  void* userData, float* coeffs, IplImage* avg,
                                  IplImage* proj );
  
  
**************************************************************************************\ 1D/2D HMM * \***************************************************************************************

  
  
  typedef struct CvImgObsInfo
  {
      int obs_x;
      int obs_y;
      int obs_size;
      float* obs;//consequtive observations
  
      int* state;/* arr of pairs superstate/state to which observation belong */
      int* mix;  /* number of mixture to which observation belong */
  
  }
  CvImgObsInfo;/*struct for 1 image*/
  
  typedef CvImgObsInfo Cv1DObsInfo;
  
  typedef struct CvEHMMState
  {
      int num_mix;        /*number of mixtures in this state*/
      float* mu;          /*mean vectors corresponding to each mixture*/
      float* inv_var;     /* square root of inversed variances corresp. to each mixture*/
      float* log_var_val; /* sum of 0.5 (LN2PI + ln(variance[i]) ) for i=1,n */
      float* weight;      /*array of mixture weights. Summ of all weights in state is 1. */
  
  }
  CvEHMMState;
  
  typedef struct CvEHMM
  {
      int level; /* 0 - lowest(i.e its states are real states), ..... */
      int num_states; /* number of HMM states */
      float*  transP;/*transition probab. matrices for states */
      float** obsProb; /* if level == 0 - array of brob matrices corresponding to hmm
                          if level == 1 - martix of matrices */
      union
      {
          CvEHMMState* state; /* if level == 0 points to real states array,
                                 if not - points to embedded hmms */
          struct CvEHMM* ehmm; /* pointer to an embedded model or NULL, if it is a leaf */
      } u;
  
  }
  CvEHMM;
  
  /*CVAPI(int)  icvCreate1DHMM( CvEHMM** this_hmm,
                                     int state_number, int* num_mix, int obs_size );
  
  CVAPI(int)  icvRelease1DHMM( CvEHMM** phmm );
  
  CVAPI(int)  icvUniform1DSegm( Cv1DObsInfo* obs_info, CvEHMM* hmm );
  
  CVAPI(int)  icvInit1DMixSegm( Cv1DObsInfo** obs_info_array, int num_img, CvEHMM* hmm);
  
  CVAPI(int)  icvEstimate1DHMMStateParams( CvImgObsInfo** obs_info_array, int num_img, CvEHMM* hmm);
  
  CVAPI(int)  icvEstimate1DObsProb( CvImgObsInfo* obs_info, CvEHMM* hmm );
  
  CVAPI(int)  icvEstimate1DTransProb( Cv1DObsInfo** obs_info_array,
                                             int num_seq,
                                             CvEHMM* hmm );
  
  CVAPI(float)  icvViterbi( Cv1DObsInfo* obs_info, CvEHMM* hmm);
  
  CVAPI(int)  icv1DMixSegmL2( CvImgObsInfo** obs_info_array, int num_img, CvEHMM* hmm );*/
  
  
********************************* Embedded HMMs ************************************

  
  
  /* Creates 2D HMM */
  CVAPI(CvEHMM*)  cvCreate2DHMM( int* stateNumber, int* numMix, int obsSize );
  
  /* Releases HMM */
  CVAPI(void)  cvRelease2DHMM( CvEHMM** hmm );
  
  define CV_COUNT_OBS(roi, win, delta, numObs )                                       \
  {                                                                                    \
     (numObs)->width  =((roi)->width  -(win)->width  +(delta)->width)/(delta)->width;  \
     (numObs)->height =((roi)->height -(win)->height +(delta)->height)/(delta)->height;\
  }
  
  /* Creates storage for observation vectors */
  CVAPI(CvImgObsInfo*)  cvCreateObsInfo( CvSize numObs, int obsSize );
  
  /* Releases storage for observation vectors */
  CVAPI(void)  cvReleaseObsInfo( CvImgObsInfo** obs_info );
  
  /* The function takes an image on input and and returns the sequnce of observations
     to be used with an embedded HMM; Each observation is top-left block of DCT
     coefficient matrix */
  CVAPI(void)  cvImgToObs_DCT( const CvArr* arr, float* obs, CvSize dctSize,
                               CvSize obsSize, CvSize delta );
  
  /* Uniformly segments all observation vectors extracted from image */
  CVAPI(void)  cvUniformImgSegm( CvImgObsInfo* obs_info, CvEHMM* ehmm );
  
  /* Does mixture segmentation of the states of embedded HMM */
  CVAPI(void)  cvInitMixSegm( CvImgObsInfo** obs_info_array,
                              int num_img, CvEHMM* hmm );
  
  /* Function calculates means, variances, weights of every Gaussian mixture
     of every low-level state of embedded HMM */
  CVAPI(void)  cvEstimateHMMStateParams( CvImgObsInfo** obs_info_array,
                                         int num_img, CvEHMM* hmm );
  
  /* Function computes transition probability matrices of embedded HMM
     given observations segmentation */
  CVAPI(void)  cvEstimateTransProb( CvImgObsInfo** obs_info_array,
                                    int num_img, CvEHMM* hmm );
  
  /* Function computes probabilities of appearing observations at any state
     (i.e. computes P(obs|state) for every pair(obs,state)) */
  CVAPI(void)  cvEstimateObsProb( CvImgObsInfo* obs_info,
                                  CvEHMM* hmm );
  
  /* Runs Viterbi algorithm for embedded HMM */
  CVAPI(float)  cvEViterbi( CvImgObsInfo* obs_info, CvEHMM* hmm );
  
  /* Function clusters observation vectors from several images
     given observations segmentation.
     Euclidean distance used for clustering vectors.
     Centers of clusters are given means of every mixture */
  CVAPI(void)  cvMixSegmL2( CvImgObsInfo** obs_info_array,
                            int num_img, CvEHMM* hmm );
  
  
**************************************************************************************\ A few functions from old stereo gesture recognition demosions * \***************************************************************************************

  
  
  /* Creates hand mask image given several points on the hand */
  CVAPI(void)  cvCreateHandMask( CvSeq* hand_points,
                                     IplImage *img_mask, CvRect *roi);
  
  /* Finds hand region in range image data */
  CVAPI(void)  cvFindHandRegion (CvPoint3D32f* points, int count,
                                  CvSeq* indexs,
                                  float* line, CvSize2D32f size, int flag,
                                  CvPoint3D32f* center,
                                  CvMemStorage* storage, CvSeq **numbers);
  
  /* Finds hand region in range image data (advanced version) */
  CVAPI(void)  cvFindHandRegionA( CvPoint3D32f* points, int count,
                                  CvSeq* indexs,
                                  float* line, CvSize2D32f size, int jc,
                                  CvPoint3D32f* center,
                                  CvMemStorage* storage, CvSeq **numbers);
  
  
**************************************************************************************\ Additional operations on Subdivisions * \***************************************************************************************

  
  
  // paints voronoi diagram: just demo function
  CVAPI(void)  icvDrawMosaic( CvSubdiv2D* subdiv, IplImage* src, IplImage* dst );
  
  // checks planar subdivision for correctness. It is not an absolute check,
  // but it verifies some relations between quad-edges
  CVAPI(int)   icvSubdiv2DCheck( CvSubdiv2D* subdiv );
  
  // returns squared distance between two 2D points with floating-point coordinates.
  CV_INLINE double icvSqDist2D32f( CvPoint2D32f pt1, CvPoint2D32f pt2 )
  {
      double dx = pt1.x - pt2.x;
      double dy = pt1.y - pt2.y;
  
      return dx*dx + dy*dy;
  }
  
  
**************************************************************************************\ More operations on sequences * \***************************************************************************************

  
  
  
**************************************************************************************

  
  
  define CV_CURRENT_INT( reader ) (*((int *)(reader).ptr))
  define CV_PREV_INT( reader ) (*((int *)(reader).prev_elem))
  
  define  CV_GRAPH_WEIGHTED_VERTEX_FIELDS() CV_GRAPH_VERTEX_FIELDS()\
      float weight;
  
  define  CV_GRAPH_WEIGHTED_EDGE_FIELDS() CV_GRAPH_EDGE_FIELDS()
  
  typedef struct CvGraphWeightedVtx
  {
      CV_GRAPH_WEIGHTED_VERTEX_FIELDS()
  }
  CvGraphWeightedVtx;
  
  typedef struct CvGraphWeightedEdge
  {
      CV_GRAPH_WEIGHTED_EDGE_FIELDS()
  }
  CvGraphWeightedEdge;
  
  typedef enum CvGraphWeightType
  {
      CV_NOT_WEIGHTED,
      CV_WEIGHTED_VTX,
      CV_WEIGHTED_EDGE,
      CV_WEIGHTED_ALL
  } CvGraphWeightType;
  
  
**************************************************************************************

  
  
  
*****************************Stereo correspondence************************************

  
  
  typedef struct CvCliqueFinder
  {   
      CvGraph* graph;
      int**    adj_matr;
      int N; //graph size
  
      // stacks, counters etc/
      int k; //stack size
      int* current_comp;
      int** All;
      
      int* ne;
      int* ce;
      int* fixp; //node with minimal disconnections
      int* nod;
      int* s; //for selected candidate
      int status;
      int best_score;
      int weighted;
      int weighted_edges;    
      float best_weight;
      float* edge_weights;
      float* vertex_weights;
      float* cur_weight;
      float* cand_weight;
  
  } CvCliqueFinder;
  
  define CLIQUE_TIME_OFF 2
  define CLIQUE_FOUND 1
  define CLIQUE_END   0
  
  /*CVAPI(void) cvStartFindCliques( CvGraph* graph, CvCliqueFinder* finder, int reverse, 
                                     int weighted CV_DEFAULT(0),  int weighted_edges CV_DEFAULT(0));
  CVAPI(int) cvFindNextMaximalClique( CvCliqueFinder* finder, int* clock_rest CV_DEFAULT(0) ); 
  CVAPI(void) cvEndFindCliques( CvCliqueFinder* finder );
  
  CVAPI(void) cvBronKerbosch( CvGraph* graph );*/
  
  /*F
/////////////////////////////////////////////////////////////////////////////////

// // Name: cvSubgraphWeight // Purpose: finds weight of subgraph in a graph // Context: // Parameters: // graph - input graph. // subgraph - sequence of pairwise different ints. These are indices of vertices of subgraph. // weight_type - describes the way we measure weight. // one of the following: // CV_NOT_WEIGHTED - weight of a clique is simply its size // CV_WEIGHTED_VTX - weight of a clique is the sum of weights of its vertices // CV_WEIGHTED_EDGE - the same but edges // CV_WEIGHTED_ALL - the same but both edges and vertices // weight_vtx - optional vector of floats, with size = graph->total. // If weight_type is either CV_WEIGHTED_VTX or CV_WEIGHTED_ALL // weights of vertices must be provided. If weight_vtx not zero // these weights considered to be here, otherwise function assumes // that vertices of graph are inherited from CvGraphWeightedVtx. // weight_edge - optional matrix of floats, of width and height = graph->total. // If weight_type is either CV_WEIGHTED_EDGE or CV_WEIGHTED_ALL // weights of edges ought to be supplied. If weight_edge is not zero // function finds them here, otherwise function expects // edges of graph to be inherited from CvGraphWeightedEdge. // If this parameter is not zero structure of the graph is determined from matrix // rather than from CvGraphEdge's. In particular, elements corresponding to // absent edges should be zero. // Returns: // weight of subgraph. // Notes: //F*/
/*CVAPI(float) cvSubgraphWeight( CvGraph *graph, CvSeq *subgraph, CvGraphWeightType weight_type CV_DEFAULT(CV_NOT_WEIGHTED), CvVect32f weight_vtx CV_DEFAULT(0), CvMatr32f weight_edge CV_DEFAULT(0) );*/ /*F
/////////////////////////////////////////////////////////////////////////////////

// // Name: cvFindCliqueEx // Purpose: tries to find clique with maximum possible weight in a graph // Context: // Parameters: // graph - input graph. // storage - memory storage to be used by the result. // is_complementary - optional flag showing whether function should seek for clique // in complementary graph. // weight_type - describes our notion about weight. // one of the following: // CV_NOT_WEIGHTED - weight of a clique is simply its size // CV_WEIGHTED_VTX - weight of a clique is the sum of weights of its vertices // CV_WEIGHTED_EDGE - the same but edges // CV_WEIGHTED_ALL - the same but both edges and vertices // weight_vtx - optional vector of floats, with size = graph->total. // If weight_type is either CV_WEIGHTED_VTX or CV_WEIGHTED_ALL // weights of vertices must be provided. If weight_vtx not zero // these weights considered to be here, otherwise function assumes // that vertices of graph are inherited from CvGraphWeightedVtx. // weight_edge - optional matrix of floats, of width and height = graph->total. // If weight_type is either CV_WEIGHTED_EDGE or CV_WEIGHTED_ALL // weights of edges ought to be supplied. If weight_edge is not zero // function finds them here, otherwise function expects // edges of graph to be inherited from CvGraphWeightedEdge. // Note that in case of CV_WEIGHTED_EDGE or CV_WEIGHTED_ALL // nonzero is_complementary implies nonzero weight_edge. // start_clique - optional sequence of pairwise different ints. They are indices of // vertices that shall be present in the output clique. // subgraph_of_ban - optional sequence of (maybe equal) ints. They are indices of // vertices that shall not be present in the output clique. // clique_weight_ptr - optional output parameter. Weight of found clique stored here. // num_generations - optional number of generations in evolutionary part of algorithm, // zero forces to return first found clique. // quality - optional parameter determining degree of required quality/speed tradeoff. // Must be in the range from 0 to 9. // 0 is fast and dirty, 9 is slow but hopefully yields good clique. // Returns: // sequence of pairwise different ints. // These are indices of vertices that form found clique. // Notes: // in cases of CV_WEIGHTED_EDGE and CV_WEIGHTED_ALL weights should be nonnegative. // start_clique has a priority over subgraph_of_ban. //F*/
/*CVAPI(CvSeq*) cvFindCliqueEx( CvGraph *graph, CvMemStorage *storage, int is_complementary CV_DEFAULT(0), CvGraphWeightType weight_type CV_DEFAULT(CV_NOT_WEIGHTED), CvVect32f weight_vtx CV_DEFAULT(0), CvMatr32f weight_edge CV_DEFAULT(0), CvSeq *start_clique CV_DEFAULT(0), CvSeq *subgraph_of_ban CV_DEFAULT(0), float *clique_weight_ptr CV_DEFAULT(0), int num_generations CV_DEFAULT(3), int quality CV_DEFAULT(2) );*/ define CV_UNDEF_SC_PARAM 12345 //default value of parameters define CV_IDP_BIRCHFIELD_PARAM1 25 define CV_IDP_BIRCHFIELD_PARAM2 5 define CV_IDP_BIRCHFIELD_PARAM3 12 define CV_IDP_BIRCHFIELD_PARAM4 15 define CV_IDP_BIRCHFIELD_PARAM5 25 define CV_DISPARITY_BIRCHFIELD 0 /*F
/////////////////////////////////////////////////////////////////////

// // Name: cvFindStereoCorrespondence // Purpose: find stereo correspondence on stereo-pair // Context: // Parameters: // leftImage - left image of stereo-pair (format 8uC1). // rightImage - right image of stereo-pair (format 8uC1). // mode - mode of correspondence retrieval (now CV_DISPARITY_BIRCHFIELD only) // dispImage - destination disparity image // maxDisparity - maximal disparity // param1, param2, param3, param4, param5 - parameters of algorithm // Returns: // Notes: // Images must be rectified. // All images must have format 8uC1. //F*/
CVAPI(void) cvFindStereoCorrespondence( const CvArr* leftImage, const CvArr* rightImage, int mode, CvArr* dispImage, int maxDisparity, double param1 CV_DEFAULT(CV_UNDEF_SC_PARAM), double param2 CV_DEFAULT(CV_UNDEF_SC_PARAM), double param3 CV_DEFAULT(CV_UNDEF_SC_PARAM), double param4 CV_DEFAULT(CV_UNDEF_SC_PARAM), double param5 CV_DEFAULT(CV_UNDEF_SC_PARAM) );
**************************************************************************************

  
  
********** Epiline functions ******************

  
  
  typedef struct CvStereoLineCoeff
  {
      double Xcoef;
      double XcoefA;
      double XcoefB;
      double XcoefAB;
  
      double Ycoef;
      double YcoefA;
      double YcoefB;
      double YcoefAB;
  
      double Zcoef;
      double ZcoefA;
      double ZcoefB;
      double ZcoefAB;
  }CvStereoLineCoeff;
  
  typedef struct CvCamera
  {
      float   imgSize[2]; /* size of the camera view, used during calibration */
      float   matrix[9]; /* intinsic camera parameters:  [ fx 0 cx; 0 fy cy; 0 0 1 ] */
      float   distortion[4]; /* distortion coefficients - two coefficients for radial distortion
                                and another two for tangential: [ k1 k2 p1 p2 ] */
      float   rotMatr[9];
      float   transVect[3]; /* rotation matrix and transition vector relatively
                               to some reference point in the space. */
  }
  CvCamera;
  
  typedef struct CvStereoCamera
  {
      CvCamera* camera[2]; /* two individual camera parameters */
      float fundMatr[9]; /* fundamental matrix */
  
      /* New part for stereo */
      CvPoint3D32f epipole[2];
      CvPoint2D32f quad[2][4]; /* coordinates of destination quadrangle after
                                  epipolar geometry rectification */
      double coeffs[2][3][3];/* coefficients for transformation */
      CvPoint2D32f border[2][4];
      CvSize warpSize;
      CvStereoLineCoeff* lineCoeffs;
      int needSwapCameras;/* flag set to 1 if need to swap cameras for good reconstruction */
      float rotMatrix[9];
      float transVector[3];
  }
  CvStereoCamera;
  
  typedef struct CvContourOrientation
  {
      float egvals[2];
      float egvects[4];
  
      float max, min; // minimum and maximum projections
      int imax, imin;
  } CvContourOrientation;
  
  define CV_CAMERA_TO_WARP 1
  define CV_WARP_TO_CAMERA 2
  
  CVAPI(int) icvConvertWarpCoordinates(double coeffs[3][3],
                                  CvPoint2D32f* cameraPoint,
                                  CvPoint2D32f* warpPoint,
                                  int direction);
  
  CVAPI(int) icvGetSymPoint3D(  CvPoint3D64f pointCorner,
                              CvPoint3D64f point1,
                              CvPoint3D64f point2,
                              CvPoint3D64f *pointSym2);
  
  CVAPI(void) icvGetPieceLength3D(CvPoint3D64f point1,CvPoint3D64f point2,double* dist);
  
  CVAPI(int) icvCompute3DPoint(    double alpha,double betta,
                              CvStereoLineCoeff* coeffs,
                              CvPoint3D64f* point);
  
  CVAPI(int) icvCreateConvertMatrVect( CvMatr64d     rotMatr1,
                                  CvMatr64d     transVect1,
                                  CvMatr64d     rotMatr2,
                                  CvMatr64d     transVect2,
                                  CvMatr64d     convRotMatr,
                                  CvMatr64d     convTransVect);
  
  CVAPI(int) icvConvertPointSystem(CvPoint3D64f  M2,
                              CvPoint3D64f* M1,
                              CvMatr64d     rotMatr,
                              CvMatr64d     transVect
                              );
  
  CVAPI(int) icvComputeCoeffForStereo(  CvStereoCamera* stereoCamera);
  
  CVAPI(int) icvGetCrossPieceVector(CvPoint2D32f p1_start,CvPoint2D32f p1_end,CvPoint2D32f v2_start,CvPoint2D32f v2_end,CvPoint2D32f *cross);
  CVAPI(int) icvGetCrossLineDirect(CvPoint2D32f p1,CvPoint2D32f p2,float a,float b,float c,CvPoint2D32f* cross);
  CVAPI(float) icvDefinePointPosition(CvPoint2D32f point1,CvPoint2D32f point2,CvPoint2D32f point);
  CVAPI(int) icvStereoCalibration( int numImages,
                              int* nums,
                              CvSize imageSize,
                              CvPoint2D32f* imagePoints1,
                              CvPoint2D32f* imagePoints2,
                              CvPoint3D32f* objectPoints,
                              CvStereoCamera* stereoparams
                             );
  
  CVAPI(int) icvComputeRestStereoParams(CvStereoCamera *stereoparams);
  
  CVAPI(void) cvComputePerspectiveMap( const double coeffs[3][3], CvArr* rectMapX, CvArr* rectMapY );
  
  CVAPI(int) icvComCoeffForLine(   CvPoint2D64f point1,
                              CvPoint2D64f point2,
                              CvPoint2D64f point3,
                              CvPoint2D64f point4,
                              CvMatr64d    camMatr1,
                              CvMatr64d    rotMatr1,
                              CvMatr64d    transVect1,
                              CvMatr64d    camMatr2,
                              CvMatr64d    rotMatr2,
                              CvMatr64d    transVect2,
                              CvStereoLineCoeff*    coeffs,
                              int* needSwapCameras);
  
  CVAPI(int) icvGetDirectionForPoint(  CvPoint2D64f point,
                                  CvMatr64d camMatr,
                                  CvPoint3D64f* direct);
  
  CVAPI(int) icvGetCrossLines(CvPoint3D64f point11,CvPoint3D64f point12,
                         CvPoint3D64f point21,CvPoint3D64f point22,
                         CvPoint3D64f* midPoint);
  
  CVAPI(int) icvComputeStereoLineCoeffs(   CvPoint3D64f pointA,
                                      CvPoint3D64f pointB,
                                      CvPoint3D64f pointCam1,
                                      double gamma,
                                      CvStereoLineCoeff*    coeffs);
  
  /*CVAPI(int) icvComputeFundMatrEpipoles ( CvMatr64d camMatr1, 
                                      CvMatr64d     rotMatr1, 
                                      CvVect64d     transVect1,
                                      CvMatr64d     camMatr2,
                                      CvMatr64d     rotMatr2,
                                      CvVect64d     transVect2,
                                      CvPoint2D64f* epipole1,
                                      CvPoint2D64f* epipole2,
                                      CvMatr64d     fundMatr);*/
  
  CVAPI(int) icvGetAngleLine( CvPoint2D64f startPoint, CvSize imageSize,CvPoint2D64f *point1,CvPoint2D64f *point2);
  
  CVAPI(void) icvGetCoefForPiece(   CvPoint2D64f p_start,CvPoint2D64f p_end,
                          double *a,double *b,double *c,
                          int* result);
  
  /*CVAPI(void) icvGetCommonArea( CvSize imageSize,
                      CvPoint2D64f epipole1,CvPoint2D64f epipole2,
                      CvMatr64d fundMatr,
                      CvVect64d coeff11,CvVect64d coeff12,
                      CvVect64d coeff21,CvVect64d coeff22,
                      int* result);*/
  
  CVAPI(void) icvComputeeInfiniteProject1(CvMatr64d    rotMatr,
                                       CvMatr64d    camMatr1,
                                       CvMatr64d    camMatr2,
                                       CvPoint2D32f point1,
                                       CvPoint2D32f *point2);
  
  CVAPI(void) icvComputeeInfiniteProject2(CvMatr64d    rotMatr,
                                       CvMatr64d    camMatr1,
                                       CvMatr64d    camMatr2,
                                       CvPoint2D32f* point1,
                                       CvPoint2D32f point2);
  
  CVAPI(void) icvGetCrossDirectDirect(  CvVect64d direct1,CvVect64d direct2,
                              CvPoint2D64f *cross,int* result);
  
  CVAPI(void) icvGetCrossPieceDirect(   CvPoint2D64f p_start,CvPoint2D64f p_end,
                              double a,double b,double c,
                              CvPoint2D64f *cross,int* result);
  
  CVAPI(void) icvGetCrossPiecePiece( CvPoint2D64f p1_start,CvPoint2D64f p1_end,
                              CvPoint2D64f p2_start,CvPoint2D64f p2_end,
                              CvPoint2D64f* cross,
                              int* result);
                              
  CVAPI(void) icvGetPieceLength(CvPoint2D64f point1,CvPoint2D64f point2,double* dist);
  
  CVAPI(void) icvGetCrossRectDirect(    CvSize imageSize,
                              double a,double b,double c,
                              CvPoint2D64f *start,CvPoint2D64f *end,
                              int* result);
  
  CVAPI(void) icvProjectPointToImage(   CvPoint3D64f point,
                              CvMatr64d camMatr,CvMatr64d rotMatr,CvVect64d transVect,
                              CvPoint2D64f* projPoint);
  
  CVAPI(void) icvGetQuadsTransform( CvSize        imageSize,
                          CvMatr64d     camMatr1,
                          CvMatr64d     rotMatr1,
                          CvVect64d     transVect1,
                          CvMatr64d     camMatr2,
                          CvMatr64d     rotMatr2,
                          CvVect64d     transVect2,
                          CvSize*       warpSize,
                          double quad1[4][2],
                          double quad2[4][2],
                          CvMatr64d     fundMatr,
                          CvPoint3D64f* epipole1,
                          CvPoint3D64f* epipole2
                          );
  
  CVAPI(void) icvGetQuadsTransformStruct(  CvStereoCamera* stereoCamera);
  
  CVAPI(void) icvComputeStereoParamsForCameras(CvStereoCamera* stereoCamera);
  
  CVAPI(void) icvGetCutPiece(   CvVect64d areaLineCoef1,CvVect64d areaLineCoef2,
                      CvPoint2D64f epipole,
                      CvSize imageSize,
                      CvPoint2D64f* point11,CvPoint2D64f* point12,
                      CvPoint2D64f* point21,CvPoint2D64f* point22,
                      int* result);
  
  CVAPI(void) icvGetMiddleAnglePoint(   CvPoint2D64f basePoint,
                              CvPoint2D64f point1,CvPoint2D64f point2,
                              CvPoint2D64f* midPoint);
  
  CVAPI(void) icvGetNormalDirect(CvVect64d direct,CvPoint2D64f point,CvVect64d normDirect);
  
  CVAPI(double) icvGetVect(CvPoint2D64f basePoint,CvPoint2D64f point1,CvPoint2D64f point2);
  
  CVAPI(void) icvProjectPointToDirect(  CvPoint2D64f point,CvVect64d lineCoeff,
                              CvPoint2D64f* projectPoint);
  
  CVAPI(void) icvGetDistanceFromPointToDirect( CvPoint2D64f point,CvVect64d lineCoef,double*dist);
  
  CVAPI(IplImage*) icvCreateIsometricImage( IplImage* src, IplImage* dst,
                                int desired_depth, int desired_num_channels );
  
  CVAPI(void) cvDeInterlace( const CvArr* frame, CvArr* fieldEven, CvArr* fieldOdd );
  
  /*CVAPI(int) icvSelectBestRt(           int           numImages,
                                      int*          numPoints,
                                      CvSize        imageSize,
                                      CvPoint2D32f* imagePoints1,
                                      CvPoint2D32f* imagePoints2,
                                      CvPoint3D32f* objectPoints,
  
                                      CvMatr32f     cameraMatrix1,
                                      CvVect32f     distortion1,
                                      CvMatr32f     rotMatrs1,
                                      CvVect32f     transVects1,
  
                                      CvMatr32f     cameraMatrix2,
                                      CvVect32f     distortion2,
                                      CvMatr32f     rotMatrs2,
                                      CvVect32f     transVects2,
  
                                      CvMatr32f     bestRotMatr,
                                      CvVect32f     bestTransVect
                                      );*/
  
  
**************************************************************************************\ Contour Morphing * \***************************************************************************************

  
  
  /* finds correspondence between two contours */
  CvSeq* cvCalcContoursCorrespondence( const CvSeq* contour1,
                                       const CvSeq* contour2, 
                                       CvMemStorage* storage);
  
  /* morphs contours using the pre-calculated correspondence:
     alpha=0 ~ contour1, alpha=1 ~ contour2 */
  CvSeq* cvMorphContours( const CvSeq* contour1, const CvSeq* contour2,
                          CvSeq* corr, double alpha,
                          CvMemStorage* storage );
  
  
**************************************************************************************\ Texture Descriptors * \***************************************************************************************

  
  
  define CV_GLCM_OPTIMIZATION_NONE                   -2
  define CV_GLCM_OPTIMIZATION_LUT                    -1
  define CV_GLCM_OPTIMIZATION_HISTOGRAM              0
  
  define CV_GLCMDESC_OPTIMIZATION_ALLOWDOUBLENEST    10
  define CV_GLCMDESC_OPTIMIZATION_ALLOWTRIPLENEST    11
  define CV_GLCMDESC_OPTIMIZATION_HISTOGRAM          4
  
  define CV_GLCMDESC_ENTROPY                         0
  define CV_GLCMDESC_ENERGY                          1
  define CV_GLCMDESC_HOMOGENITY                      2
  define CV_GLCMDESC_CONTRAST                        3
  define CV_GLCMDESC_CLUSTERTENDENCY                 4
  define CV_GLCMDESC_CLUSTERSHADE                    5
  define CV_GLCMDESC_CORRELATION                     6
  define CV_GLCMDESC_CORRELATIONINFO1                7
  define CV_GLCMDESC_CORRELATIONINFO2                8
  define CV_GLCMDESC_MAXIMUMPROBABILITY              9
  
  define CV_GLCM_ALL                                 0
  define CV_GLCM_GLCM                                1
  define CV_GLCM_DESC                                2
  
  typedef struct CvGLCM CvGLCM;
  
  CVAPI(CvGLCM*) cvCreateGLCM( const IplImage* srcImage,
                                  int stepMagnitude,
                                  const int* stepDirections CV_DEFAULT(0),
                                  int numStepDirections CV_DEFAULT(0),
                                  int optimizationType CV_DEFAULT(CV_GLCM_OPTIMIZATION_NONE));
  
  CVAPI(void) cvReleaseGLCM( CvGLCM** GLCM, int flag CV_DEFAULT(CV_GLCM_ALL));
  
  CVAPI(void) cvCreateGLCMDescriptors( CvGLCM* destGLCM,
                                          int descriptorOptimizationType
                                          CV_DEFAULT(CV_GLCMDESC_OPTIMIZATION_ALLOWDOUBLENEST));
  
  CVAPI(double) cvGetGLCMDescriptor( CvGLCM* GLCM, int step, int descriptor );
  
  CVAPI(void) cvGetGLCMDescriptorStatistics( CvGLCM* GLCM, int descriptor,
                                                double* average, double* standardDeviation );
  
  CVAPI(IplImage*) cvCreateGLCMImage( CvGLCM* GLCM, int step );
  
  
**************************************************************************************\ Face eyes&mouth tracking * \***************************************************************************************

  
  
  typedef struct CvFaceTracker CvFaceTracker;
  
  define CV_NUM_FACE_ELEMENTS    3 
  enum CV_FACE_ELEMENTS
  {
      CV_FACE_MOUTH = 0,
      CV_FACE_LEFT_EYE = 1,
      CV_FACE_RIGHT_EYE = 2
  };
  
  CVAPI(CvFaceTracker*) cvInitFaceTracker(CvFaceTracker* pFaceTracking, const IplImage* imgGray,
                                                  CvRect* pRects, int nRects);
  CVAPI(int) cvTrackFace( CvFaceTracker* pFaceTracker, IplImage* imgGray,
                                CvRect* pRects, int nRects,
                                CvPoint* ptRotate, double* dbAngleRotate);
  CVAPI(void) cvReleaseFaceTracker(CvFaceTracker** ppFaceTracker);
  
  typedef struct CvFace
  {
      CvRect MouthRect;
      CvRect LeftEyeRect;
      CvRect RightEyeRect;
  } CvFaceData;
  
  CvSeq * cvFindFace(IplImage * Image,CvMemStorage* storage);
  CvSeq * cvPostBoostingFindFace(IplImage * Image,CvMemStorage* storage);
  
  
**************************************************************************************\ 3D Tracker * \***************************************************************************************

  
  
  typedef unsigned char CvBool;
  
  typedef struct
  {
      int id;
      CvPoint2D32f p; // pgruebele: So we do not loose precision, this needs to be float
  } Cv3dTracker2dTrackedObject;
  
  CV_INLINE Cv3dTracker2dTrackedObject cv3dTracker2dTrackedObject(int id, CvPoint2D32f p)
  {
      Cv3dTracker2dTrackedObject r;
      r.id = id;
      r.p = p;
      return r;
  }
  
  typedef struct
  {
      int id;
      CvPoint3D32f p;             // location of the tracked object
  } Cv3dTrackerTrackedObject;
  
  CV_INLINE Cv3dTrackerTrackedObject cv3dTrackerTrackedObject(int id, CvPoint3D32f p)
  {
      Cv3dTrackerTrackedObject r;
      r.id = id;
      r.p = p;
      return r;
  }
  
  typedef struct
  {
      CvBool valid;
      float mat[4][4];              /* maps camera coordinates to world coordinates */
      CvPoint2D32f principal_point; /* copied from intrinsics so this structure */
                                    /* has all the info we need */
  } Cv3dTrackerCameraInfo;
  
  typedef struct
  {
      CvPoint2D32f principal_point;
      float focal_length[2];
      float distortion[4];
  } Cv3dTrackerCameraIntrinsics;
  
  CVAPI(CvBool) cv3dTrackerCalibrateCameras(int num_cameras,
                       const Cv3dTrackerCameraIntrinsics camera_intrinsics[], /* size is num_cameras */
                       CvSize etalon_size,
                       float square_size,
                       IplImage *samples[],                                   /* size is num_cameras */
                       Cv3dTrackerCameraInfo camera_info[]);                  /* size is num_cameras */
  
  CVAPI(int)  cv3dTrackerLocateObjects(int num_cameras, int num_objects,
                     const Cv3dTrackerCameraInfo camera_info[],        /* size is num_cameras */
                     const Cv3dTracker2dTrackedObject tracking_info[], /* size is num_objects*num_cameras */
                     Cv3dTrackerTrackedObject tracked_objects[]);      /* size is num_objects */
  
************************************************************************************** tracking_info is a rectangular array; one row per camera, num_objects elements per row. The id field of any unused slots must be -1. Ids need not be ordered or consecutive. On completion, the return value is the number of objects located; i.e., the number of objects visible by more than one camera. The id field of any unused slots in tracked objects is set to -1. **************************************************************************************

  
  
  
**************************************************************************************\ Skeletons and Linear-Contour Models * \***************************************************************************************

  
  
  typedef enum CvLeeParameters
  {
      CV_LEE_INT = 0,
      CV_LEE_FLOAT = 1,
      CV_LEE_DOUBLE = 2,
      CV_LEE_AUTO = -1,
      CV_LEE_ERODE = 0,
      CV_LEE_ZOOM = 1,
      CV_LEE_NON = 2
  } CvLeeParameters;
  
  define CV_NEXT_VORONOISITE2D( SITE ) ((SITE)->edge[0]->site[((SITE)->edge[0]->site[0] == (SITE))])
  define CV_PREV_VORONOISITE2D( SITE ) ((SITE)->edge[1]->site[((SITE)->edge[1]->site[0] == (SITE))])
  define CV_FIRST_VORONOIEDGE2D( SITE ) ((SITE)->edge[0])
  define CV_LAST_VORONOIEDGE2D( SITE ) ((SITE)->edge[1])
  define CV_NEXT_VORONOIEDGE2D( EDGE, SITE ) ((EDGE)->next[(EDGE)->site[0] != (SITE)])
  define CV_PREV_VORONOIEDGE2D( EDGE, SITE ) ((EDGE)->next[2 + ((EDGE)->site[0] != (SITE))])
  define CV_VORONOIEDGE2D_BEGINNODE( EDGE, SITE ) ((EDGE)->node[((EDGE)->site[0] != (SITE))])
  define CV_VORONOIEDGE2D_ENDNODE( EDGE, SITE ) ((EDGE)->node[((EDGE)->site[0] == (SITE))])
  define CV_TWIN_VORONOISITE2D( SITE, EDGE ) ( (EDGE)->site[((EDGE)->site[0] == (SITE))]) 
  
  define CV_VORONOISITE2D_FIELDS()    \
      struct CvVoronoiNode2D *node[2]; \
      struct CvVoronoiEdge2D *edge[2];
  
  typedef struct CvVoronoiSite2D
  {
      CV_VORONOISITE2D_FIELDS()
      struct CvVoronoiSite2D *next[2];
  } CvVoronoiSite2D;
  
  define CV_VORONOIEDGE2D_FIELDS()    \
      struct CvVoronoiNode2D *node[2]; \
      struct CvVoronoiSite2D *site[2]; \
      struct CvVoronoiEdge2D *next[4];
  
  typedef struct CvVoronoiEdge2D
  {
      CV_VORONOIEDGE2D_FIELDS()
  } CvVoronoiEdge2D;
  
  define CV_VORONOINODE2D_FIELDS()       \
      CV_SET_ELEM_FIELDS(CvVoronoiNode2D) \
      CvPoint2D32f pt;                    \
      float radius;
  
  typedef struct CvVoronoiNode2D
  {
      CV_VORONOINODE2D_FIELDS()
  } CvVoronoiNode2D;
  
  define CV_VORONOIDIAGRAM2D_FIELDS() \
      CV_GRAPH_FIELDS()                \
      CvSet *sites;
  
  typedef struct CvVoronoiDiagram2D
  {
      CV_VORONOIDIAGRAM2D_FIELDS()
  } CvVoronoiDiagram2D;
  
  /* Computes Voronoi Diagram for given polygons with holes */
  CVAPI(int)  cvVoronoiDiagramFromContour(CvSeq* ContourSeq,
                                             CvVoronoiDiagram2D** VoronoiDiagram,
                                             CvMemStorage* VoronoiStorage,
                                             CvLeeParameters contour_type CV_DEFAULT(CV_LEE_INT),
                                             int contour_orientation CV_DEFAULT(-1),
                                             int attempt_number CV_DEFAULT(10));
  
  /* Computes Voronoi Diagram for domains in given image */
  CVAPI(int)  cvVoronoiDiagramFromImage(IplImage* pImage,
                                           CvSeq** ContourSeq,
                                           CvVoronoiDiagram2D** VoronoiDiagram,
                                           CvMemStorage* VoronoiStorage,
                                           CvLeeParameters regularization_method CV_DEFAULT(CV_LEE_NON),
                                           float approx_precision CV_DEFAULT(CV_LEE_AUTO));
  
  /* Deallocates the storage */
  CVAPI(void) cvReleaseVoronoiStorage(CvVoronoiDiagram2D* VoronoiDiagram,
                                            CvMemStorage** pVoronoiStorage);
  
  
********************* Linear-Contour Model ***************************

  
  
  struct CvLCMEdge;
  struct CvLCMNode;
  
  typedef struct CvLCMEdge
  {
      CV_GRAPH_EDGE_FIELDS() 
      CvSeq* chain;
      float width;
      int index1;
      int index2;
  } CvLCMEdge;
  
  typedef struct CvLCMNode
  {
      CV_GRAPH_VERTEX_FIELDS()
      CvContour* contour; 
  } CvLCMNode;
  
  /* Computes hybrid model from Voronoi Diagram */
  CVAPI(CvGraph*) cvLinearContorModelFromVoronoiDiagram(CvVoronoiDiagram2D* VoronoiDiagram,
                                                           float maxWidth);
  
  /* Releases hybrid model storage */
  CVAPI(int) cvReleaseLinearContorModelStorage(CvGraph** Graph);
  
  /* two stereo-related functions */
  
  CVAPI(void) cvInitPerspectiveTransform( CvSize size, const CvPoint2D32f vertex[4], double matrix[3][3],
                                                CvArr* rectMap );
  
  /*CVAPI(void) cvInitStereoRectification( CvStereoCamera* params,
                                               CvArr* rectMap1, CvArr* rectMap2,
                                               int do_undistortion );*/
  
  
************************* View Morphing Functions ***********************

  
  
  /* The order of the function corresponds to the order they should appear in
     the view morphing pipeline */ 
  
  /* Finds ending points of scanlines on left and right images of stereo-pair */
  CVAPI(void)  cvMakeScanlines( const CvMatrix3* matrix, CvSize  img_size,
                                int*  scanlines1, int*  scanlines2,
                                int*  lengths1, int*  lengths2,
                                int*  line_count );
  
  /* Grab pixel values from scanlines and stores them sequentially
     (some sort of perspective image transform) */
  CVAPI(void)  cvPreWarpImage( int       line_count,
                               IplImage* img,
                               uchar*    dst,
                               int*      dst_nums,
                               int*      scanlines);
  
  /* Approximate each grabbed scanline by a sequence of runs
     (lossy run-length compression) */
  CVAPI(void)  cvFindRuns( int    line_count,
                           uchar* prewarp1,
                           uchar* prewarp2,
                           int*   line_lengths1,
                           int*   line_lengths2,
                           int*   runs1,
                           int*   runs2,
                           int*   num_runs1,
                           int*   num_runs2);
  
  /* Compares two sets of compressed scanlines */
  CVAPI(void)  cvDynamicCorrespondMulti( int  line_count,
                                         int* first,
                                         int* first_runs,
                                         int* second,
                                         int* second_runs,
                                         int* first_corr,
                                         int* second_corr);
  
  /* Finds scanline ending coordinates for some intermediate "virtual" camera position */
  CVAPI(void)  cvMakeAlphaScanlines( int*  scanlines1,
                                     int*  scanlines2,
                                     int*  scanlinesA,
                                     int*  lengths,
                                     int   line_count,
                                     float alpha);
  
  /* Blends data of the left and right image scanlines to get
     pixel values of "virtual" image scanlines */
  CVAPI(void)  cvMorphEpilinesMulti( int    line_count,
                                     uchar* first_pix,
                                     int*   first_num,
                                     uchar* second_pix,
                                     int*   second_num,
                                     uchar* dst_pix,
                                     int*   dst_num,
                                     float  alpha,
                                     int*   first,
                                     int*   first_runs,
                                     int*   second,
                                     int*   second_runs,
                                     int*   first_corr,
                                     int*   second_corr);
  
  /* Does reverse warping of the morphing result to make
     it fill the destination image rectangle */
  CVAPI(void)  cvPostWarpImage( int       line_count,
                                uchar*    src,
                                int*      src_nums,
                                IplImage* img,
                                int*      scanlines);
  
  /* Deletes Moire (missed pixels that appear due to discretization) */
  CVAPI(void)  cvDeleteMoire( IplImage*  img );
  
  
**************************************************************************************\ Background/foreground segmentation * \***************************************************************************************

  
  
  /* We discriminate between foreground and background pixels
   * by building and maintaining a model of the background.
   * Any pixel which does not fit this model is then deemed
   * to be foreground.
   *
   * At present we support two core background models,
   * one of which has two variations:
   *
   *  o CV_BG_MODEL_FGD: latest and greatest algorithm, described in
   *    
   *         Foreground Object Detection from Videos Containing Complex Background.
   *         Liyuan Li, Weimin Huang, Irene Y.H. Gu, and Qi Tian. 
   *         ACM MM2003 9p
   *
   *  o CV_BG_MODEL_FGD_SIMPLE:
   *       A code comment describes this as a simplified version of the above,
   *       but the code is in fact currently identical
   *
   *  o CV_BG_MODEL_MOG: "Mixture of Gaussians", older algorithm, described in
   *
   *       Moving target classification and tracking from real-time video.
   *       A Lipton, H Fujijoshi, R Patil
   *       Proceedings IEEE Workshop on Application of Computer Vision pp 8-14 1998
   *
   *       Learning patterns of activity using real-time tracking
   *       C Stauffer and W Grimson  August 2000
   *       IEEE Transactions on Pattern Analysis and Machine Intelligence 22(8):747-757
   */
  
  define CV_BG_MODEL_FGD                0
  define CV_BG_MODEL_MOG                1                        /* "Mixture of Gaussians".	*/
  define CV_BG_MODEL_FGD_SIMPLE        2
  
  struct CvBGStatModel;
  
  typedef void (CV_CDECL * CvReleaseBGStatModel)( struct CvBGStatModel** bg_model );
  typedef int (CV_CDECL * CvUpdateBGStatModel)( IplImage* curr_frame, struct CvBGStatModel* bg_model );
  
  define CV_BG_STAT_MODEL_FIELDS()                                                   \
      int             type; /*type of BG model*/                                      \
      CvReleaseBGStatModel release;                                                   \
      CvUpdateBGStatModel update;                                                     \
      IplImage*       background;   /*8UC3 reference background image*/               \
      IplImage*       foreground;   /*8UC1 foreground image*/                         \
      IplImage**      layers;       /*8UC3 reference background image, can be null */ \
      int             layer_count;  /* can be zero */                                 \
      CvMemStorage*   storage;      /*storage for “foreground_regions”*/              \
      CvSeq*          foreground_regions /*foreground object contours*/
  
  typedef struct CvBGStatModel
  {
      CV_BG_STAT_MODEL_FIELDS();
  }
  CvBGStatModel;
  
  // 
  
  // Releases memory used by BGStatModel
  CV_INLINE void cvReleaseBGStatModel( CvBGStatModel** bg_model )
  {
      if( bg_model && *bg_model && (*bg_model)->release )
          (*bg_model)->release( bg_model );
  }
  
  // Updates statistical model and returns number of found foreground regions
  CV_INLINE int cvUpdateBGStatModel( IplImage* current_frame, CvBGStatModel*  bg_model )
  {
      return bg_model && bg_model->update ? bg_model->update( current_frame, bg_model ) : 0;
  }
  
  // Performs FG post-processing using segmentation
  // (all pixels of a region will be classified as foreground if majority of pixels of the region are FG).
  // parameters:
  //      segments - pointer to result of segmentation (for example MeanShiftSegmentation)
  //      bg_model - pointer to CvBGStatModel structure
  CVAPI(void) cvRefineForegroundMaskBySegm( CvSeq* segments, CvBGStatModel*  bg_model );
  
  /* Common use change detection function */
  CVAPI(int)  cvChangeDetection( IplImage*  prev_frame,
                                 IplImage*  curr_frame,
                                 IplImage*  change_mask );
  
  /*
    Interface of ACM MM2003 algorithm
  */
  
  /* Default parameters of foreground detection algorithm: */
  define  CV_BGFG_FGD_LC              128
  define  CV_BGFG_FGD_N1C             15
  define  CV_BGFG_FGD_N2C             25
  
  define  CV_BGFG_FGD_LCC             64
  define  CV_BGFG_FGD_N1CC            25
  define  CV_BGFG_FGD_N2CC            40
  
  /* Background reference image update parameter: */
  define  CV_BGFG_FGD_ALPHA_1         0.1f
  
  /* stat model update parameter
   * 0.002f ~ 1K frame(~45sec), 0.005 ~ 18sec (if 25fps and absolutely static BG)
   */
  define  CV_BGFG_FGD_ALPHA_2         0.005f
  
  /* start value for alpha parameter (to fast initiate statistic model) */
  define  CV_BGFG_FGD_ALPHA_3         0.1f
  
  define  CV_BGFG_FGD_DELTA           2
  
  define  CV_BGFG_FGD_T               0.9f
  
  define  CV_BGFG_FGD_MINAREA         15.f
  
  define  CV_BGFG_FGD_BG_UPDATE_TRESH 0.5f
  
  /* See the above-referenced Li/Huang/Gu/Tian paper
   * for a full description of these background-model
   * tuning parameters.
   *
   * Nomenclature:  'c'  == "color", a three-component red/green/blue vector.
   *                         We use histograms of these to model the range of
   *                         colors we've seen at a given background pixel.
   *
   *                'cc' == "color co-occurrence", a six-component vector giving
   *                         RGB color for both this frame and preceding frame.
   *                             We use histograms of these to model the range of
   *                         color CHANGES we've seen at a given background pixel.
   */
  typedef struct CvFGDStatModelParams
  {
      int    Lc;                        /* Quantized levels per 'color' component. Power of two, typically 32, 64 or 128.				*/
      int    N1c;                        /* Number of color vectors used to model normal background color variation at a given pixel.			*/
      int    N2c;                        /* Number of color vectors retained at given pixel.  Must be > N1c, typically ~ 5/3 of N1c.			*/
                                  /* Used to allow the first N1c vectors to adapt over time to changing background.				*/
  
      int    Lcc;                        /* Quantized levels per 'color co-occurrence' component.  Power of two, typically 16, 32 or 64.			*/
      int    N1cc;                /* Number of color co-occurrence vectors used to model normal background color variation at a given pixel.	*/
      int    N2cc;                /* Number of color co-occurrence vectors retained at given pixel.  Must be > N1cc, typically ~ 5/3 of N1cc.	*/
                                  /* Used to allow the first N1cc vectors to adapt over time to changing background.				*/
  
      int    is_obj_without_holes;/* If TRUE we ignore holes within foreground blobs. Defaults to TRUE.						*/
      int    perform_morphing;        /* Number of erode-dilate-erode foreground-blob cleanup iterations.						*/
                                  /* These erase one-pixel junk blobs and merge almost-touching blobs. Default value is 1.			*/
  
      float  alpha1;                /* How quickly we forget old background pixel values seen.  Typically set to 0.1  				*/
      float  alpha2;                /* "Controls speed of feature learning". Depends on T. Typical value circa 0.005. 				*/
      float  alpha3;                /* Alternate to alpha2, used (e.g.) for quicker initial convergence. Typical value 0.1.				*/
  
      float  delta;                /* Affects color and color co-occurrence quantization, typically set to 2.					*/
      float  T;                        /* "A percentage value which determines when new features can be recognized as new background." (Typically 0.9).*/
      float  minArea;                /* Discard foreground blobs whose bounding box is smaller than this threshold.					*/
  }
  CvFGDStatModelParams;
  
  typedef struct CvBGPixelCStatTable
  {
      float          Pv, Pvb;
      uchar          v[3];
  }
  CvBGPixelCStatTable;
  
  typedef struct CvBGPixelCCStatTable
  {
      float          Pv, Pvb;
      uchar          v[6];
  }
  CvBGPixelCCStatTable;
  
  typedef struct CvBGPixelStat
  {
      float                 Pbc;
      float                 Pbcc;
      CvBGPixelCStatTable*  ctable;
      CvBGPixelCCStatTable* cctable;
      uchar                 is_trained_st_model;
      uchar                 is_trained_dyn_model;
  }
  CvBGPixelStat;
  
  typedef struct CvFGDStatModel
  {
      CV_BG_STAT_MODEL_FIELDS();
      CvBGPixelStat*         pixel_stat;
      IplImage*              Ftd;
      IplImage*              Fbd;
      IplImage*              prev_frame;
      CvFGDStatModelParams   params;
  }
  CvFGDStatModel;
  
  /* Creates FGD model */
  CVAPI(CvBGStatModel*) cvCreateFGDStatModel( IplImage* first_frame,
                      CvFGDStatModelParams* parameters CV_DEFAULT(NULL));
  
  /* 
     Interface of Gaussian mixture algorithm
  
     "An improved adaptive background mixture model for real-time tracking with shadow detection"
     P. KadewTraKuPong and R. Bowden,
     Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001."
     http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
  */
  
  /* Note:  "MOG" == "Mixture Of Gaussians": */
  
  define CV_BGFG_MOG_MAX_NGAUSSIANS 500
  
  /* default parameters of gaussian background detection algorithm */
  define CV_BGFG_MOG_BACKGROUND_THRESHOLD     0.7     /* threshold sum of weights for background test */
  define CV_BGFG_MOG_STD_THRESHOLD            2.5     /* lambda=2.5 is 99% */
  define CV_BGFG_MOG_WINDOW_SIZE              200     /* Learning rate; alpha = 1/CV_GBG_WINDOW_SIZE */
  define CV_BGFG_MOG_NGAUSSIANS               5       /* = K = number of Gaussians in mixture */
  define CV_BGFG_MOG_WEIGHT_INIT              0.05
  define CV_BGFG_MOG_SIGMA_INIT               30
  define CV_BGFG_MOG_MINAREA                  15.f
  
  define CV_BGFG_MOG_NCOLORS                  3
  
  typedef struct CvGaussBGStatModelParams
  {    
      int     win_size;               /* = 1/alpha */
      int     n_gauss;
      double  bg_threshold, std_threshold, minArea;
      double  weight_init, variance_init;
  }CvGaussBGStatModelParams;
  
  typedef struct CvGaussBGValues
  {
      int         match_sum;
      double      weight;
      double      variance[CV_BGFG_MOG_NCOLORS];
      double      mean[CV_BGFG_MOG_NCOLORS];
  }
  CvGaussBGValues;
  
  typedef struct CvGaussBGPoint
  {
      CvGaussBGValues* g_values;
  }
  CvGaussBGPoint;
  
  typedef struct CvGaussBGModel
  {
      CV_BG_STAT_MODEL_FIELDS();
      CvGaussBGStatModelParams   params;    
      CvGaussBGPoint*            g_point;    
      int                        countFrames;
  }
  CvGaussBGModel;
  
  /* Creates Gaussian mixture background model */
  CVAPI(CvBGStatModel*) cvCreateGaussianBGModel( IplImage* first_frame,
                  CvGaussBGStatModelParams* parameters CV_DEFAULT(NULL));
  
  typedef struct CvBGCodeBookElem
  {
      struct CvBGCodeBookElem* next;
      int tLastUpdate;
      int stale;
      uchar boxMin[3];
      uchar boxMax[3];
      uchar learnMin[3];
      uchar learnMax[3];
  }
  CvBGCodeBookElem;
  
  typedef struct CvBGCodeBookModel
  {
      CvSize size;
      int t;
      uchar cbBounds[3];
      uchar modMin[3];
      uchar modMax[3];
      CvBGCodeBookElem** cbmap;
      CvMemStorage* storage;
      CvBGCodeBookElem* freeList;
  }
  CvBGCodeBookModel;
  
  CVAPI(CvBGCodeBookModel*) cvCreateBGCodeBookModel();
  CVAPI(void) cvReleaseBGCodeBookModel( CvBGCodeBookModel** model );
  
  CVAPI(void) cvBGCodeBookUpdate( CvBGCodeBookModel* model, const CvArr* image,
                                  CvRect roi CV_DEFAULT(cvRect(0,0,0,0)),
                                  const CvArr* mask CV_DEFAULT(0) );
  
  CVAPI(int) cvBGCodeBookDiff( const CvBGCodeBookModel* model, const CvArr* image,
                               CvArr* fgmask, CvRect roi CV_DEFAULT(cvRect(0,0,0,0)) );
  
  CVAPI(void) cvBGCodeBookClearStale( CvBGCodeBookModel* model, int staleThresh,
                                      CvRect roi CV_DEFAULT(cvRect(0,0,0,0)),
                                      const CvArr* mask CV_DEFAULT(0) );
  
  CVAPI(CvSeq*) cvSegmentFGMask( CvArr *fgmask, int poly1Hull0 CV_DEFAULT(1),
                                 float perimScale CV_DEFAULT(4.f),
                                 CvMemStorage* storage CV_DEFAULT(0),
                                 CvPoint offset CV_DEFAULT(cvPoint(0,0)));
  
  ifdef __cplusplus
  }
  endif
  
  ifdef __cplusplus
  
  
**************************************************************************************\ Calibration engine * \***************************************************************************************

  
  
  typedef enum CvCalibEtalonType
  {
      CV_CALIB_ETALON_USER = -1,
      CV_CALIB_ETALON_CHESSBOARD = 0,
      CV_CALIB_ETALON_CHECKERBOARD = CV_CALIB_ETALON_CHESSBOARD
  }
  CvCalibEtalonType;
  
  class CV_EXPORTS CvCalibFilter
  {
  public:
      /* Constructor & destructor */
      CvCalibFilter();
      virtual ~CvCalibFilter();
  
      /* Sets etalon type - one for all cameras.
         etalonParams is used in case of pre-defined etalons (such as chessboard).
         Number of elements in etalonParams is determined by etalonType.
         E.g., if etalon type is CV_ETALON_TYPE_CHESSBOARD then:
           etalonParams[0] is number of squares per one side of etalon
           etalonParams[1] is number of squares per another side of etalon
           etalonParams[2] is linear size of squares in the board in arbitrary units.
         pointCount & points are used in case of
         CV_CALIB_ETALON_USER (user-defined) etalon. */
      virtual bool
          SetEtalon( CvCalibEtalonType etalonType, double* etalonParams,
                     int pointCount = 0, CvPoint2D32f* points = 0 );
  
      /* Retrieves etalon parameters/or and points */
      virtual CvCalibEtalonType
          GetEtalon( int* paramCount = 0, const double** etalonParams = 0,
                     int* pointCount = 0, const CvPoint2D32f** etalonPoints = 0 ) const;
  
      /* Sets number of cameras calibrated simultaneously. It is equal to 1 initially */
      virtual void SetCameraCount( int cameraCount );
  
      /* Retrieves number of cameras */
      int GetCameraCount() const { return cameraCount; }
  
      /* Starts cameras calibration */
      virtual bool SetFrames( int totalFrames );
      
      /* Stops cameras calibration */
      virtual void Stop( bool calibrate = false );
  
      /* Retrieves number of cameras */
      bool IsCalibrated() const { return isCalibrated; }
  
      /* Feeds another serie of snapshots (one per each camera) to filter.
         Etalon points on these images are found automatically.
         If the function can't locate points, it returns false */
      virtual bool FindEtalon( IplImage** imgs );
  
      /* The same but takes matrices */
      virtual bool FindEtalon( CvMat** imgs );
  
      /* Lower-level function for feeding filter with already found etalon points.
         Array of point arrays for each camera is passed. */
      virtual bool Push( const CvPoint2D32f** points = 0 );
  
      /* Returns total number of accepted frames and, optionally,
         total number of frames to collect */
      virtual int GetFrameCount( int* framesTotal = 0 ) const;
  
      /* Retrieves camera parameters for specified camera.
         If camera is not calibrated the function returns 0 */
      virtual const CvCamera* GetCameraParams( int idx = 0 ) const;
  
      virtual const CvStereoCamera* GetStereoParams() const;
  
      /* Sets camera parameters for all cameras */
      virtual bool SetCameraParams( CvCamera* params );
  
      /* Saves all camera parameters to file */
      virtual bool SaveCameraParams( const char* filename );
      
      /* Loads all camera parameters from file */
      virtual bool LoadCameraParams( const char* filename );
  
      /* Undistorts images using camera parameters. Some of src pointers can be NULL. */
      virtual bool Undistort( IplImage** src, IplImage** dst );
  
      /* Undistorts images using camera parameters. Some of src pointers can be NULL. */
      virtual bool Undistort( CvMat** src, CvMat** dst );
  
      /* Returns array of etalon points detected/partally detected
         on the latest frame for idx-th camera */
      virtual bool GetLatestPoints( int idx, CvPoint2D32f** pts,
                                                    int* count, bool* found );
  
      /* Draw the latest detected/partially detected etalon */
      virtual void DrawPoints( IplImage** dst );
  
      /* Draw the latest detected/partially detected etalon */
      virtual void DrawPoints( CvMat** dst );
  
      virtual bool Rectify( IplImage** srcarr, IplImage** dstarr );
      virtual bool Rectify( CvMat** srcarr, CvMat** dstarr );
  
  protected:
  
      enum { MAX_CAMERAS = 3 };
  
      /* etalon data */
      CvCalibEtalonType  etalonType;
      int     etalonParamCount;
      double* etalonParams;
      int     etalonPointCount;
      CvPoint2D32f* etalonPoints;
      CvSize  imgSize;
      CvMat*  grayImg;
      CvMat*  tempImg;
      CvMemStorage* storage;
  
      /* camera data */
      int     cameraCount;
      CvCamera cameraParams[MAX_CAMERAS];
      CvStereoCamera stereo;
      CvPoint2D32f* points[MAX_CAMERAS];
      CvMat*  undistMap[MAX_CAMERAS][2];
      CvMat*  undistImg;
      int     latestCounts[MAX_CAMERAS];
      CvPoint2D32f* latestPoints[MAX_CAMERAS];
      CvMat*  rectMap[MAX_CAMERAS][2];
  
      /* Added by Valery */
      //CvStereoCamera stereoParams;
  
      int     maxPoints;
      int     framesTotal;
      int     framesAccepted;
      bool    isCalibrated;
  };
  
  include <cvaux.hpp>
  include <cvvidsurv.hpp>
  /*#include <cvmat.hpp>*/
  endif
  
  endif
  
  /* End of file. */
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.