我现在很长一段时间都在努力解决这个问题,也许这里有人可能会对错误提出建议。我正在尝试使用libfacerec在这个站点中实现OpenCV中的Eigenfaces: https://github.com/bytefish/libfacerec 我在Visual Studio 2010中使用OpenCV-2.3.1
示例代码使用此站点的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.
}
整个项目构建良好,没有任何错误,但是当我尝试运行崩溃时。我进入调试模式,并认为 vector&lt; Mat&gt;图像和矢量&lt; int&gt;标签(不介意没有它们的空间导致它在这里没有正确显示)仍为0表示没有加载数据。但是,当我打印变量高度和宽度时,两者都显示140(来自orl_faces的所有图像都是140x140像素)
所以我的问题是,出了什么问题?为什么在填充高度和宽度的同时不填充两个向量?
编辑:似乎两个矢量都在我的其他电脑上正确填充(矢量图像[400],矢量标签[400]。但是程序仍然崩溃,运行调试时我发现此错误:
Test.exe中0x77c415de处的未处理异常:0xC0000005:访问冲突写入位置0x00000000。
它位于mat.hpp文件中,当单步执行此文件时,向量v显示以下错误: [size] CXX0030:错误:无法计算表达式 [容量CXX0030:错误:表达式无法评估
答案 0 :(得分:1)
我很确定问题是这个。
您正在链接库:
opencv_core231.lib
opencv_highgui231.lib
opencv_imgproc231.lib
然后使用Visual Studio中的调试配置进行构建。看到问题?如果要执行此操作,请切换到opencv_core231d.lib
库。但是:由于一些神秘的原因,OpenCV2.3.1 superpack没有附带tbb_debug.dll
,因此Debug构建将失败。如果您正在使用superpack并想使用libfacerec,那么在Visual Studio中激活Release Build Configuration,build&amp;跑了,一切都会好起来的。
我已经写了一篇关于它的教程,应该很容易理解:http://www.bytefish.de/blog/opencv_visual_studio_and_libfacerec。滚动到最底部以查看Windows中的Eigenfaces。所以你看,它确实有效。