c++ - OpenCV:带有 CSV 文件的特征脸

标签 c++ opencv csv face-recognition

我现在已经为这个问题苦苦挣扎了一段时间,也许这里有人可能会提出问题所在的建议。我正在尝试使用 libfacerec 从此站点在 OpenCV 中实现特征脸: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 > imagesvector< int > labels(不要介意空格,因为没有它们它无法正确显示这里)仍然是 0,这意味着没有数据被加载。但是,当我打印变量高度和宽度时,它们都显示为 140(来自 orl_faces 的所有图像均为 140x140 像素)

所以我的问题是,出了什么问题?为什么在填充高度和宽度的同时不填充两个 vector ?

编辑: 在我的另一台电脑上似乎两个 vector 都正确填充( vector 图像 [400], vector 标签 [400]。但是程序仍然崩溃,运行调试时我发现这个错误:

Test.exe 中 0x77c415de 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000000。

它位于 mat.hpp 文件中,当单步执行此文件时, vector v 会显示以下错误: [大小] CXX0030:错误:无法计算表达式 [容量CXX0030:错误:无法计算表达式

最佳答案

我很确定是这个问题。

您正在链接库:

opencv_core231.lib
opencv_highgui231.lib
opencv_imgproc231.lib

然后使用 Visual Studio 中的调试配置进行构建。看到问题了吗?如果您想执行此操作,请切换到 opencv_core231d.lib 库。但是:由于某些神秘原因,OpenCV2.3.1 super 包没有随附 tbb_debug.dll,因此调试构建将失败。如果您正在使用 superpack 并想使用 libfacerec,那么请在 Visual Studio 中激活 Release Build Configuration,构建并运行,一切都会正常进行。

我已经写了一个教程,应该很容易理解:http://www.bytefish.de/blog/opencv_visual_studio_and_libfacerec .滚动到最底部以查看 Windows 中的特征脸。所以你看,它确实有效。

关于c++ - OpenCV:带有 CSV 文件的特征脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10204739/

相关文章:

c++ - Qt Creator 中与第 3 方库的链接错误

c++ - 修改哈希函数

python - OpenCV中这个 'inverse map'函数有什么不准确之处?

python - time.sleep在无限while循环内仅一部分代码

c++ - 如何在双变量中检查 inf(和 | 或)NaN

c++ - 导致链接器问题的 OpenGL 扩展

c++ - 如何通过LeNet使用opencv_dnn模块进行数字分类?

csv - 将制表符分隔符转换为分号

通过 awk 插入 CSV 列

python - Django 中的异步文件写入功能是否需要 Celery?