cveigenobjectswrap.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 732 行 · 第 1/3 页
SVN-BASE
732 行
if( objects == NULL || eigens == NULL )
CV_ERROR( CV_StsBadArg, "Insufficient memory" );
for( i = 0; i < nObjects; i++ )
{
IplImage *img = objects[i];
uchar *obj_data;
CV_CALL( CV_CHECK_IMAGE( img ));
cvGetImageRawData( img, &obj_data, &obj_step, &obj_size );
if( img->depth != IPL_DEPTH_8U )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( obj_size != avg_size || obj_size != old_size )
CV_ERROR( CV_StsBadArg, "Different sizes of objects" );
if( img->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
if( i > 0 && obj_step != old_step )
CV_ERROR( CV_StsBadArg, "Different steps of objects" );
old_step = obj_step;
old_size = obj_size;
objs[i] = obj_data;
}
for( i = 0; i < nEigens; i++ )
{
IplImage *eig = eigens[i];
float *eig_data;
CV_CALL( CV_CHECK_IMAGE( eig ));
cvGetImageRawData( eig, (uchar **) & eig_data, &eig_step, &eig_size );
if( eig->depth != IPL_DEPTH_32F )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( eig_size != avg_size || eig_size != oldeig_size )
CV_ERROR( CV_StsBadArg, "Different sizes of objects" );
if( eig->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
if( i > 0 && eig_step != oldeig_step )
CV_ERROR( CV_StsBadArg, "Different steps of objects" );
oldeig_step = eig_step;
oldeig_size = eig_size;
eigs[i] = eig_data;
}
CV_CALL( icvCalcEigenObjects_8u32fR( nObjects,
(void*) objs,
obj_step,
(void*) eigs,
eig_step,
obj_size,
ioFlags,
ioBufSize,
userData,
calcLimit,
avg_data,
avg_step,
eigVals ));
icvFree( (void**) &objs );
icvFree( (void**) &eigs );
break;
}
case CV_EIGOBJ_OUTPUT_CALLBACK:
{
IplImage **objects = (IplImage **) (((CvInput *) & input)->data);
uchar **objs = (uchar **) icvAlloc( sizeof( uchar * ) * nObjects );
int obj_step = 0, old_step = 0;
CvSize obj_size = avg_size, old_size = avg_size;
if( objects == NULL )
CV_ERROR( CV_StsBadArg, "Insufficient memory" );
for( i = 0; i < nObjects; i++ )
{
IplImage *img = objects[i];
uchar *obj_data;
CV_CALL( CV_CHECK_IMAGE( img ));
cvGetImageRawData( img, &obj_data, &obj_step, &obj_size );
if( img->depth != IPL_DEPTH_8U )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( obj_size != avg_size || obj_size != old_size )
CV_ERROR( CV_StsBadArg, "Different sizes of objects" );
if( img->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
if( i > 0 && obj_step != old_step )
CV_ERROR( CV_StsBadArg, "Different steps of objects" );
old_step = obj_step;
old_size = obj_size;
objs[i] = obj_data;
}
CV_CALL( icvCalcEigenObjects_8u32fR( nObjects,
(void*) objs,
obj_step,
output,
avg_step,
obj_size,
ioFlags,
ioBufSize,
userData,
calcLimit,
avg_data,
avg_step,
eigVals ));
icvFree( (void **) &objs );
break;
}
case CV_EIGOBJ_INPUT_CALLBACK:
{
IplImage **eigens = (IplImage **) (((CvInput *) & output)->data);
float **eigs = (float**) icvAlloc( sizeof( float* ) * nEigens );
int eig_step = 0, oldeig_step = 0;
CvSize eig_size = avg_size, oldeig_size = avg_size;
if( eigens == NULL )
CV_ERROR( CV_StsBadArg, "Insufficient memory" );
for( i = 0; i < nEigens; i++ )
{
IplImage *eig = eigens[i];
float *eig_data;
CV_CALL( CV_CHECK_IMAGE( eig ));
cvGetImageRawData( eig, (uchar **) & eig_data, &eig_step, &eig_size );
if( eig->depth != IPL_DEPTH_32F )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( eig_size != avg_size || eig_size != oldeig_size )
CV_ERROR( CV_StsBadArg, "Different sizes of objects" );
if( eig->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
if( i > 0 && eig_step != oldeig_step )
CV_ERROR( CV_StsBadArg, "Different steps of objects" );
oldeig_step = eig_step;
oldeig_size = eig_size;
eigs[i] = eig_data;
}
CV_CALL( icvCalcEigenObjects_8u32fR( nObjects,
input,
avg_step / 4,
(void*) eigs,
eig_step,
eig_size,
ioFlags,
ioBufSize,
userData,
calcLimit,
avg_data,
avg_step,
eigVals ));
icvFree( (void **) &eigs );
break;
}
case CV_EIGOBJ_INPUT_CALLBACK | CV_EIGOBJ_OUTPUT_CALLBACK:
CV_CALL( icvCalcEigenObjects_8u32fR( nObjects,
input,
avg_step / 4,
output,
avg_step,
avg_size,
ioFlags,
ioBufSize,
userData,
calcLimit,
avg_data,
avg_step,
eigVals ));
break;
default:
CV_ERROR( CV_StsBadArg, "Unsupported i/o flag" );
}
__CLEANUP__;
__END__;
}
/*--------------------------------------------------------------------------------------*/
/*F///////////////////////////////////////////////////////////////////////////////////////
// Name: cvCalcDecompCoeff
// Purpose: The function calculates one decomposition coefficient of input object
// using previously calculated eigen object and the mean (averaged) object
// Context:
// Parameters: obj - input object
// eigObj - eigen object
// avg - averaged object
//
// Returns: decomposition coefficient value or large negative value (if error)
//
// Notes:
//F*/
CV_IMPL double
cvCalcDecompCoeff( IplImage * obj, IplImage * eigObj, IplImage * avg )
{
double coeff = DBL_MAX;
uchar *obj_data;
float *eig_data;
float *avg_data;
int obj_step = 0, eig_step = 0, avg_step = 0;
CvSize obj_size, eig_size, avg_size;
CV_FUNCNAME( "cvCalcDecompCoeff" );
__BEGIN__;
CV_CALL( CV_CHECK_IMAGE( obj ));
CV_CALL( CV_CHECK_IMAGE( eigObj ));
CV_CALL( CV_CHECK_IMAGE( avg ));
cvGetImageRawData( obj, &obj_data, &obj_step, &obj_size );
if( obj->depth != IPL_DEPTH_8U )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( obj->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
cvGetImageRawData( eigObj, (uchar **) & eig_data, &eig_step, &eig_size );
if( eigObj->depth != IPL_DEPTH_32F )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( eigObj->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
cvGetImageRawData( avg, (uchar **) & avg_data, &avg_step, &avg_size );
if( avg->depth != IPL_DEPTH_32F )
CV_ERROR( CV_BadDepth, icvUnsupportedFormat );
if( avg->nChannels != 1 )
CV_ERROR( CV_BadNumChannels, icvUnsupportedFormat );
if( obj_size != eig_size || obj_size != avg_size )
CV_ERROR( CV_StsBadArg, "different sizes of images" );
coeff = icvCalcDecompCoeff_8u32fR( obj_data, obj_step,
eig_data, eig_step,
avg_data, avg_step, obj_size );
__END__;
return coeff;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?