2012-01-30 30 views
0

您好,我正在研究一个涉及人脸识别的项目,我正在使用线性判别分析(LDA)。 LDA要求为类间散布矩阵和类散布矩阵找到广义特征向量,这就是我遇到的地方。我正在使用OpenCv和DevC++进行编码。基本上,这个问题看起来像OpenCV中两个矩阵的广义特征值

A*v=lambda*B*v 

其中A和B是针对广义特征向量矩阵应该找到 中λ为特征值,v为载体

在寻找这个问题很多人都建议去计算B的倒数,然后乘以A * v

(inv(B)*A)*v=lambda*v 

然后计算inv(B)* A的特征向量。

这似乎是一个很好的解决方案,但在我的情况下,散布矩阵B几乎是奇异的。我发现它的行列式是在10^-36的数量级,所以我找不到它的反函数并继续上面的解决方案。所以有人建议我摆脱这个问题,除了说分开编码广义特征值问题。

回答

2

我在我的github存储库中提供了一个Fisherfaces实现https://github.com/bytefish/opencv/tree/master/lda。这包括为一般矩阵实现一个特征值求解器,请参阅:https://github.com/bytefish/opencv/blob/master/lda/include/decomposition.hpp(我已经移植了很好的JAMA solver),这完全是你正在寻找的。

如果您在代码方面有问题,请在http://www.bytefish.de/blog/fisherfaces_in_opencv的项目页面上给我留言。