Ошибка сегментации OpenSV 4.2.0 FileStorage - PullRequest
2 голосов
/ 06 февраля 2020

[Это репост этого вопроса на форумах вопросов и ответов OpenCV.]

Привет! У меня большая проблема с FileStorage API с этим YML-файлом (pastebin) (и любым другим YML, который я добавляю в OpenCV). По сути, всякий раз, когда я пытаюсь получить доступ к информации о любом FileNode, программа segfaults.

Сначала я думал, что это из-за моей собственной сборки OpenCV на macOS, но после попытки с предварительно собранным OpenCV 4.2.0 Windows двоичные файлы, проблема сохраняется.

Возиться в LLDB Я понял, что cra sh происходит в

cv::FileStorage::Impl::getNodePtr(unsigned long, unsigned long)

Соответствующий код Сегмент:

cv::FileStorage fs;
try{
    fs = cv::FileStorage("someFile.yml", cv::FileStorage::READ);
}catch(cv::Exception ex)
{
    return 1;
}

cv::FileNode node = fs.root();

std::cout << "Got root node" << std::endl;
std::cout << "Root node is type: " << node.type() << std::endl; //Crash here

Я действительно в растерянности ... любая помощь приветствуется.

РЕДАКТИРОВАТЬ 1

На OpenCV на форумах кто-то обнаружил, что инициализация fs в блоке try/catch вызвала проблему. Инициализация вне его, как в cv::FileStorage fs = cv::FileStorage("someFile.yml", cv::FileStorage::READ);, решает проблему. Я до сих пор понятия не имею, почему это происходит ...

1 Ответ

1 голос
/ 06 февраля 2020

Как написано в ответе на вопросы и ответы OpenCV, эту проблему можно обойти следующим образом:

cv::FileStorage fs;
try{
    fs.open("someFile.yml", cv::FileStorage::READ);
}catch(cv::Exception ex)
{
    return 1;
}

//Do stuff with fs

Я не разбираюсь в экспертных вещах c ++ (конструкторы копирования и прочее), но, возможно, в моей проблеме что-то было делать с этим ...

...