Исключение ошибки разбора OpenCV 3.4.3 throwing (-212) (icvXMLParseTag) - PullRequest
0 голосов
/ 28 октября 2018

Я скомпилировал OpenCV v3.4.3 с некоторыми пользовательскими аргументами; статическое связывание, драйвер 1394 не включен и сборка выпуска, см. ниже:

cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=OFF -D WITH_1394=OFF -D CMAKE_INSTALL_PREFIX=/usr/local ..

У меня есть специальная программа для компиляции каскадных файлов haar в заголовочный файл, это для переносимости файлов, поскольку у меня не может быть никаких файлов активов, и все должно быть объединено в один двоичный файл, ниже будет создан заголовочный файл:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char **argv) {
    string fn = "haarcascade_frontalface_alt.xml";
    ifstream in(fn.c_str());
    string all,line;
    while (getline(in,line))
        all += line + "\n";

    ofstream out("opencv_data.h");
    out << "const char xml[] = {";
    for (size_t i=0; i<all.length(); i++) {
        if (i%16==0) out << "\n";
        out << int(all[i]) << ", ";
    }
    out << "10};\n";
    return 0;
}

Я использую FileStorage (FileStorage :: READ | FileStorage :: MEMORY) для чтения готового байтового массива заголовков в OpenCV, см. Неполный пример ниже:

#include "opencv_data.h"
CascadeClassifier face_cascade;
FileStorage fs(xml, FileStorage::READ | FileStorage::MEMORY);
face_cascade.read(fs.getFirstTopLevelNode()

Это отлично работает при компиляции на macOS 10.13.6 с использованием libc ++, проблема заключается в том, что при компиляции в Linux стандартная машина Debian 9.4 компилируется с использованием g ++ и статического связывания (-static-libstdc ++) - двоичный файл выдаст ошибку синтаксического анализа XML , см. ниже:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.3) /root/opencv-3.4.3/modules/core/src/persistence_xml.cpp:474: error: (-212:Parsing error) icvXMLParseTag in function '(null)(24352): Tag should start with '<''

Aborted

Сборка Debian 9.4 работает нормально, если я вручную извлекаю каскадный файл в программу во время выполнения (включаю его в качестве внешнего ресурса и загружаю как XML-файл), но не работает должным образом при загрузке через память (через байтовый массив заголовка) )

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...