在OpenCV中读取YAML文件



我使用OpenCV来保存.yml。这是我使用的代码

FileStorage fs;
fs.open("test", FileStorage::WRITE);
for (unsigned int i = 0; i < (block_hist_size * blocks_per_img.area()) ; i++ )
{
fs << "features" << dest_ptr[i];
}
fs.release();
下面是YAML文件 的输出
%YAML:1.0
features: 1.5302167832851410e-01
features: 1.0552208870649338e-01
features: 1.6659785807132721e-01
features: 2.3539969325065613e-01
features: 2.0810306072235107e-01
features: 1.2627227604389191e-01
features: 8.0759152770042419e-02
features: 6.4930714666843414e-02
features: 6.1364557594060898e-02
features: 2.1614919602870941e-01
features: 1.4714729785919189e-01
features: 1.5476198494434357e-01

有人能帮我读yml文件回到dest_ptr。我只需要浮点值

不能对多个值使用相同的键。在你的例子中,你应该把它存储为特征向量。参见下面的代码

FileStorage fs, fs2;
fs.open("test.yml", FileStorage::WRITE);
fs << "features" << "[";
for (unsigned int i = 0; i < 20; i++) {
    fs << 1.0 / (i + 1);
}
fs << "]";
fs.release();
fs2.open("test.yml", FileStorage::READ);
vector<float> a;
fs2["features"] >> a;

您一定是误读了YAML规范,因为您用代码生成的不是YAML文件。
在YAML文件中,映射键需要是唯一的,根据定义用于泛型映射(并且您正在使用泛型映射,因为您没有指定标记):

Definition:
    Represents an associative container, where each key is unique in the
    association and mapped to exactly one value. YAML places no restrictions on
    the type of keys; in particular, they are not restricted to being  scalars. 
    Example bindings to native types include Perl’s hash, Python’s dictionary,
    and Java’s Hashtable.
真正的问题是,您试图让一个简单的YAML发射器自己执行字符串写入。您应该已经创建了在c++中需要的数据结构并发出该结构,那么YAML将是正确的(假设发射器没有错误)。

根据你选择的文件结构,你可能会得到:

%YAML:1.0
- features: 1.5302167832851410e-01
- features: 1.0552208870649338e-01
- features: 1.6659785807132721e-01
- features: 2.3539969325065613e-01
- features: 2.0810306072235107e-01
- features: 1.2627227604389191e-01
- features: 8.0759152770042419e-02
- features: 6.4930714666843414e-02
- features: 6.1364557594060898e-02
- features: 2.1614919602870941e-01
- features: 1.4714729785919189e-01
- features: 1.5476198494434357e-01

(单键/值映射序列)或:

%YAML:1.0
features: 
- 1.5302167832851410e-01
- 1.0552208870649338e-01
- 1.6659785807132721e-01
- 2.3539969325065613e-01
- 2.0810306072235107e-01
- 1.2627227604389191e-01
- 8.0759152770042419e-02
- 6.4930714666843414e-02
- 6.1364557594060898e-02
- 2.1614919602870941e-01
- 1.4714729785919189e-01
- 1.5476198494434357e-01

(单个键到单个值的映射,该映射是一个序列)

正如您自己所经历的那样,使用字符串写入为比这更简单的数据结构创建正确的YAML是非常重要的。如果您从适当的数据结构开始并发出该结构,那么您还知道可以使用相同的结构将其读入。


根据我的经验,这同样适用于生成XML/HTML/CSV/INI文件,拥有正确的数据结构并使用发射器也可以避免输出格式中的错误,从而补偿初始代码稍微高一些的复杂性。

相关内容

  • 没有找到相关文章

最新更新