2

次の API 関数は、OpenCV ライブラリの PCA のソース コードです。

static CvStatus CV_STDCALL icvCalcEigenObjects_8u32fR( int nObjects, void* input, int objStep,
                        void* output, int eigStep, CvSize size,
                        int  ioFlags, int ioBufSize, void* userData,
                        CvTermCriteria* calcLimit, float* avg,
                        int    avgStep, float  *eigVals )

この関数は Eigenobjects.cpp からのものです

そして、私は次のコードを理解していません:

    for( i = 0; i < m1; i++ )       /* e.o. annulation */
    {
        float *be = ((float **) output)[i];

        for( p = 0; p < eigSize.height; p++, be += eigStep )
            for( l = 0; l < eigSize.width; l++ )
                be[l] = 0.0f;
    }

    for( k = 0; k < nObjects; k++ )
    {
        uchar *bv = (ioFlags & CV_EIGOBJ_INPUT_CALLBACK) ? buf : ((uchar **) input)[k];

        if( ioFlags & CV_EIGOBJ_INPUT_CALLBACK )
        {
            CvCallback read_callback = ((CvInput *) & input)->callback;

            r = (CvStatus)read_callback( k, (void *) buf, userData );
            if( r )
            {
                cvFree( &ev );
                if( iev )
                    cvFree( &eigVals );
                if( buffer )
                    cvFree( &buffer );
                if( buf )
                    cvFree( &buf );
                return r;
            }
        }

        for( i = 0; i < m1; i++ )
        {
            float v = eigVals[i] * ev[i * nObjects + k];
            float *be = ((float **) output)[i];
            uchar *bu = bv;

            bf = avg;

            for( p = 0; p < size.height; p++, bu += objStep1,
                 bf += avgStep, be += eigStep1 )
            {
                for( l = 0; l < size.width - 3; l += 4 )
                {
                    float f = bf[l];
                    uchar u = bu[l];

                    be[l] += v * (u - f);
                    f = bf[l + 1];
                    u = bu[l + 1];
                    be[l + 1] += v * (u - f);
                    f = bf[l + 2];
                    u = bu[l + 2];
                    be[l + 2] += v * (u - f);
                    f = bf[l + 3];
                    u = bu[l + 3];
                    be[l + 3] += v * (u - f);
                }
                for( ; l < size.width; l++ )
                    be[l] += v * (bu[l] - bf[l]);
            }
        }                   /* i */
    }                       /* k */

PCA は共分散行列とその固有値と固有ベクトルを計算することであることがわかっていますが、関数の一部が内部関数 icvCalcCovarMatrixEx_8u32fR() を呼び出して固有値と固有ベクトルを計算すると、「上のコードの目的は何ですか?」 [その他の部分]"? [その他の部分] は固有ベクトルを計算することだと思いますが、関数 icvCalcCovarMatrixEx_8u32fR() がそれを行ったので、このコードの目的は何かを答えるのを手伝ってくれる人はいますか? ありがとう!!!

4

0 に答える 0