【问题标题】:C++ face detection/recognition implementationsC++ 人脸检测/识别实现
【发布时间】:2011-09-27 19:27:53
【问题描述】:

我原以为谷歌可以回答这个问题,但我运气不佳。

除了 Viola-Jones(类 Haar 特征的增强级联)方法之外,有人知道任何人脸检测算法的任何开源 C++ 实现吗?

另外,任何地方都存在 Fisherfaces 的开源 C++ 实现吗?

谢谢。

【问题讨论】:

    标签: computer-vision face-detection


    【解决方案1】:

    这篇文章引起了一些关注,所以我想更新它。我已经贡献了我写给 OpenCV 的人脸识别库,其中包括在撰写本文时的特征脸、Fisherfaces 和局部二进制模式直方图。所以 OpenCV 2.4.2 现在已经提供了一切可以开始的东西,请参阅非常详细的文档:

    现在是原始答案。

    我是 Kevin 帖子中链接的文章的作者。请注意,您需要找到 Fisherfaces 的非对称矩阵 S_{W}^{-1} S_{B} 的特征值,我没有在我的博客中明确提及。 OpenCV 在其当前版本中只有对称矩阵的求解器;由于非对称矩阵的特征值和奇异值不等价,因此您也不能使用 SVD。对于我的项目,我已将 JAMA 求解器改编为 C++,以解决非对称矩阵的特征值问题,因此无需使用外部库。 CMakeLists.txt是配置好的,所以Eigen也可以用,任君选择。

    现在我终于找到了一些时间来使用 OpenCV2 C++ API 实现 Fisherfaces method,并将代码推送到我的 github 帐户中:

    main.cpp 向您展示了如何使用 Fisherfaces class 以及如何使用线性判别分析,示例与 http://www.bytefish.de/wiki/pca_lda_with_gnu_octave 相同。它是一个 CMake 项目,所以编译就像打字一样简单:

    philipp@mango:~/some/dir$ mkdir build; cd build
    philipp@mango:~/some/dir/build$ cmake ..
    philipp@mango:~/some/dir/build$ make
    philipp@mango:~/some/dir/build$ ./lda
    

    我不知道这是否是在答案中发布代码的首选 * 方式,但我认为发布时间有点太长。

    请注意两点。 (1) 我从 CSV 文件 (just like this one) 中读取图像,您不必关心标签的顺序。 (2) 我按列存储特征向量,而 OpenCV 中的 PCA 按行存储它们。这样做只是个人喜好问题,但我从未见过任何其他求解器,因此我决定按列存储它们。

    【讨论】:

    • 我很晚才回复这个问题,但非常感谢。这很有帮助。
    • 没问题。你需要任何关于人脸检测的代码吗?我有一些 Python 和 C++ 代码可以分享。
    • 你实现了什么?我目前只使用 OpenCV 的 Haar 级联功能。如果您有使用另一种方法的代码,那么尝试一下肯定会很好。
    • 是的,检测是基于级联的。刚看到上面你不是在找它。当我实现其他方法时可能会再次发布。