Home | History | Annotate | Download | only in src
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                        Intel License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
     14 // Third party copyrights are property of their respective owners.
     15 //
     16 // Redistribution and use in source and binary forms, with or without modification,
     17 // are permitted provided that the following conditions are met:
     18 //
     19 //   * Redistribution's of source code must retain the above copyright notice,
     20 //     this list of conditions and the following disclaimer.
     21 //
     22 //   * Redistribution's in binary form must reproduce the above copyright notice,
     23 //     this list of conditions and the following disclaimer in the documentation
     24 //     and/or other materials provided with the distribution.
     25 //
     26 //   * The name of Intel Corporation may not be used to endorse or promote products
     27 //     derived from this software without specific prior written permission.
     28 //
     29 // This software is provided by the copyright holders and contributors "as is" and
     30 // any express or implied warranties, including, but not limited to, the implied
     31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     32 // In no event shall the Intel Corporation or contributors be liable for any direct,
     33 // indirect, incidental, special, exemplary, or consequential damages
     34 // (including, but not limited to, procurement of substitute goods or services;
     35 // loss of use, data, or profits; or business interruption) however caused
     36 // and on any theory of liability, whether in contract, strict liability,
     37 // or tort (including negligence or otherwise) arising in any way out of
     38 // the use of this software, even if advised of the possibility of such damage.
     39 //
     40 //M*/
     41 #include "_cv.h"
     42 
     43 /*F///////////////////////////////////////////////////////////////////////////////////////
     44 //    Name:    cvCreateConDensation
     45 //    Purpose: Creating CvConDensation structure and allocating memory for it
     46 //    Context:
     47 //    Parameters:
     48 //      Kalman     - double pointer to CvConDensation structure
     49 //      DP         - dimension of the dynamical vector
     50 //      MP         - dimension of the measurement vector
     51 //      SamplesNum - number of samples in sample set used in algorithm
     52 //    Returns:
     53 //    Notes:
     54 //
     55 //F*/
     56 
     57 CV_IMPL CvConDensation* cvCreateConDensation( int DP, int MP, int SamplesNum )
     58 {
     59     int i;
     60     CvConDensation *CD = 0;
     61 
     62     CV_FUNCNAME( "cvCreateConDensation" );
     63     __BEGIN__;
     64 
     65     if( DP < 0 || MP < 0 || SamplesNum < 0 )
     66         CV_ERROR( CV_StsOutOfRange, "" );
     67 
     68     /* allocating memory for the structure */
     69     CV_CALL( CD = (CvConDensation *) cvAlloc( sizeof( CvConDensation )));
     70     /* setting structure params */
     71     CD->SamplesNum = SamplesNum;
     72     CD->DP = DP;
     73     CD->MP = MP;
     74     /* allocating memory for structure fields */
     75     CV_CALL( CD->flSamples = (float **) cvAlloc( sizeof( float * ) * SamplesNum ));
     76     CV_CALL( CD->flNewSamples = (float **) cvAlloc( sizeof( float * ) * SamplesNum ));
     77     CV_CALL( CD->flSamples[0] = (float *) cvAlloc( sizeof( float ) * SamplesNum * DP ));
     78     CV_CALL( CD->flNewSamples[0] = (float *) cvAlloc( sizeof( float ) * SamplesNum * DP ));
     79 
     80     /* setting pointers in pointer's arrays */
     81     for( i = 1; i < SamplesNum; i++ )
     82     {
     83         CD->flSamples[i] = CD->flSamples[i - 1] + DP;
     84         CD->flNewSamples[i] = CD->flNewSamples[i - 1] + DP;
     85     }
     86 
     87     CV_CALL( CD->State = (float *) cvAlloc( sizeof( float ) * DP ));
     88     CV_CALL( CD->DynamMatr = (float *) cvAlloc( sizeof( float ) * DP * DP ));
     89     CV_CALL( CD->flConfidence = (float *) cvAlloc( sizeof( float ) * SamplesNum ));
     90     CV_CALL( CD->flCumulative = (float *) cvAlloc( sizeof( float ) * SamplesNum ));
     91 
     92     CV_CALL( CD->RandS = (CvRandState *) cvAlloc( sizeof( CvRandState ) * DP ));
     93     CV_CALL( CD->Temp = (float *) cvAlloc( sizeof( float ) * DP ));
     94     CV_CALL( CD->RandomSample = (float *) cvAlloc( sizeof( float ) * DP ));
     95 
     96     /* Returning created structure */
     97     __END__;
     98 
     99     return CD;
    100 }
    101 
    102 /*F///////////////////////////////////////////////////////////////////////////////////////
    103 //    Name:    cvReleaseConDensation
    104 //    Purpose: Releases CvConDensation structure and frees memory allocated for it
    105 //    Context:
    106 //    Parameters:
    107 //      Kalman     - double pointer to CvConDensation structure
    108 //      DP         - dimension of the dynamical vector
    109 //      MP         - dimension of the measurement vector
    110 //      SamplesNum - number of samples in sample set used in algorithm
    111 //    Returns:
    112 //    Notes:
    113 //
    114 //F*/
    115 CV_IMPL void
    116 cvReleaseConDensation( CvConDensation ** ConDensation )
    117 {
    118     CV_FUNCNAME( "cvReleaseConDensation" );
    119     __BEGIN__;
    120 
    121     CvConDensation *CD = *ConDensation;
    122 
    123     if( !ConDensation )
    124         CV_ERROR( CV_StsNullPtr, "" );
    125 
    126     if( !CD )
    127         EXIT;
    128 
    129     /* freeing the memory */
    130 	cvFree( &CD->State );
    131     cvFree( &CD->DynamMatr);
    132     cvFree( &CD->flConfidence );
    133     cvFree( &CD->flCumulative );
    134     cvFree( &CD->flSamples[0] );
    135     cvFree( &CD->flNewSamples[0] );
    136     cvFree( &CD->flSamples );
    137     cvFree( &CD->flNewSamples );
    138     cvFree( &CD->Temp );
    139     cvFree( &CD->RandS );
    140     cvFree( &CD->RandomSample );
    141     /* release structure */
    142     cvFree( ConDensation );
    143 
    144     __END__;
    145 
    146 }
    147 
    148 /*F///////////////////////////////////////////////////////////////////////////////////////
    149 //    Name:    cvConDensUpdateByTime
    150 //    Purpose: Performing Time Update routine for ConDensation algorithm
    151 //    Context:
    152 //    Parameters:
    153 //      Kalman     - pointer to CvConDensation structure
    154 //    Returns:
    155 //    Notes:
    156 //
    157 //F*/
    158 CV_IMPL void
    159 cvConDensUpdateByTime( CvConDensation * ConDens )
    160 {
    161     int i, j;
    162     float Sum = 0;
    163 
    164     CV_FUNCNAME( "cvConDensUpdateByTime" );
    165     __BEGIN__;
    166 
    167     if( !ConDens )
    168         CV_ERROR( CV_StsNullPtr, "" );
    169 
    170     /* Sets Temp to Zero */
    171     icvSetZero_32f( ConDens->Temp, ConDens->DP, 1 );
    172 
    173     /* Calculating the Mean */
    174     for( i = 0; i < ConDens->SamplesNum; i++ )
    175     {
    176         icvScaleVector_32f( ConDens->flSamples[i], ConDens->State, ConDens->DP,
    177                              ConDens->flConfidence[i] );
    178         icvAddVector_32f( ConDens->Temp, ConDens->State, ConDens->Temp, ConDens->DP );
    179         Sum += ConDens->flConfidence[i];
    180         ConDens->flCumulative[i] = Sum;
    181     }
    182 
    183     /* Taking the new vector from transformation of mean by dynamics matrix */
    184 
    185     icvScaleVector_32f( ConDens->Temp, ConDens->Temp, ConDens->DP, 1.f / Sum );
    186     icvTransformVector_32f( ConDens->DynamMatr, ConDens->Temp, ConDens->State, ConDens->DP,
    187                              ConDens->DP );
    188     Sum = Sum / ConDens->SamplesNum;
    189 
    190     /* Updating the set of random samples */
    191     for( i = 0; i < ConDens->SamplesNum; i++ )
    192     {
    193         j = 0;
    194         while( (ConDens->flCumulative[j] <= (float) i * Sum)&&(j<ConDens->SamplesNum-1))
    195         {
    196             j++;
    197         }
    198         icvCopyVector_32f( ConDens->flSamples[j], ConDens->DP, ConDens->flNewSamples[i] );
    199     }
    200 
    201     /* Adding the random-generated vector to every vector in sample set */
    202     for( i = 0; i < ConDens->SamplesNum; i++ )
    203     {
    204         for( j = 0; j < ConDens->DP; j++ )
    205         {
    206             cvbRand( ConDens->RandS + j, ConDens->RandomSample + j, 1 );
    207         }
    208 
    209         icvTransformVector_32f( ConDens->DynamMatr, ConDens->flNewSamples[i],
    210                                  ConDens->flSamples[i], ConDens->DP, ConDens->DP );
    211         icvAddVector_32f( ConDens->flSamples[i], ConDens->RandomSample, ConDens->flSamples[i],
    212                            ConDens->DP );
    213     }
    214 
    215     __END__;
    216 }
    217 
    218 /*F///////////////////////////////////////////////////////////////////////////////////////
    219 //    Name:    cvConDensInitSamplSet
    220 //    Purpose: Performing Time Update routine for ConDensation algorithm
    221 //    Context:
    222 //    Parameters:
    223 //    conDens     - pointer to CvConDensation structure
    224 //    lowerBound  - vector of lower bounds used to random update of sample set
    225 //    lowerBound  - vector of upper bounds used to random update of sample set
    226 //    Returns:
    227 //    Notes:
    228 //
    229 //F*/
    230 
    231 CV_IMPL void
    232 cvConDensInitSampleSet( CvConDensation * conDens, CvMat * lowerBound, CvMat * upperBound )
    233 {
    234     int i, j;
    235     float *LBound;
    236     float *UBound;
    237     float Prob = 1.f / conDens->SamplesNum;
    238 
    239     CV_FUNCNAME( "cvConDensInitSampleSet" );
    240     __BEGIN__;
    241 
    242     if( !conDens || !lowerBound || !upperBound )
    243         CV_ERROR( CV_StsNullPtr, "" );
    244 
    245     if( CV_MAT_TYPE(lowerBound->type) != CV_32FC1 ||
    246         !CV_ARE_TYPES_EQ(lowerBound,upperBound) )
    247         CV_ERROR( CV_StsBadArg, "source  has not appropriate format" );
    248 
    249     if( (lowerBound->cols != 1) || (upperBound->cols != 1) )
    250         CV_ERROR( CV_StsBadArg, "source  has not appropriate size" );
    251 
    252     if( (lowerBound->rows != conDens->DP) || (upperBound->rows != conDens->DP) )
    253         CV_ERROR( CV_StsBadArg, "source  has not appropriate size" );
    254 
    255     LBound = lowerBound->data.fl;
    256     UBound = upperBound->data.fl;
    257     /* Initializing the structures to create initial Sample set */
    258     for( i = 0; i < conDens->DP; i++ )
    259     {
    260         cvRandInit( &(conDens->RandS[i]),
    261                     LBound[i],
    262                     UBound[i],
    263                     i );
    264     }
    265     /* Generating the samples */
    266     for( j = 0; j < conDens->SamplesNum; j++ )
    267     {
    268         for( i = 0; i < conDens->DP; i++ )
    269         {
    270             cvbRand( conDens->RandS + i, conDens->flSamples[j] + i, 1 );
    271         }
    272         conDens->flConfidence[j] = Prob;
    273     }
    274     /* Reinitializes the structures to update samples randomly */
    275     for( i = 0; i < conDens->DP; i++ )
    276     {
    277         cvRandInit( &(conDens->RandS[i]),
    278                     (LBound[i] - UBound[i]) / 5,
    279                     (UBound[i] - LBound[i]) / 5,
    280                     i);
    281     }
    282 
    283     __END__;
    284 }
    285