使用OpenCV的FileStorage模块持久化存取数据(Python)

Jun 29,2018   2205 words   8 min


在之前的这篇博客中,提到了使用OpenCV的FileStorage模块来持久化保存数据,但那篇博客介绍的是C++的使用方法。但最近在用Python,所以需要在Python中实现相关功能。但不知道为什么,在网上找了挺久没找到多少介绍Python中FileStorage的使用方法的,C++的倒是一大堆。最后还是自己对照着OpenCV的API文档,自己边试边学学会的。鉴于网上这方面的资料比较少,所以这里就记录一下FileStorage在Python中的API和使用方法。

首先祭出OpenCV关于数据持久化的官方API文档,点击查看,其中与数据读取直接相关,比较重要的是FileNode类的文档,点击查看。这里面介绍了如何读取节点中的数据。而对于创建、读取文件,则属于FileStorage类的内容,点击查看。如果觉得说明文档太长,那么下面直接放示例代码,简单易懂。

1.示例代码

# coding=utf-8
import cv2
import numpy as np

type_dict = {0: 'NONE',
             1: 'INT',
             2: 'FLOAT',
             3: 'STR',
             4: 'REF',
             5: 'SEQ',
             6: 'MAP',
             7: 'TYPE_MASK',
             8: 'FLOW',
             16: 'USER',
             32: 'EMPTY',
             64: 'NAMED'}

# ------------------------Write------------------------
# 创建FileStorage对象,参数为WRITE,用于写入
fs = cv2.FileStorage("config.yml", cv2.FILE_STORAGE_WRITE)

# 开始写入数据内容,支持浮点数、字符串和矩阵类型
fs.write('realNode', 900)
fs.write('strNode', 'test text')
fs.write('mapNode', np.array([[1, 2, 3],
                              [4, 5, 6]]))

# 写入完成后,释放对象
fs.release()
# ------------------------Write------------------------


# -------------------------Read-------------------------
# 创建FileStorage对象,参数为READ,用于读取
fs = cv2.FileStorage("config.yml", cv2.FILE_STORAGE_READ)

# 调用getNode函数获取节点,按节点名称获取
realNode = fs.getNode("realNode")
strNode = fs.getNode('strNode')
mapNode = fs.getNode('mapNode')

# 对于不同类型的节点用不同的函数进行读取
# 对实数类型节点用real()函数读取
realNodeValue = realNode.real()
# 对字符串型节点用string()函数读取
strNodeValue = strNode.string()
# 对矩阵型节点用mat()函数读取
mapNodeValue = mapNode.mat()

print(realNodeValue)
print(strNodeValue)
print(mapNodeValue)
print('read success\n')
# -------------------------Read-------------------------


# -------------------------Other functions-------------------------
# 除此之外,FileNode类型还有其它函数可以使用
# name()函数可以获取当前节点名称
realNodeName = realNode.name()
# type()函数可以获取当前节点数据类型
realNodeType = realNode.type()
# empty()函数可以判断当前节点是否为空
isEmpty = realNode.empty()
# isMap() isReal() isString()等函数用于判断当前节点数据是否为指定类型
isMap = realNode.isMap()
# size()用于返回节点中元素个数
num = realNode.size()
print('NodeName:' + realNodeName)
print('Type:' + type_dict[realNodeType])
print('Value:' + realNodeValue.__str__())
print('isEmpty:' + isEmpty.__str__())
print('isMap:' + isMap.__str__())
print('ElementSize:' + num.__str__())
# -------------------------Other functions-------------------------

上述代码便实现了数据的存储与读取,生成的yml文件内容如下。 而通过读取在控制台中打印出的信息如下。 同时通过修改保存文件的后缀名即可修改保存类型,如下是xml类型文件。 可以发现,相比于yml,xml在可读性上要差一些。

以上便是在Python中使用FileStorage模块进行数据读写的内容,比较简单。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部