FileStorage for OpenCV Python API

gar*_*rak 20 c++ python opencv image-processing

我目前正在使用FileStorage类来使用OpenCV C++ API 存储矩阵XML/YAML.

但是,我必须编写一个读取这些XML/YAML文件的Python脚本.

我正在寻找可以读取OpenCV C++ API生成的XML/YAML文件的现有OpenCV Python API

mpe*_*kov 21

您可以使用PyYAML来解析YAML文件.

由于PyYAML不了解OpenCV数据类型,因此您需要为要加载的每个OpenCV数据类型指定构造函数.例如:

import yaml
def opencv_matrix(loader, node):
    mapping = loader.construct_mapping(node, deep=True)
    mat = np.array(mapping["data"])
    mat.resize(mapping["rows"], mapping["cols"])
    return mat
yaml.add_constructor(u"tag:yaml.org,2002:opencv-matrix", opencv_matrix)
Run Code Online (Sandbox Code Playgroud)

完成后,加载yaml文件很简单:

with open(file_name) as fin:
    result = yaml.load(fin.read())
Run Code Online (Sandbox Code Playgroud)

结果将是一个dict,其中键是您在YAML中保存的任何名称.


Vis*_*hal 8

除了@ misha的回复之外,OpenCV YAML与Python有些不兼容.

不兼容的几个原因是:

  1. 由OpenCV创建的Yaml在":"之后没有空格.而Python需要它.[例如:应该是a: 2,而不是a:2Python]
  2. OpenCV创建的第一行YAML文件是错误的.将"%YAML:1.0"转换为"%YAML 1.0".或者在阅读时跳过第一行.

以下功能负责提供:

import yaml
import re
def readYAMLFile(fileName):
    ret = {}
    skip_lines=1    # Skip the first line which says "%YAML:1.0". Or replace it with "%YAML 1.0"
    with open(scoreFileName) as fin:
        for i in range(skip_lines):
            fin.readline()
        yamlFileOut = fin.read()
        myRe = re.compile(r":([^ ])")   # Add space after ":", if it doesn't exist. Python yaml requirement
        yamlFileOut = myRe.sub(r': \1', yamlFileOut)
        ret = yaml.load(yamlFileOut)
    return ret

outDict = readYAMLFile("file.yaml")
Run Code Online (Sandbox Code Playgroud)

注意:以上回复仅适用于yaml's.XML有各自的问题,我还没有完全探讨过.


Tim*_*mSC 6

使用OpenCV 3.2中提供的FileStorage函数,我成功地使用了它:

import cv2
fs = cv2.FileStorage("calibration.xml", cv2.FILE_STORAGE_READ)
fn = fs.getNode("Camera_Matrix")
print (fn.mat())
Run Code Online (Sandbox Code Playgroud)

  • 您知道如何获取所有可用节点的列表吗? (2认同)