Как я могу сохранить и прочитать из XML новые объекты матрицы в стиле C ++ в OpenCV? - PullRequest
13 голосов
/ 12 апреля 2010

Старые матрицы cvMat в стиле C можно было передать в функцию cvSave () для простой записи в файл XML. Новые матрицы cv::Mat и cv::Mat_ в стиле C ++ не принимаются этой функцией.

Ссылка OpenCV содержит раздел о постоянстве XML, но в трех классах (FileStorage, FileNode и FileNodeIterator) отсутствует описание или пример, и я не могу понять, как их использовать из интерфейса.

Спасибо.

EDIT : На самом деле это касается множества других функций в новом C ++ интерфейсе OpenCV , начиная с Версия 2.1 . Документация местами очень скудная, аргументы функций противоречивы, и у группы пользователей либо нет идей, либо есть дела поважнее, чем ответы на вопросы. Я собираюсь некоторое время придерживаться старого интерфейса C . Документы намного лучше, не говоря уже о книге О'Рейли.

Ответы [ 2 ]

15 голосов
/ 11 июля 2010

Очевидно, что это проще в стиле C ++, но, как вы сказали, нет легко доступной документации.

Для записи cv::Mat в файл просто создайте переменную FileStorage и затем напишите матрицу в стиле, который вы используете cout для печати на экране.

cv::Mat someMatrix;
//you create and assign values to someMatrix however you plan to.
FileStorage fs("myFile.yml", FileStorage::WRITE);
fs << "name_to_identify_matrix_by" << someMatrix;

Чтение также похоже на стиль cin, но лучше взглянуть на ссылку ниже, чтобы лучше понять. На 2-й странице в разделе «Ввод / вывод данных» они показали примеры использования XML / YAML.

шпаргалка opencv C ++ (отличается от шпаргалки в документации PDF)

9 голосов
/ 22 июля 2010

Вышеприведенное верно, но в таблице не указано, что вам нужно открыть файл. Это может показаться очевидным, но я забыл сделать это, потому что на листе не сказано, что я должен был это сделать. вот код, который позволит вам правильно писать в файлы

---------- код:

// write Mat objects to the freakin file
FileStorage fs("CamModel.yml", FileStorage::WRITE);
if (!fs.isOpened()){
 fs.open("CamModel.yml", FileStorage::WRITE);
 fs << "mtxCam" << cameraMatrix;
 fs << "mtxDist" << distCoeffs;
 fs.release();
}

// to test that it really worked, read the Mats back in
if (!fs.isOpened()){
 fs.open("CamModel.yml", FileStorage::READ);
 fs["mtxCam"] >> cameraMatrix;
 fs["mtxDist"] >> distCoeffs;
 fs.release();
}

Неважно, это все еще не работает. извините за потраченный впустую пост.

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