Как сохранить и прочитать из XML новые объекты матрицы стиля С++ в OpenCV?

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

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

Спасибо.

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

Ответ 1

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

Чтобы записать 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, но лучше, если вы посмотрите на ссылку ниже, чтобы лучше понять. На второй странице в разделе Data I/O они показали примеры использования XML/YAML.

opencv С++ cheatsheet (отличается от cheatsheet в документации PDF)

Ответ 2

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

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

// 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();
}

Nevermind, это все еще не работает. извините за потраченную почту.