aeigenobjects.cpp

来自「微软的基于HMM的人脸识别原代码, 非常经典的说」· C++ 代码 · 共 766 行 · 第 1/2 页

CPP
766
字号
/*  Eigen values comparision */
    for( i=0; i<m1; i++ )
    {
        double e0 = eigVal0[i], e = eigVal[i];
        if(e0)
            if( fabs( (e-e0)/e0 ) > RELDIFF ) err3++;
    }

/*  Decomposition coefficients comparision */
    for( i=0; i<m1; i++ )
        if(coeffs0[i])
            if( fabs( (coeffs[i] - coeffs0[i])/coeffm ) > RELDIFF ) err4++;

/*  Projection comparision */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ )
        {
            int ij = i*step + j;
            if( fabs( (double)((pro+roi)[ij] - (pro0+roi)[ij]) ) > MAXDIFF ) err5++;
        }

    err0 = 0;
    p = 100.f*err6/(float)(obj_number*obj_number);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Covar. matrix - %d errors (%7.3f %% );\n", err6, p );
        err0 += err6;
    }
    p = 100.f*err1/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Averaged obj. - %d errors (%7.3f %% );\n", err1, p );
        err0 += err1;
    }
    p = 100.f*err3/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen values  - %d errors (%7.3f %% );\n", err3, p );
        err0 += err3;
    }
    p = 100.f*err2/(float)(size.height*size.width*m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen objects - %d errors (%7.3f %% );\n", err2, p );
        err0 += err2;
    }
    p = 100.f*err4/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Decomp.coeffs - %d errors (%7.3f %% );\n", err4, p );
        err0 += err4;
    }
    if( ((float)err7)/m1 > 0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Single dec.c. - %d errors        ;\n", err7);
        err0 += err7;
    }
    p = 100.f*err5/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Projection    - %d errors (%7.3f %% );\n", err5, p );
        err0 += err5;
    }
    trsWrite(TW_RUN|TW_CON, "     without callbacks :  %8d  errors;\n", err0 );

    err += err0;

/*- - - - - - - - - - - - - - - - - - - - - input callback - - - - - - - - - - - - - */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ ) pro[i*step + j] = pro0[i*step + j];
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ ) avg[i*step44 + j] = avg0[i*step44 + j];
    for( i=0; i<m1;   i++ ) { coeffs[i] = coeffs0[i];  eigVal[i] = eigVal0[i]; }
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
                eigObjs[ie][i*step44+j] = eigObjs0[ie][i*step44+j];

    err1 = err2 = err3 = err4 = err5 = err6 = err7 = 0;

    cvCalcEigenObjects ( obj_number,
                         read_,
                         (void*)EigObjs,
                         CV_EIGOBJ_INPUT_CALLBACK,
                         bufSize,
                         (void*)&userData,
                         &limit,
                         Avg,
                         eigVal );

    cvEigenDecomposite( Object,
                        m1,
                        read_2,
                        CV_EIGOBJ_INPUT_CALLBACK,
                        (void*)&userData,
                        Avg,
                        coeffs );

    cvEigenProjection ( read_2,
                        m1,
                        CV_EIGOBJ_INPUT_CALLBACK,
                        (void*)&userData,
                        coeffs,
                        Avg,
                        Pro );

/*  Averaged object comparision */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ )
        {
            int ij = i*step44 + j;
            if( fabs( (avg+roi)[ij] - (avg0+roi)[ij] ) > MAXDIFF ) err1++;
        }

/*  Eigen objects comparision */
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
            {
                int ij = i*step44 + j;
                float e0 = (eigObjs0[ie])[ij],  e = (eigObjs[ie])[ij];
                    if( fabs( (e-e0)/amax ) > RELDIFF ) err2++;
            }

/*  Eigen values comparision */
    for( i=0; i<m1; i++ )
    {
        double e0 = eigVal0[i], e = eigVal[i];
        if(e0)
            if( fabs( (e-e0)/e0 ) > RELDIFF ) err3++;
    }

/*  Projection comparision */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ )
        {
            int ij = i*step + j;
            if( fabs( (double)((pro+roi)[ij] - (pro0+roi)[ij]) ) > MAXDIFF ) err5++;
        }

/*  Decomposition coefficients comparision */
    for( i=0; i<m1; i++ )
        if(coeffs0[i])
            if( fabs( (coeffs[i] - coeffs0[i])/coeffm ) > RELDIFF ) err4++;

    err0 = 0;
    p = 100.f*err1/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Averaged obj. - %d errors (%7.3f %% );\n", err1, p );
        err0 += err1;
    }
    p = 100.f*err3/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen values  - %d errors (%7.3f %% );\n", err3, p );
        err0 += err3;
    }
    p = 100.f*err2/(float)(size.height*size.width*m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen objects - %d errors (%7.3f %% );\n", err2, p );
        err0 += err2;
    }
    p = 100.f*err4/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Decomp.coeffs - %d errors (%7.3f %% );\n", err4, p );
        err0 += err4;
    }
    p = 100.f*err5/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Projection    - %d errors (%7.3f %% );\n", err5, p );
        err0 += err5;
    }
    trsWrite(TW_RUN|TW_CON, "        input callback :  %8d  errors;\n", err0 );

    err += err0;

/*- - - - - - - - - - - - - - - - - - - - - output callback - - - - - - - - - - - - - */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ ) avg[i*step44 + j] = avg0[i*step44 + j];
    for( i=0; i<m1;   i++ ) eigVal[i] = eigVal0[i];
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
                eigObjs[ie][i*step44+j] = eigObjs0[ie][i*step44+j];

    err1 = err2 = err3 = err4 = err5 = 0;

    cvCalcEigenObjects ( obj_number,
                         (void*)Objs,
                         write_,
                         CV_EIGOBJ_OUTPUT_CALLBACK,
                         bufSize,
                         (void*)&userData,
                         &limit,
                         Avg,
                         eigVal );

/*  Averaged object comparision */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ )
        {
            int ij = i*step44 + j;
            if( fabs( (avg+roi)[ij] - (avg0+roi)[ij] ) > MAXDIFF ) err1++;
        }

/*  Eigen objects comparision */
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
            {
                int ij = i*step44 + j;
                float e0 = (eigObjs0[ie])[ij],  e = (eigObjs[ie])[ij];
                    if( fabs( (e-e0)/amax ) > RELDIFF ) err2++;
            }

/*  Eigen values comparision */
    for( i=0; i<m1; i++ )
    {
        double e0 = eigVal0[i], e = eigVal[i];
        if(e0)
            if( fabs( (e-e0)/e0 ) > RELDIFF ) err3++;
    }

    err0 = 0;
    p = 100.f*err1/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Averaged obj. - %d errors (%7.3f %% );\n", err1, p );
        err0 += err1;
    }
    p = 100.f*err3/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen values  - %d errors (%7.3f %% );\n", err3, p );
        err0 += err3;
    }
    p = 100.f*err2/(float)(size.height*size.width*m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen objects - %d errors (%7.3f %% );\n", err2, p );
        err0 += err2;
    }
    trsWrite(TW_RUN|TW_CON, "       output callback :  %8d  errors;\n", err0 );

    err += err0;

/*- - - - - - - - - - - - - - - - - - - - - both callbacks - - - - - - - - - - - - - */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ ) avg[i*step44 + j] = avg0[i*step44 + j];
    for( i=0; i<m1;   i++ ) eigVal[i] = eigVal0[i];
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
                eigObjs[ie][i*step44+j] = eigObjs0[ie][i*step44+j];

    err1 = err2 = err3 = err4 = err5 = 0;

    cvCalcEigenObjects ( obj_number,
                         read_,
                         write_,
                         CV_EIGOBJ_INPUT_CALLBACK | CV_EIGOBJ_OUTPUT_CALLBACK,
                         bufSize,
                         (void*)&userData,
                         &limit,
                         Avg,
                         eigVal );

/*  Averaged object comparision */
    for( i=0; i<size.height; i++ )
        for( j=0; j<size.width; j++ )
        {
            int ij = i*step44 + j;
            if( fabs( (avg+roi)[ij] - (avg0+roi)[ij] ) > MAXDIFF ) err1++;
        }

/*  Eigen objects comparision */
    for( ie=0; ie<m1; ie++ )
        for( i=0; i<size.height; i++ )
            for( j=0; j<size.width; j++ )
            {
                int ij = i*step44 + j;
                float e0 = (eigObjs0[ie])[ij],  e = (eigObjs[ie])[ij];
                    if( fabs( (e-e0)/amax ) > RELDIFF ) err2++;
            }

/*  Eigen values comparision */
    for( i=0; i<m1; i++ )
    {
        double e0 = eigVal0[i], e = eigVal[i];
        if(e0)
            if( fabs( (e-e0)/e0 ) > RELDIFF ) err3++;
    }

    err0 = 0;
    p = 100.f*err1/(float)(size.height*size.width);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Averaged obj. - %d errors (%7.3f %% );\n", err1, p );
        err0 += err1;
    }
    p = 100.f*err3/(float)(m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen values  - %d errors (%7.3f %% );\n", err3, p );
        err0 += err3;
    }
    p = 100.f*err2/(float)(size.height*size.width*m1);
    if( p>0.1 )
    {
        trsWrite(TW_RUN|TW_CON, "         Eigen objects - %d errors (%7.3f %% );\n", err2, p );
        err0 += err2;
    }
    trsWrite(TW_RUN|TW_CON, "        both callbacks :  %8d  errors;\n", err0 );

    err += err0;


/*================================-- test with ROI --===================================*/

    if(!rep)
    {
        roix  = (int)(0.157f*obj_width);
        roiy  = (int)(0.131f*obj_height);
        sizex = (int)(0.611f*obj_width);
        sizey = (int)(0.737f*obj_height);
        roi   = roiy*obj_width + roix;

trsWrite(TW_RUN|TW_CON, "\n ROI   supported\n" );
        rep++;
        size.width = sizex;  size.height = sizey;

        goto repeat;
    }

/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ free memory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
    cvReleaseImage( &Avg    );
    cvReleaseImage( &Avg0   );
    cvReleaseImage( &Pro    );
    cvReleaseImage( &Pro0   );
    cvReleaseImage( &Object );
    for( i=0; i<obj_number; i++ )
    {
        cvReleaseImage( &Objs[i] );
        if( i < m1 )
        {
            cvReleaseImage( &EigObjs[i]  );
            cvReleaseImage( &EigObjs0[i] );
        }
    }

    icvFree( (void**)&objs     );
    icvFree( (void**)&eigObjs  );
    icvFree( (void**)&eigObjs0 );
    icvFree( (void**)&coeffs   );
    icvFree( (void**)&coeffs0  );
    icvFree( (void**)&eigVal   );
    icvFree( (void**)&eigVal0  );
    icvFree( (void**)&Objs     );
    icvFree( (void**)&EigObjs  );
    icvFree( (void**)&EigObjs0 );
    icvFree( (void**)&covMatr  );
    icvFree( (void**)&covMatr0 );

trsWrite(TW_RUN|TW_CON, "\n Errors number: %d\n", err );

    if(err) return trsResult( TRS_FAIL, "Algorithm test has passed. %d errors.", err );
    else    return trsResult( TRS_OK, "Algorithm test has passed successfully" );
    
} /*fma*/

/*------------------------------------------- Initialize function ------------------------ */
void InitAEigenObjects( void )
{
   /* Registering test function */
    trsReg( FuncName, TestName, TestClass, fmaEigenObjects );
} /* InitAEigenObjects */

/*  End of file  */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?