The functions described in this section do PCA analysis and compression for a set of 8-bit images that may not fit into memory all together. If your data fits into memory and the vectors are not 8-bit (or you want a simpler interface), use cvCalcCovarMatrix, cvSVD and cvGEMM to do PCA
Calculates covariance matrix for group of input objects
void cvCalcCovarMatrixEx( int nObjects, void* input, int ioFlags, int ioBufSize, uchar* buffer, void* userData, IplImage* avg, float* covarMatrix );
The function cvCalcCovarMatrixEx calculates a covariance matrix of the input objects group using previously calculated averaged object. Depending on ioFlags parameter it may be used either in direct access or callback mode. If ioFlags is not CV_EIGOBJ_NO_CALLBACK, buffer must be allocated before calling the function.
Calculates orthonormal eigen basis and averaged object for group of input objects
void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals );
The function cvCalcEigenObjects calculates orthonormal eigen basis and the averaged object for a group of the input objects. Depending on ioFlags parameter it may be used either in direct access or callback mode. Depending on the parameter calcLimit, calculations are finished either after first calcLimit.maxIters dominating eigen objects are retrieved or if the ratio of the current eigenvalue to the largest eigenvalue comes down to calcLimit.epsilon threshold. The value calcLimit -> type must be CV_TERMCRIT_NUMB, CV_TERMCRIT_EPS, or CV_TERMCRIT_NUMB | CV_TERMCRIT_EPS . The function returns the real values calcLimit -> maxIter and calcLimit -> epsilon .
The function also calculates the averaged object, which must be created previously. Calculated eigen objects are arranged according to the corresponding eigenvalues in the descending order.
The parameter eigVals may be equal to NULL, if eigenvalues are not needed.The function cvCalcEigenObjects uses the function cvCalcCovarMatrixEx.
Calculates decomposition coefficient of input object
double cvCalcDecompCoeff( IplImage* obj, IplImage* eigObj, IplImage* avg );
The function cvCalcDecompCoeff calculates one decomposition coefficient of the input object using the previously calculated eigen object and the averaged object.
Calculates all decomposition coefficients for input object
void cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs );
The function cvEigenDecomposite calculates all decomposition coefficients for the input object using the previously calculated eigen objects basis and the averaged object. Depending on ioFlags parameter it may be used either in direct access or callback mode.
Calculates object projection to the eigen sub-space
void cvEigenProjection( int nEigObjs, void* eigInput, int ioFlags, void* userData, float* coeffs, IplImage* avg, IplImage* proj );
The function cvEigenProjection calculates an object projection to the eigen sub-space or, in other words, restores an object using previously calculated eigen objects basis, averaged object, and decomposition coefficients of the restored object. Depending on ioFlags parameter it may be used either in direct access or callback mode.
The functions of the eigen objects group have been developed to be used for any number of objects, even if their total size exceeds free RAM size. So the functions may be used in two main modes.
Direct access mode is the best choice if the size of free RAM is sufficient for all input and eigen objects allocation. This mode is set if the parameter ioFlags is equal to CV_EIGOBJ_NO_CALLBACK . In this case input and output parameters are pointers to arrays of input/output objects of IplImage* type. The parameters ioBufSize and userData are not used.In order to support embedded models the user must define structures to represent 1D HMM and 2D embedded HMM model.
Embedded HMM Structure
typedef struct _CvEHMM { int level; int num_states; float* transP; float** obsProb; union { CvEHMMState* state; struct _CvEHMM* ehmm; } u; } CvEHMM;
For representation of observations the following structure is defined:
Image Observation Structure
typedef struct CvImgObsInfo { int obs_x; int obs_y; int obs_size; float** obs; int* state; int* mix; } CvImgObsInfo;
Creates 2D embedded HMM
CvEHMM* cvCreate2DHMM( int* stateNumber, int* numMix, int obsSize );
The function cvCreate2DHMM returns the created structure of the type CvEHMM with specified parameters.
Releases 2D embedded HMM
void cvRelease2DHMM(CvEHMM** hmm );
The function cvRelease2DHMM frees all the memory used by HMM and clears the pointer to HMM.
Creates structure to store image observation vectors
CvImgObsInfo* cvCreateObsInfo( CvSize numObs, int obsSize );
The function cvCreateObsInfo creates new structures to store image observation vectors. For definitions of the parameters roi, dctSize, and delta see the specification of the function cvImgToObs_DCT.
Releases observation vectors structure
void cvReleaseObsInfo( CvImgObsInfo** obsInfo );
The function cvReleaseObsInfo frees all memory used by observations and clears pointer to the structure CvImgObsInfo .
Extracts observation vectors from image
void cvImgToObs_DCT( IplImage* image, float* obs, CvSize dctSize, CvSize obsSize, CvSize delta );
The function cvImgToObs_DCT extracts observation vectors, that is, DCT coefficients, from the image. The user must pass obsInfo.obs as the parameter obs to use this function with other HMM functions and use the structure obsInfo of the CvImgObsInfo type.
Calculating Observations for HMM
CvImgObsInfo* obs_info; ... cvImgToObs_DCT( image,obs_info->obs, //!!! dctSize, obsSize, delta );
Performs uniform segmentation of image observations by HMM states
void cvUniformImgSegm( CvImgObsInfo* obsInfo, CvEHMM* hmm );
The function cvUniformImgSegm segments image observations by HMM states uniformly (see Initial Segmentation for 2D Embedded HMM for 2D embedded HMM with 5 superstates and 3, 6, 6, 6, 3 internal states of every corresponding superstate).
Initial Segmentation for 2D Embedded HMM
Segments all observations within every internal state of HMM by state mixture components
void cvInitMixSegm( CvImgObsInfo** obsInfoArray, int numImg, CvEHMM* hmm );
The function cvInitMixSegm takes a group of observations from several training images already segmented by states and splits a set of observation vectors within every internal HMM state into as many clusters as the number of mixture components in the state.
Estimates all parameters of every HMM state
void cvEstimateHMMStateParams( CvImgObsInfo** obsInfoArray, int numImg, CvEHMM* hmm );
The function cvEstimateHMMStateParams computes all inner parameters of every HMM state, including Gaussian means, variances, etc.
Computes transition probability matrices for embedded HMM
void cvEstimateTransProb( CvImgObsInfo** obsInfoArray, int numImg, CvEHMM* hmm );
The function cvEstimateTransProb uses current segmentation of image observations to compute transition probability matrices for all embedded and external HMMs.
Computes probability of every observation of several images
void cvEstimateObsProb( CvImgObsInfo* obsInfo, CvEHMM* hmm );
The function cvEstimateObsProb computes Gaussian probabilities of each observation to occur in each of the internal HMM states.
Executes Viterbi algorithm for embedded HMM
float cvEViterbi( CvImgObsInfo* obsInfo, CvEHMM* hmm );
The function cvEViterbi executes Viterbi algorithm for embedded HMM. Viterbi algorithm evaluates the likelihood of the best match between the given image observations and the given HMM and performs segmentation of image observations by HMM states. The segmentation is done on the basis of the match found.
Segments observations from all training images by mixture components of newly assigned states
void cvMixSegmL2( CvImgObsInfo** obsInfoArray, int numImg, CvEHMM* hmm );
The function cvMixSegmL2 segments observations from all training images by mixture components of newly Viterbi algorithm-assigned states. The function uses Euclidean distance to group vectors around the existing mixtures centers.