Как сохранить и прочитать из 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, это все еще не работает. извините за потраченную почту.