OpenCV中cvCalcPCA的几个问题

本文探讨了在OpenCV中使用cvCalcPCA函数进行PCA降维时遇到的问题及解决方案。主要涉及特征值和特征向量矩阵的正确创建,以及处理输入数据时内存管理的重要性。在解决尺寸设置错误后,确保了特征值、特征向量计算的正确性,并在PCA变换后释放了内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在人脸表情所用的特征中,LBP特征中是一个常用的特征。但是LBP特征提取后,维数太高,即使使用LBP直方图的特征仍然很高,因此需要降维。一个比较好的降维方法就是PCA。在OpenCV中,cvCalcPCA函数可以直接调用进行PCA降维。以前在人脸识别的程序中,我曾经调用过这个函数,这次再次使用,但是却出错了。主要有两个问题:

1 特征值和特征向量的行列数设置问题

如果按如下方式使用,也就是根据PCA的数学表达式进行参数设置:

AvgVector=cvCreateMat(1,m_pm.dim,CV_32FC1);

EigenValue_Row=cvCreateMat(1,m_pm.dim,),CV_32FC1);

EigenVector=cvCreateMat((m_pm.dim),m_pm.dim,CV_32FC1);

那么就会出现错误:

Incorrect size of input array。

根据错误提示,说明特征向量的列数和输入矩阵(特征矩阵)的列数一致,行数要和特征值的数目一致;而特征值的数目(特征值矩阵的行数或列数)不能大于输入矩阵的行数和列数。

因此,需要下列设定:

AvgVector=cvCreateMat(1,m_pm.dim,CV_32FC1);

EigenValue_Row=cvCreateMat(1,min(m_pm.dim,m_pm.numOfSamples),CV_32FC1);

或EigenValue_Row=cvCreateMat(min(m_pm.dim,m_pm.numOfSamples),1,CV_32FC1);

EigenVector=cvCreateMat(min(m_pm.dim,m_pm.numOfSamples),m_pm.dim,CV_32FC1);

// 计算特征值,对原始数据进行变换,得到主成分

cvCalcPCA(vector_feature,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);

cvProjectPCA(vector_feature,AvgVector,EigenVector,vector_pca);

 

2 出现中断点

由于保存输入矩阵的特征是一维的,需要转换成二维的,所以要申请一段内存保存特征,在cvCalcPCA之前这段内存不能释放,需要在cvCalcPCA之后才能释放,所以正确 的代码为:

float* features=new float[lenOfFeatures];

...

CvMat* vector_feature=cvCreateMat(m_pm.numOfSamples,m_pm.dim,CV_32FC1);

cvSetData(vector_feature,features,vector_feature->step);

CvMat *AvgVector;

CvMat *EigenVector;

CvMat *EigenValue_Row;

CvMat* vector_pca=cvCreateMat(m_pm.numOfSamples,PCA_DIM,CV_32FC1);

 

AvgVector=cvCreateMat(1,m_pm.dim,CV_32FC1);

EigenValue_Row=cvCreateMat(1,min(m_pm.dim,m_pm.numOfSamples),CV_32FC1);

EigenVector=cvCreateMat(min(m_pm.dim,m_pm.numOfSamples),m_pm.dim,CV_32FC1);

// 计算特征值,对原始数据进行变换,得到主成分

cvCalcPCA(vector_feature,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);

cvProjectPCA(vector_feature,AvgVector,EigenVector,vector_pca);

delete[] features;

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值