使用 OpenCV 计算特征值、特征向量

Posted

技术标签:

【中文标题】使用 OpenCV 计算特征值、特征向量【英文标题】:Computing Eigen Values, Eigen Vectors using OpenCV 【发布时间】:2012-03-15 16:06:51 【问题描述】:

我在计算 OpenCV 中的特征向量、值时遇到问题。我在 Python (SciPy) 中做过同样的事情,但我在移植我的代码时遇到了麻烦。

我有 2 个矩阵 Sw, Sb,其值为:

Sw:[0.0112962962962963, 0.00675925925925926;
  0.00675925925925926, 0.007962962962962963]
Sb:[0.0530787037037037, 0.01657407407407407;
  0.01657407407407407, 0.004606481481481482]

对于上述 Sw、Sb 的值,使用以下方法在 SciPy (Python) 中计算特征值、特征向量

from numpy import *
from scipy import linalg as la
evals,evecs = la.eig(Sw,Sb)

产生以下结果:

evals:
[ 0.17299805+0.j -8.47412141+0.j]
evecs:
[[ 1.         -0.31926401]
 [-0.54311321  1.        ]]

我正在尝试将上述代码移植到 OpenCV (C++ API)

对于相同的Sw、Sb值,在OpenCV中计算特征值和特征向量使用

cv::eigen(Sb,Sb_Eig_Val,Sb_Eig_Vec);

产生不同的值,即:

Sb_Eig_Val
[0.05820394496612978; -0.0005187597809445917]
Sb_Eig_Vec
[0.9553644860284983, 0.2954296850952915;
  -0.2954296850952915, 0.9553644860284983]

我错过了什么吗?

【问题讨论】:

请编辑您的问题,询问您真正有兴趣了解的内容。 这个问题可能更适合scicomp 【参考方案1】:

您正在解决两个不同的线性代数问题!考虑:

from scipy import linalg as la
sw=[[0.0112962962962963, 0.00675925925925926],[0.00675925925925926, 0.007962962962962963]]
sb=[[0.0530787037037037, 0.01657407407407407],[0.01657407407407407, 0.004606481481481482]]
print la.eig(sb)

这给出了:

(array([ 0.05820394+0.j, -0.00051876+0.j]), array([[ 0.95536449, -0.29542969],
   [ 0.29542969,  0.95536449]]))

与 openCV 完全一样。在 scipy 和 two input arguments 的情况下,您正在解决广义特征值问题,但只有一个参数它假设另一个矩阵是恒等(这通常是我们说对角化时的意思)

由于矩阵是对称的,您应该在 scipy.xml 中使用eigh。实对称矩阵给出实特征对,它会停止返回复数。

【讨论】:

以上是关于使用 OpenCV 计算特征值、特征向量的主要内容,如果未能解决你的问题,请参考以下文章

C++特征值/向量分解,只需要快速的前n个向量

在 OpenCV 中使用 PCA 进行降维,特征向量的维数错误

OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB

Opencv C++读取分配给特征向量的opencv Mat

如何使用具有面部特征的 openCV 训练支持向量机(svm)分类器?

特征向量怎么求