【问题标题】:The eigenvalue of opencv and matlab are different, why?opencv和matlab的特征值不一样,为什么?
【发布时间】:2014-08-26 04:21:38
【问题描述】:

我正在尝试 PCA 的示例,我发现使用 MATLAB 的特征值与使用 OpenCV 的值不同,而特征向量是相同的。有谁知道为什么?这两种算法有什么区别?

我的MATLAB代码如下:

a=[-14.8271317103068,-3.00108550936016,1.52090778549498,3.95534842970601;...
   -16.2288612441648,-2.80187433749996,-0.410815700402130,1.47546694457079;...
   -15.1242838039605,-2.59871263957451,-0.359965674446737,1.34583763509479;...
   -15.7031424565913,-2.53005662064257,0.255003254103276,-0.179334985754377;...
   -17.7892158910100,-3.32842422986555,0.255791146332054,1.65118282449042;...
   -17.8126324036279,-4.09719527953407,-0.879821957489877,-0.196675865428539;...
   -14.9958877514765,-3.90753364293621,-0.418298866141441,-0.278063876667954;...
   -15.5246706309866,-2.08905845264568,-1.16425848541704,-1.16976057326753;];

[covEigvec, ~,covEigval] = princomp(a, 'econ');

我的OpenCV代码如下:

cv::Mat sampleset(nums,dim,CV_32FC1,data);
cv::PCA *pca = new cv::PCA(sampleset,cv::Mat(),CV_PCA_DATA_AS_ROW,redDim);

【问题讨论】:

    标签: matlab opencv pca


    【解决方案1】:

    是的,这些特征值是不同的,达到一个比例。

    因为 opencv 在计算协方差矩阵时会缩放数据。

    core/src/matmul.cpp:2226(大致在这里)

        mulTransposed( data, _covar, ((flags & CV_COVAR_NORMAL) == 0) ^ takeRows,
        mean, (flags & CV_COVAR_SCALE) != 0 ? 1./nsamples : 1, ctype );
    

    这个函数最终会调用gemm,它的第五个参数是比例因子

    【讨论】:

    • 谢谢你。那么当我想用OpenCV的特征值做一些处理比如白化时有什么问题吗
    • 嗨,我犯了一个错误,opencv 中的缩放是一个标准化术语。请参阅“估计”部分here。注意分母有两种类型:(n-1) 和 (n),分别由 matlab 和 opencv 使用。
    • 再次感谢您。那么当我想使用特征值或只是没有差异时,哪一个是正确的?
    • 这取决于。您可以通过将特征值与​​ sqrt(n/(n-1)) 相乘来轻松转换特征值,并查看这对您的应用程序是否有任何影响。
    猜你喜欢
    • 2019-02-24
    • 2018-04-11
    • 1970-01-01
    • 2013-07-25
    • 2021-12-01
    • 2016-05-31
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多