在FileStorage中使用path作为键

时间:2017-04-16 22:48:44

标签: c++ opencv opencv3.0

我正在尝试编写一个存储具有特定cv::Mat的文件路径的文件(json / yaml / xml,格式无关紧要)。当我最终意识到here时,组合键不允许路径(例如/ home / user)。

void
persist_histograms(const QString& filepath, const QHash<QString, Mat>& histograms)
{
    cv::FileStorage storage(filepath.toStdString(), cv::FileStorage::WRITE);

    QHashIterator<QString, Mat> it(histograms);

    while (it.hasNext()) {
        it.next();
        storage << it.key().toStdString() << it.value();
    }
}

这是cv::FileStorage班级的真正限制吗?或者有办法解决它吗?

最终结果应该是:

{
    "/my/path/to/file.png": "<my cv::Mat serialization here>",
    "/my/path/to/another/file.png": "<my cv::Mat serialization here>",
    ...
}

观察

错误的发生与格式无关。如果我通过filepath那个 以yaml / json / xml结尾,错误是相同的: 如果尝试在键的开头添加一个字母,则会出现错误:

这是我在尝试上述代码时遇到的错误:

OpenCV Error: Unspecified error (Incorrect element name /home/user/dtd/images/freckled/freckled_0055.jpg) in operator<<, file /build/opencv/src/opencv-3.2.0/modules/core/src/persistence.cpp, line 6877
terminate called after throwing an instance of 'cv::Exception'
what():  /build/opencv/src/opencv 3.2.0/modules/core/src/persistence.cpp:6877: error: (-2) Incorrect element name /home/user/dtd/images/freckled/freckled_0055.jpg in function operator<<

如果我尝试在密钥的开头添加一个字母,这就是我得到的错误。

OpenCV Error: Bad argument (Key names may only contain alphanumeric characters [a-zA-Z0-9], '-', '_' and ' ') in icvJSONWrite, file /build/opencv/src/opencv-3.2.0/modules/core/src/persistence.cpp, line 3896

1 个答案:

答案 0 :(得分:1)

似乎我遇到了类似的错误。如果我尝试像这样myTable"some_alias格式存储矩阵

YAML

一切正常。但是,一旦我将文件格式从std::string fName("/path/to/cameraParams.yml"); cv::FileStorage fs(fName, cv::FileStorage::WRITE); fs << "camera matrix" << cameraMatrix; 更改为YAML

XML

我遇到错误

std::string fName("/path/to/cameraParams.xml");

正如我已经意识到的那样,原因是terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.0.0-pre) /home/shura/software.downloads/libraries/opencv/opencv/modules/core/src/persistence_xml.cpp:83: error: (-5:Bad argument) Key name may only contain alphanumeric characters [a-zA-Z0-9], '-' and '_' in function 'writeTag' 格式不允许标签中包含空格,而XML允许格式中包含空格。因此,对于YAML,以下文件是完全有效的

YAML

%YAML:1.0 --- camera matrix: !!opencv-matrix 期间不允许这样

XML

只要我用下划线替换“相机矩阵”中的空格,一切就可以正常工作。

<?xml version="1.0"?>
<opencv_storage>
<camera matrix type_id="opencv-matrix">

我发现here fs << "camera_matrix" << cameraMatrix; 格式对标签名称中可以包含的符号有一些限制。特别是,名称中不允许使用斜杠。标签中似乎允许使用点,但是由于某些原因,OpenCV拒绝使用包含点的标签。