我尝试使用OpenCV for Android实现面部特征识别面部识别。
我有一组训练图像,它们都是100x100像素的灰度图像。我目前正在使用Highgui.imread来读取这些图像,因此每个图像都是宽度和高度为100的Mat。我试图使用Core.PCACompute函数来查找这组图像的主要组件。
public static void PCACompute(Mat data, Mat mean, Mat eigenvectors, int maxComponents)
所以我的问题是:第一个参数(Mat数据)需要具有哪些维度?是否可以传递一组多个图像,即使数据只是一个Mat?
或者我做错了,这不是用于特征脸的正确函数?我见过的一个教程使用了一个名为cvCalcEigenObjects的C ++函数,但是我找不到等效的Java方法......
答案 0 :(得分:1)
该函数需要单个Mat 作为输入。但您可以传递数据like this:
1711 public void testPCAComputeMatMatMat() {
1712 Mat data = new Mat(3, 4, CvType.CV_32F) {
1713 {
1714 put(0, 0, 1, 2, 2, 4);
1715 put(1, 0, 2, 4, 4, 8);
1716 put(2, 0, 3, 6, 6, 12);
1717 }
1718 };
1719 Mat mean = new Mat();
1720 Mat vectors = new Mat();
1721
1722 Core.PCACompute(data, mean, vectors);
1723
1724 Mat mean_truth = new Mat(1, 4, CvType.CV_32F) {
1725 {
1726 put(0, 0, 2, 4, 4, 8);
1727 }
1728 };
1729 Mat vectors_truth = new Mat(3, 4, CvType.CV_32F, new Scalar(0)) {
1730 {
1731 put(0, 0, 0.2, 0.4, 0.4, 0.8);
1732 }
1733 };
1734 assertMatEqual(mean_truth, mean, EPS);
1735 assertMatEqual(vectors_truth, vectors, EPS);
1736 }
要开始玩人脸识别,我建议使用此doc,因为它解释了what PCA does。
this link提供了一些信息和源代码,用于使用图像进行简单的人脸识别。