Update to 2.0.0 tree from current Fremantle build
[opencv] / include / opencv / cvaux.h
diff --git a/include/opencv/cvaux.h b/include/opencv/cvaux.h
new file mode 100644 (file)
index 0000000..6495511
--- /dev/null
@@ -0,0 +1,1573 @@
+/*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"
+#endif
+
+#endif
+
+/* End of file. */