我在这个问题上苦苦挣扎了很长一段时间,也许这里的某个人可能会对出了什么问题提出建议。我正在尝试使用 libfacerec 从该站点在 OpenCV 中实现 Eigenfaces:https ://github.com/bytefish/libfacerec我正在将 OpenCV-2.3.1 与 Visual Studio 2010 一起使用
示例代码使用来自此站点的 orl_faces 数据集:http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html并使用 csv 文件加载这些图像。在此文件中,列出了所有 400 张图像(40 个不同人的 10 张图像)的所有路径,并为每个人附加了一个标签。两个条目由“ ; ”分隔。我在下面添加了这个 csv 文件的几行:
C:/Users/PIMMES/Documents/libraries/orl_faces/s1/1.pgm;0
C:/Users/PIMMES/Documents/libraries/orl_faces/s1/2.pgm;0
...
C:/Users/PIMMES/Documents/libraries/orl_faces/s2/1.pgm;1
C:/Users/PIMMES/Documents/libraries/orl_faces/s2/2.pgm;1
...
etc
我在下面添加了一段代码,它应该加载图像数据。这与 libfacerec 网站 /src 文件夹中的 main.cpp 文件中列出的代码完全相同:
void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';')
{
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) throw std::exception();
string line, path, classlabel;
while (getline(file, line))
{
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
int main(int argc, const char *argv[])
{
// check for command line arguments
if(argc != 2)
{
cout << "usage: " << argv[0] << " <csv.ext>" << endl;
exit(1);
}
// path to your CSV
string fn_csv = string(argv[1]);
// images and corresponding labels
vector<Mat> images;
vector<int> labels;
// read in the data
try
{
read_csv(fn_csv, images, labels);
}
catch (exception& e)
{
cerr << "Error opening file \"" << fn_csv << "\"." << endl;
exit(1);
}
// get width and height
int width = images[0].cols;
int height = images[0].rows;
// get test instances
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
...
etc.
}
整个项目构建良好,没有任何错误,但是当我尝试运行时发生崩溃。我进入 Debug 模式并发现vector< Mat > 图像和vector< int > 标签(不要介意空格,因为没有它们,它不会在此处正确显示)仍然为 0,这意味着没有加载数据。但是,当我打印变量高度和宽度时,两者都显示为 140(来自 orl_faces 的所有图像都是 140x140 像素)
所以我的问题是,出了什么问题?为什么在填充高度和宽度时两个向量都没有填充?
编辑:似乎两个向量都在我的另一台电脑上正确填充(矢量图像 [400],矢量标签 [400]。但是程序仍然崩溃并且在运行调试时我发现此错误:
Test.exe 中 0x77c415de 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。
它位于 mat.hpp 文件中,当单步执行该文件时,向量 v 显示以下错误:[size] CXX0030:错误:无法评估表达式 [容量 CXX0030:错误:无法评估表达式