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 + -
显示快捷键?