FileStorage for OpenCV Python API

后端 未结 6 1052
面向向阳花
面向向阳花 2020-12-08 15:54

I\'m currently using FileStorage class for storing matrices XML/YAML using OpenCV C++ API.

However, I have to writ

6条回答
  •  星月不相逢
    2020-12-08 16:09

    I wrote a small snippet to read and write FileStorage-compatible YAMLs in Python:

    # A yaml constructor is for loading from a yaml node.
    # This is taken from @misha 's answer: http://stackoverflow.com/a/15942429
    def opencv_matrix_constructor(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_constructor)
    
    # A yaml representer is for dumping structs into a yaml node.
    # So for an opencv_matrix type (to be compatible with c++'s FileStorage) we save the rows, cols, type and flattened-data
    def opencv_matrix_representer(dumper, mat):
        mapping = {'rows': mat.shape[0], 'cols': mat.shape[1], 'dt': 'd', 'data': mat.reshape(-1).tolist()}
        return dumper.represent_mapping(u"tag:yaml.org,2002:opencv-matrix", mapping)
    yaml.add_representer(np.ndarray, opencv_matrix_representer)
    
    #examples 
    
    with open('output.yaml', 'w') as f:
        yaml.dump({"a matrix": np.zeros((10,10)), "another_one": np.zeros((2,4))}, f)
    
    with open('output.yaml', 'r') as f:
        print yaml.load(f)
    

提交回复
热议问题