OpenCV库中的PCA源代码 以下API函数是OpenCV库中PCA的源代码:
此函数来自Eigenobjects.cpp 我不理解以下代码: (i=0;iOpenCV库中的PCA源代码 以下API函数是OpenCV库中PCA的源代码:,opencv,pca,eigenvector,eigenvalue,Opencv,Pca,Eigenvector,Eigenvalue,此函数来自Eigenobjects.cpp 我不理解以下代码: (i=0;i
*/
{
浮点*be=((浮点**)输出)[i];
对于(p=0;pcallback;
r=(CvStatus)读取回调(k,(void*)buf,userData);
if(r)
{
无cv(&ev);
如果(iev)
无CVE(和eigVals);
if(缓冲区)
cvFree(缓冲区和缓冲区);
如果(buf)
无CVF(&buf);
返回r;
}
}
对于(i=0;i
我知道PCA是通过计算协方差矩阵及其特征值和特征向量来实现的,但是当函数的一部分调用内部函数icvCalcCovarMatrixEx_8u32fR()来计算特征值和特征向量,然后“上述代码在[其他部分]中的用途是什么?”?我猜[其他部分]是计算本征向量,但函数icvCalcCovarMatrixEx_8u32fR()已经完成了,
那么,有没有人能帮我回答这个代码的目的?谢谢
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 )
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 */