使用OpenCV的PCACompute功能

时间:2011-12-15 12:29:02

标签: opencv

我尝试使用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方法......

1 个答案:

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