2011-12-15 108 views
0

我正在尝试使用OpenCV for Android实现面部识别与特征脸。使用OpenCV的PCACompute功能

我有一组训练图像,它们都是100x100像素的灰度图像。我目前使用Highgui.imread来读取这些图像,因此每个图像都是宽度和高度为100的Mat。我试图使用Core.PCACompute函数来查找这组图像的主要组件。

public static void PCACompute(Mat data, Mat mean, Mat eigenvectors, int maxComponents) 

所以我的问题是:第一个参数(Mat数据)需要什么尺寸?即使数据只是单个Mat,是否可以传递一组多个图像?

或者我做错了,这不是正确的功能用于特征面?我见过的一个教程使用了一个名为cvCalcEigenObjects的C++函数,但我无法找到等效的Java方法...

回答

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提供了一些信息和源代码,使用图像进行简单的人脸识别以进行训练。

+0

在您链接的Cognotics文章(第5部分,第4页)中,他们使用参数nTrainFaces和faceImgArr调用cvCalcEigenObjects。 faceImgArr是一个nTrainFaces图像数组。在特征脸的上下文中,代码中的Mat数据对象是否代表三个脸部图像? – user1031921 2011-12-17 01:31:00