2010-04-12 14 views
13

Las antiguas matrices cvMat de estilo C se pueden pasar a la función cvSave() para escribir fácilmente en un archivo XML. La nueva función no acepta las nuevas matrices de estilo C++ cv::Mat y cv::Mat_.¿Cómo puedo guardar y leer desde XML los nuevos objetos de matriz de estilo de C++ en OpenCV?

La referencia de OpenCV tiene una sección de persistencia XML, pero las tres clases (FileStorage, FileNode y FileNodeIterator) carecen de descripción o ejemplo y no puedo encontrar la manera de usarlas desde la interfaz.

Gracias.

EDITAR: En realidad, esto se refiere a una gran cantidad de otra funcionalidad en la nueva interfaz C++ de OpenCV, como de Version 2.1. La documentación es muy pobre en algunos lugares, los argumentos de la función son inconsistentes, y el grupo de usuarios no tiene ni idea, o tiene mejores cosas que hacer que responder preguntas. Voy a mantener la vieja interfaz C por un tiempo. Los documentos son mucho mejores, sin mencionar el libro de O'Reilly.

Respuesta

15

Aparentemente es más fácil en el estilo C++, pero como dijiste no hay documentación disponible fácilmente.

Para escribir cv::Mat en un archivo, solo cree una variable FileStorage y luego escriba la matriz en el estilo que usa cout para imprimir en pantalla.

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; 

lectura también es similar al estilo de cin, pero es mejor que echar un vistazo al siguiente enlace para tener una mejor comprensión. En la segunda página de la sección E/S de datos, han mostrado ejemplos sobre cómo usar XML/YAML.

opencv C++ cheatsheet(different than cheatsheet in the documentation PDF)

9

Lo anterior es correcta, pero lo que el cheatsheet no muestra es que es necesario abrir el archivo. Esto puede parecer obvio, pero me olvidé de hacerlo porque la hoja de trucos no decía que tenía que hacerlo. aquí está el código que le permitirá escribir en los archivos correctamente

código ----------:

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

No importa, esto todavía no funciona. perdón por la publicación desperdiciada.

+0

sí ... Estaba totalmente equivocado cuando publiqué esto antes. la línea FileStorage fs ("CamModel.yml", FileStorage :: WRITE); abre el archivo Mi problema era que el nombre del archivo que intentaba abrir no se podía abrir debido a una cadena de caracteres que se adjuntaba al principio de mi nombre de archivo. las instrucciones dadas en el cheetsheet son por supuesto correctas. – NotNamedDwayne

+0

Al realizar cualquier tipo de operaciones de archivos, creo que deberíamos usar un cheque como fs.isOpened(). Es por eso que me gusta tu código. –

Cuestiones relacionadas