使用 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 计算特征值、特征向量的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenCV 中使用 PCA 进行降维,特征向量的维数错误
OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB
Opencv C++读取分配给特征向量的opencv Mat