主成分分析使用 C++ 的 SVM OpenCV 2.2 中的语法
我在使用最新的 C++ 语法与 Mat 和 PCA 类来获取 PCA 和 Eigenfaces 时遇到问题。旧的 C 语法采用 IplImage* 数组作为参数来执行其处理,而当前的 API 只采用按 Column 或 Row 格式化的 Mat。我采用行方法,使用重塑函数来调整图像的矩阵以适合单行。我最终想获取这些数据,然后使用 SVM 算法进行检测,但当我这样做时,我的所有数据都只是一串 0。有人可以帮我吗?我做错了什么?谢谢!
我看到这个问题,它有些相关,但我'我不确定解决方案是什么。
这基本上就是我所拥有的:
vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
Mat values(images.size(), 1, CV_32SC1); //Values are the corresponding values to each of my images.
int nEigens = images.size() - 1; //Number of Eigen Vectors.
//Load the images into a Matrix
Mat desc_mat(images.size(), images[0].rows * images[0].cols, CV_32FC1);
for (int i=0; i<images.size(); i++) {
desc_mat.row(i) = images[i].reshape(1, 1);
}
Mat average;
PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
Mat data(desc_mat.rows, nEigens, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
for(int i=0; i<images.size(); i++) {
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(desc_mat.row(i), projectedMat);
data.row(i) = projectedMat.row(0);
}
CvMat d1 = (CvMat)data;
CvMat d2 = (CvMat)values;
CvSVM svm;
svm.train(&d1, &d2);
svm.save("svmdata.xml");
I'm having problems getting PCA and Eigenfaces working using the latest C++ syntax with the Mat and PCA classes. The older C syntax took an array of IplImage* as a parameter to perform its processing and the current API only takes a Mat that is formatted by Column or Row. I took the Row approach using the reshape function to fit my image's matrix to fit in a single row. I eventually want to take this data and then use the SVM algorithm to perform detection, but when I do that all my data is just a stream of 0s. Can someone please help me out? What am I doing wrong? Thanks!
I saw this question and it's somewhat related, but I'm not sure what the solution is.
This is basically what I have:
vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
Mat values(images.size(), 1, CV_32SC1); //Values are the corresponding values to each of my images.
int nEigens = images.size() - 1; //Number of Eigen Vectors.
//Load the images into a Matrix
Mat desc_mat(images.size(), images[0].rows * images[0].cols, CV_32FC1);
for (int i=0; i<images.size(); i++) {
desc_mat.row(i) = images[i].reshape(1, 1);
}
Mat average;
PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
Mat data(desc_mat.rows, nEigens, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
for(int i=0; i<images.size(); i++) {
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(desc_mat.row(i), projectedMat);
data.row(i) = projectedMat.row(0);
}
CvMat d1 = (CvMat)data;
CvMat d2 = (CvMat)values;
CvSVM svm;
svm.train(&d1, &d2);
svm.save("svmdata.xml");
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
etarion说的是正确的。
要复制列或行,您始终必须编写:
以下程序显示了如何在 OpenCV 中执行 PCA。它将显示平均图像和前三个特征脸。我在那里使用的图像可从 http://www.cl.cam.ac 获取.uk/research/dtg/attarchive/facedatabase.html:
如果您想按行构建矩阵(就像上面的原始问题一样),请改用:
并将 PCA 中的标志设置为:
关于机器学习。我写了一篇关于使用 OpenCV C++ API 进行机器学习的文档,其中包含大多数分类器(包括支持向量机)的示例。也许您可以在那里获得一些灵感:http://www.bytefish.de/pdf/machinelearning.pdf。
What etarion said is correct.
To copy a column or row you always have to write:
The following program shows how to perform a PCA in OpenCV. It'll show the mean image and the first three Eigenfaces. The images I used in there are available from http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html:
and if you want to build the matrix by row (like in your original question above) use this instead:
and set the flag in the PCA to:
Regarding machine learning. I wrote a document on machine learning with the OpenCV C++ API that has examples for most of the classifiers, including Support Vector Machines. Maybe you can get some inspiration there: http://www.bytefish.de/pdf/machinelearning.pdf.
这是行不通的。
operator=
是浅拷贝,意味着没有实际复制数据。 可用于:同样也
This will not work.
operator=
is a shallow copy, meaning no data is actually copied. UseThe same also for:
我建议
查看 svn head module/core/test/test_mat.cpp
在线 中新签入的测试: https://code.ros.org/svn/opencv/trunk/opencv/modules/core/test/test_mat.cpp
有 PCA 示例旧的 C 和新的 C++
希望有帮助!
I would suggest looking at the newly checked in tests in svn head
modules/core/test/test_mat.cpp
online here : https://code.ros.org/svn/opencv/trunk/opencv/modules/core/test/test_mat.cpp
has examples for PCA in the old c and new c++
Hope that helps!