--- /dev/null
+/*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*/
+#include "_cv.h"
+
+/*F///////////////////////////////////////////////////////////////////////////////////////
+// Name: cvCreateConDensation
+// Purpose: Creating CvConDensation structure and allocating memory for it
+// Context:
+// Parameters:
+// Kalman - double pointer to CvConDensation structure
+// DP - dimension of the dynamical vector
+// MP - dimension of the measurement vector
+// SamplesNum - number of samples in sample set used in algorithm
+// Returns:
+// Notes:
+//
+//F*/
+
+CV_IMPL CvConDensation* cvCreateConDensation( int DP, int MP, int SamplesNum )
+{
+ int i;
+ CvConDensation *CD = 0;
+
+ CV_FUNCNAME( "cvCreateConDensation" );
+ __BEGIN__;
+
+ if( DP < 0 || MP < 0 || SamplesNum < 0 )
+ CV_ERROR( CV_StsOutOfRange, "" );
+
+ /* allocating memory for the structure */
+ CV_CALL( CD = (CvConDensation *) cvAlloc( sizeof( CvConDensation )));
+ /* setting structure params */
+ CD->SamplesNum = SamplesNum;
+ CD->DP = DP;
+ CD->MP = MP;
+ /* allocating memory for structure fields */
+ CV_CALL( CD->flSamples = (float **) cvAlloc( sizeof( float * ) * SamplesNum ));
+ CV_CALL( CD->flNewSamples = (float **) cvAlloc( sizeof( float * ) * SamplesNum ));
+ CV_CALL( CD->flSamples[0] = (float *) cvAlloc( sizeof( float ) * SamplesNum * DP ));
+ CV_CALL( CD->flNewSamples[0] = (float *) cvAlloc( sizeof( float ) * SamplesNum * DP ));
+
+ /* setting pointers in pointer's arrays */
+ for( i = 1; i < SamplesNum; i++ )
+ {
+ CD->flSamples[i] = CD->flSamples[i - 1] + DP;
+ CD->flNewSamples[i] = CD->flNewSamples[i - 1] + DP;
+ }
+
+ CV_CALL( CD->State = (float *) cvAlloc( sizeof( float ) * DP ));
+ CV_CALL( CD->DynamMatr = (float *) cvAlloc( sizeof( float ) * DP * DP ));
+ CV_CALL( CD->flConfidence = (float *) cvAlloc( sizeof( float ) * SamplesNum ));
+ CV_CALL( CD->flCumulative = (float *) cvAlloc( sizeof( float ) * SamplesNum ));
+
+ CV_CALL( CD->RandS = (CvRandState *) cvAlloc( sizeof( CvRandState ) * DP ));
+ CV_CALL( CD->Temp = (float *) cvAlloc( sizeof( float ) * DP ));
+ CV_CALL( CD->RandomSample = (float *) cvAlloc( sizeof( float ) * DP ));
+
+ /* Returning created structure */
+ __END__;
+
+ return CD;
+}
+
+/*F///////////////////////////////////////////////////////////////////////////////////////
+// Name: cvReleaseConDensation
+// Purpose: Releases CvConDensation structure and frees memory allocated for it
+// Context:
+// Parameters:
+// Kalman - double pointer to CvConDensation structure
+// DP - dimension of the dynamical vector
+// MP - dimension of the measurement vector
+// SamplesNum - number of samples in sample set used in algorithm
+// Returns:
+// Notes:
+//
+//F*/
+CV_IMPL void
+cvReleaseConDensation( CvConDensation ** ConDensation )
+{
+ CV_FUNCNAME( "cvReleaseConDensation" );
+ __BEGIN__;
+
+ CvConDensation *CD = *ConDensation;
+
+ if( !ConDensation )
+ CV_ERROR( CV_StsNullPtr, "" );
+
+ if( !CD )
+ EXIT;
+
+ /* freeing the memory */
+ cvFree( &CD->State );
+ cvFree( &CD->DynamMatr);
+ cvFree( &CD->flConfidence );
+ cvFree( &CD->flCumulative );
+ cvFree( &CD->flSamples[0] );
+ cvFree( &CD->flNewSamples[0] );
+ cvFree( &CD->flSamples );
+ cvFree( &CD->flNewSamples );
+ cvFree( &CD->Temp );
+ cvFree( &CD->RandS );
+ cvFree( &CD->RandomSample );
+ /* release structure */
+ cvFree( ConDensation );
+
+ __END__;
+
+}
+
+/*F///////////////////////////////////////////////////////////////////////////////////////
+// Name: cvConDensUpdateByTime
+// Purpose: Performing Time Update routine for ConDensation algorithm
+// Context:
+// Parameters:
+// Kalman - pointer to CvConDensation structure
+// Returns:
+// Notes:
+//
+//F*/
+CV_IMPL void
+cvConDensUpdateByTime( CvConDensation * ConDens )
+{
+ int i, j;
+ float Sum = 0;
+
+ CV_FUNCNAME( "cvConDensUpdateByTime" );
+ __BEGIN__;
+
+ if( !ConDens )
+ CV_ERROR( CV_StsNullPtr, "" );
+
+ /* Sets Temp to Zero */
+ icvSetZero_32f( ConDens->Temp, ConDens->DP, 1 );
+
+ /* Calculating the Mean */
+ for( i = 0; i < ConDens->SamplesNum; i++ )
+ {
+ icvScaleVector_32f( ConDens->flSamples[i], ConDens->State, ConDens->DP,
+ ConDens->flConfidence[i] );
+ icvAddVector_32f( ConDens->Temp, ConDens->State, ConDens->Temp, ConDens->DP );
+ Sum += ConDens->flConfidence[i];
+ ConDens->flCumulative[i] = Sum;
+ }
+
+ /* Taking the new vector from transformation of mean by dynamics matrix */
+
+ icvScaleVector_32f( ConDens->Temp, ConDens->Temp, ConDens->DP, 1.f / Sum );
+ icvTransformVector_32f( ConDens->DynamMatr, ConDens->Temp, ConDens->State, ConDens->DP,
+ ConDens->DP );
+ Sum = Sum / ConDens->SamplesNum;
+
+ /* Updating the set of random samples */
+ for( i = 0; i < ConDens->SamplesNum; i++ )
+ {
+ j = 0;
+ while( (ConDens->flCumulative[j] <= (float) i * Sum)&&(j<ConDens->SamplesNum-1))
+ {
+ j++;
+ }
+ icvCopyVector_32f( ConDens->flSamples[j], ConDens->DP, ConDens->flNewSamples[i] );
+ }
+
+ /* Adding the random-generated vector to every vector in sample set */
+ for( i = 0; i < ConDens->SamplesNum; i++ )
+ {
+ for( j = 0; j < ConDens->DP; j++ )
+ {
+ cvbRand( ConDens->RandS + j, ConDens->RandomSample + j, 1 );
+ }
+
+ icvTransformVector_32f( ConDens->DynamMatr, ConDens->flNewSamples[i],
+ ConDens->flSamples[i], ConDens->DP, ConDens->DP );
+ icvAddVector_32f( ConDens->flSamples[i], ConDens->RandomSample, ConDens->flSamples[i],
+ ConDens->DP );
+ }
+
+ __END__;
+}
+
+/*F///////////////////////////////////////////////////////////////////////////////////////
+// Name: cvConDensInitSamplSet
+// Purpose: Performing Time Update routine for ConDensation algorithm
+// Context:
+// Parameters:
+// conDens - pointer to CvConDensation structure
+// lowerBound - vector of lower bounds used to random update of sample set
+// lowerBound - vector of upper bounds used to random update of sample set
+// Returns:
+// Notes:
+//
+//F*/
+
+CV_IMPL void
+cvConDensInitSampleSet( CvConDensation * conDens, CvMat * lowerBound, CvMat * upperBound )
+{
+ int i, j;
+ float *LBound;
+ float *UBound;
+ float Prob = 1.f / conDens->SamplesNum;
+
+ CV_FUNCNAME( "cvConDensInitSampleSet" );
+ __BEGIN__;
+
+ if( !conDens || !lowerBound || !upperBound )
+ CV_ERROR( CV_StsNullPtr, "" );
+
+ if( CV_MAT_TYPE(lowerBound->type) != CV_32FC1 ||
+ !CV_ARE_TYPES_EQ(lowerBound,upperBound) )
+ CV_ERROR( CV_StsBadArg, "source has not appropriate format" );
+
+ if( (lowerBound->cols != 1) || (upperBound->cols != 1) )
+ CV_ERROR( CV_StsBadArg, "source has not appropriate size" );
+
+ if( (lowerBound->rows != conDens->DP) || (upperBound->rows != conDens->DP) )
+ CV_ERROR( CV_StsBadArg, "source has not appropriate size" );
+
+ LBound = lowerBound->data.fl;
+ UBound = upperBound->data.fl;
+ /* Initializing the structures to create initial Sample set */
+ for( i = 0; i < conDens->DP; i++ )
+ {
+ cvRandInit( &(conDens->RandS[i]),
+ LBound[i],
+ UBound[i],
+ i );
+ }
+ /* Generating the samples */
+ for( j = 0; j < conDens->SamplesNum; j++ )
+ {
+ for( i = 0; i < conDens->DP; i++ )
+ {
+ cvbRand( conDens->RandS + i, conDens->flSamples[j] + i, 1 );
+ }
+ conDens->flConfidence[j] = Prob;
+ }
+ /* Reinitializes the structures to update samples randomly */
+ for( i = 0; i < conDens->DP; i++ )
+ {
+ cvRandInit( &(conDens->RandS[i]),
+ (LBound[i] - UBound[i]) / 5,
+ (UBound[i] - LBound[i]) / 5,
+ i);
+ }
+
+ __END__;
+}