⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anorm.cpp

📁 微软的基于HMM的人脸识别原代码, 非常经典的说
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    for( j=0, j4=0; j<nx; j++, j4+=3, k++ )
                    {
                        a[k] = *(char*)(A_data+j4);
                        b[k] = *(char*)(B_data+j4);
                    }
            }

            if( A->depth == IPL_DEPTH_32F )
            {
                A_data += 4*coi;
                B_data += 4*coi;

                for( i=0; i<ny; i++, A_data+=A_step, B_data+=B_step )
                    for( j=0, j4=0; j<nx; j++, j4+=12, k++ )
                    {
                        a[k] = *(float*)(A_data+j4);
                        b[k] = *(float*)(B_data+j4);
                    }
            }
        }
        else
        {
            if( A->depth == IPL_DEPTH_8U )
            {
                A_data += coi;

                for( i=0; i<ny; i++, A_data+=A_step )
                    for( j=0, j4=0; j<nx; j++, j4+=3, k++ )
                        a[k] = A_data[j4];
            }

            if( A->depth == IPL_DEPTH_8S )
            {
                A_data += coi;

                for( i=0; i<ny; i++, A_data+=A_step )
                    for( j=0, j4=0; j<nx; j++, j4+=3, k++ )
                        a[k] = *(char*)(A_data+j4);
            }

            if( A->depth == IPL_DEPTH_32F )
            {
                A_data += 4*coi;

                for( i=0; i<ny; i++, A_data+=A_step )
                    for( j=0, j4=0; j<nx; j++, j4+=12, k++ )
                        a[k] = *(float*)(A_data+j4);
            }
        }
    }  /* channels */

    norm = calcTestNorm( a, b, n, type );

    icvFree((void**)&a );
    if(b) icvFree((void**)&b );

    return norm;
}

/*================================================ Test body ========================== */
static int fmaNorm(void)
{
    /* Some Variables */
    int nx, ny, n, n4, it, ir, nr, nerr=0, coi, step, step4;
    int xoff, yoff, roiw, roih, nerrt[9];
    CvSize size;
    AtsRandState state1, state2, state3;
    IplImage *A_8uC1, *A_8sC1, *A_32fC1, *B_8uC1, *B_8sC1, *B_32fC1;
    IplImage *A_8uC3, *A_8sC3, *A_32fC3, *B_8uC3, *B_8sC3, *B_32fC3;
    IplROI   r;
    double norm, testnorm, err;

    trsiRead( &Min_Image_Width,  "1", "Minimal image width" );
    trsiRead( &Max_Image_Width, "32", "Maximal image width" );
    trsiRead( &Max_ROI_Offset,   "8", "Maximal ROI offset" );

    if( Min_Image_Width < 1 )               Min_Image_Width = 1;
    if( Max_Image_Width < Min_Image_Width ) Max_Image_Width = Min_Image_Width;
    if( Max_ROI_Offset  < 0 )               Max_ROI_Offset  = 0;

    atsRandInit( &state1, MIN_VAL(IPL_DEPTH_8U),  MAX_VAL(IPL_DEPTH_8U),  13 );
    atsRandInit( &state2, MIN_VAL(IPL_DEPTH_8S),  MAX_VAL(IPL_DEPTH_8S),  14 );
    atsRandInit( &state3, MIN_VAL(IPL_DEPTH_32F), MAX_VAL(IPL_DEPTH_32F), 15 );

    for( it=0; it<9; it++ ) nerrt[it] = 0;

/* Image size cycle starts ________________________ */
    for( nx = Min_Image_Width; nx<=Max_Image_Width; nx++ )
    {
        ny = nx;
        /*if(nx>1)ny=(int)(0.7*nx);           // Non-square images test */
        size.width  = nx;  size.height = ny;

        /* Initial images allocating & random filling */
        A_8uC1  = cvCreateImage( size, IPL_DEPTH_8U,  1 );
        
        A_8sC1  = cvCreateImage( size, IPL_DEPTH_8S,  1 );
        A_32fC1 = cvCreateImage( size, IPL_DEPTH_32F, 1 );
            B_8uC1  = cvCreateImage( size, IPL_DEPTH_8U,  1 );
            B_8sC1  = cvCreateImage( size, IPL_DEPTH_8S,  1 );
            B_32fC1 = cvCreateImage( size, IPL_DEPTH_32F, 1 );
                A_8uC3  = cvCreateImage( size, IPL_DEPTH_8U,  3 );
                A_8sC3  = cvCreateImage( size, IPL_DEPTH_8S,  3 );
                A_32fC3 = cvCreateImage( size, IPL_DEPTH_32F, 3 );
                    B_8uC3  = cvCreateImage( size, IPL_DEPTH_8U,  3 );
                    B_8sC3  = cvCreateImage( size, IPL_DEPTH_8S,  3 );
                    B_32fC3 = cvCreateImage( size, IPL_DEPTH_32F, 3 );

        step = A_8uC1->widthStep;  step4 = (A_32fC1->widthStep)/4;
        n = ny*step;  n4 = ny*step4;

        atsbRand8u ( &state1, (uchar*)A_8uC1->imageData,  n );
        atsbRand8s ( &state2, A_8sC1->imageData,  n );
        atsbRand32f( &state3, (float*)A_32fC1->imageData, n4);
            atsbRand8u ( &state1, (uchar*)B_8uC1->imageData,  n );
            atsbRand8s ( &state2, B_8sC1->imageData,  n );
            atsbRand32f( &state3, (float*)B_32fC1->imageData, n4);

        step = A_8uC3->widthStep;  step4 = (A_32fC3->widthStep)/4;
        n = ny*step;  n4 = ny*step4;

        atsbRand8u ( &state1, (uchar*)A_8uC3->imageData,  n );
        atsbRand8s ( &state2, A_8sC3->imageData,  n );
        atsbRand32f( &state3, (float*)A_32fC3->imageData, n4);
            atsbRand8u ( &state1, (uchar*)B_8uC3->imageData,  n );
            atsbRand8s ( &state2, B_8sC3->imageData,  n );
            atsbRand32f( &state3, (float*)B_32fC3->imageData, n4);

        nr = (ny-1)/2>Max_ROI_Offset ? Max_ROI_Offset : (ny-1)/2;

        for( ir = 0; ir<=nr; ir++) /* ROI size cycle starts ----------------- */
        {
            /* IPL ROI structures filling */
            xoff = ir/11;
            yoff = ir;
            roiw = nx - (int)(1.2*xoff);
            roih = ny - (int)(1.5*yoff);
            r.xOffset = xoff;
            r.yOffset = yoff;
            r.width   = roiw;
            r.height  = roih;

            A_8uC1->roi = A_8sC1->roi = A_32fC1->roi = 
            A_8uC3->roi = A_8sC3->roi = A_32fC3->roi = 
            B_8uC1->roi = B_8sC1->roi = B_32fC1->roi = 
            B_8uC3->roi = B_8sC3->roi = B_32fC3->roi = &r;


/*  T E S T I N G  */
            for(it = 0; it<9; it++)
            {
                IplImage* B;

                r.coi = 0;

                B = it<3 ? NULL : B_8uC1;
                norm    =  cvNorm( A_8uC1, B, cvlType[it] );
                testnorm= TestNorm( A_8uC1, B, cvlType[it] );
                err = fabs((norm-testnorm)/testnorm);
                if( err > EPS )
                {
                    nerrt[it]++;
                    printf(" 8uC1  %d norm fail:  %f  %f\n", it+1, norm, testnorm);
                }

                B = it<3 ? NULL : B_8sC1;
                norm    =  cvNorm( A_8sC1, B, cvlType[it] );
                testnorm= TestNorm( A_8sC1, B, cvlType[it] );
                err = fabs((norm-testnorm)/testnorm);
                if( err > EPS )
                {
                    nerrt[it]++;
                    printf(" 8sC1  %d norm fail:  %f  %f\n", it+1, norm, testnorm);
                }

                B = it<3 ? NULL : B_32fC1;
                norm    =  cvNorm( A_32fC1, B, cvlType[it] );
                testnorm= TestNorm( A_32fC1, B, cvlType[it] );
                err = fabs((norm-testnorm)/testnorm);
                if( err > FEPS )
                {
                    nerrt[it]++;
                    printf(" 32fC1 %d norm fail:  %f  %f\n", it+1, norm, testnorm);
                }

                    B = it<3 ? NULL : B_8uC3;
                    for( coi=1; coi<4; coi++ )
                    {
                        r.coi   = coi;
                        norm    =  cvNorm( A_8uC3, B, cvlType[it] );
                        testnorm= TestNorm( A_8uC3, B, cvlType[it] );
                        err     = fabs((norm-testnorm)/testnorm);
                        if( err > EPS )
                        {
                            nerrt[it]++;
                            printf(" 8uC3  %d norm fail:  %f  %f,  coi = %d\n", it+1, norm, testnorm, coi);
                        }
                    }

                    B = it<3 ? NULL : B_8sC3;
                    for( coi=1; coi<4; coi++ )
                    {
                        r.coi = coi;
                        norm    =  cvNorm( A_8sC3, B, cvlType[it] );
                        testnorm= TestNorm( A_8sC3, B, cvlType[it] );
                        err = fabs((norm-testnorm)/testnorm);
                        if( err > EPS )
                        {
                            nerrt[it]++;
                            printf(" 8sC3  %d norm fail:  %f  %f,  coi = %d\n", it+1, norm, testnorm, coi);
                        }
                    }

                    B = it<3 ? NULL : B_32fC3;
                    for( coi=1; coi<4; coi++ )
                    {
                        r.coi = coi;
                        norm    =  cvNorm( A_32fC3, B, cvlType[it] );
                        testnorm= TestNorm( A_32fC3, B, cvlType[it] );
                        err = fabs((norm-testnorm)/testnorm);
                        if( err > FEPS )
                        {
                            nerrt[it]++;
                            printf(" 32fC3 %d norm fail:  %f  %f,  coi = %d\n", it+1, norm, testnorm, coi);
                        }
                    }
            } /* norm type */

            for( it=0; it<9; it++ ) nerr += nerrt[it];
        } /* ROI */

        A_8uC1->roi = A_8sC1->roi = A_32fC1->roi = 
        A_8uC3->roi = A_8sC3->roi = A_32fC3->roi = 
        B_8uC1->roi = B_8sC1->roi = B_32fC1->roi = 
        B_8uC3->roi = B_8sC3->roi = B_32fC3->roi = 0;

        cvReleaseImage( &A_8uC1  );
        cvReleaseImage( &A_8sC1  );
        cvReleaseImage( &A_32fC1 );
        cvReleaseImage( &B_8uC1  );
        cvReleaseImage( &B_8sC1  );
        cvReleaseImage( &B_32fC1 );
        cvReleaseImage( &A_8uC3  );
        cvReleaseImage( &A_8sC3  );
        cvReleaseImage( &A_32fC3 );
        cvReleaseImage( &B_8uC3  );
        cvReleaseImage( &B_8sC3  );
        cvReleaseImage( &B_32fC3 );
    } /* Nx */

/*trsWrite (TW_RUN|TW_CON|TW_SUM," %d norm  %s%s flavor  fail:  %g %g\n",
          it+1, f1, f2, norm, testnorm);*/

    if(nerr) return trsResult( TRS_FAIL, "Algorithm test has passed. %d errors.", nerr );
    else    return trsResult( TRS_OK, "Algorithm test has passed successfully" );

} /* fmaNorm */
/*------------------------------------------------ Initialize function ------------------- */
void InitANorm( void )
{
    trsReg( FuncName, TestName, TestClass, fmaNorm );
} /* InitANorm */

/* End of file. */

⌨️ 快捷键说明

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