gpt4 book ai didi

c++ - 在 FileStorage 中使用路径作为键

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:56 25 4
gpt4 key购买 nike

我正在尝试编写一个文件(json/yaml/xml,格式无关紧要)来存储具有特定 cv::Mat 的文件路径。当我最终意识到 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 结尾错误是相同的:如果尝试在 key 的开头添加一个字母,则会出现此错误:

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

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<<

这是我在尝试向 key 开头添加字母时遇到的错误。

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

最佳答案

我好像遇到过类似的错误。如果我尝试像这样以 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">

一旦我用下划线替换“相机矩阵”中的空格,一切正常。

fs << "camera_matrix" << cameraMatrix;

据我所知here XML 格式对标记名称中可以包含的符号有一些限制。特别是,不允许在名称中使用斜杠。标签中似乎允许使用点,但出于某种原因,OpenCV 拒绝使用包含点的标签。

关于c++ - 在 FileStorage 中使用路径作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43442956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com