我正在尝试解决与OpenCV FileStorage相关的问题。 我可以成功地写入和读取yml / xml文件。 这只适用于写入和读取功能在同一程序中的情况。
当我在一个程序中成功创建并编写yml文件并尝试从另一个程序访问该文件时,我遇到了以下问题。
写作部分:
d_img = imread(filename, 1);
FileStorage fs_source("tmp.yaml", FileStorage::WRITE);
if (fs_source.isOpened()){
fs_source << "source" << d_img;
fs_source.releaseAndGetString();
cout<<"Source : image written to temporary file"<<endl;
}
else
{
fs_source.open("tmp.yaml", FileStorage::WRITE);
fs_source << "source" << d_img;
fs_source.releaseAndGetString();
cout<<"Source : image written to temporary file 2"<<endl;
}
阅读部分:
FileStorage fs_sink("tmp.yaml", FileStorage::READ);
if (fs_sink.isOpened()){
fs_sink["source"] >> d_img;
fs_sink.releaseAndGetString();
cout<<"Sink : image read from file 1"<<endl;
}
else
{
fs_sink.open("tmp.yaml", FileStorage::READ);
fs_sink["source"] >> d_img;
fs_sink.releaseAndGetString();
cout<<"Sink : image read from file 2"<<endl;
}
imwrite( "output.jpg", d_img );
第一个代码创建yml文件没有任何问题。
但是当第一行FileStorage fs_sink("tmp.yaml", FileStorage::READ);
OpenCV Error: Parsing error (tmp.yaml(0): Valid XML should start with '<?xml ...?>') in icvXMLParse, file /var/tmp/portage/media-libs/opencv-2.4.7/work/opencv-2.4.7/modules/core/src/persistence.cpp, line 2257
thread[thread-per-block[1]: <block image_sink (2)>]: /var/tmp/portage/media-libs/opencv-2.4.7/work/opencv-2.4.7/modules/core/src/persistence.cpp:2257: error: (-212) tmp.yaml(0): Valid XML should start with '<?xml ...?>' in function icvXMLParse
这很奇怪,因为文件是yml,而不是xml。当我将文件类型更改为xml时,它仍然会出现相同的错误。
什么可能导致此错误?
PS:尝试关闭文件的releaseAndGetString();
和release();
方法。结果相同。
<{1}},xml
和yml
扩展也都在尝试过。
编辑:如果文件为空,则可以复制。