将相机矩阵写入xml/yaml文件

 Angkaka 发布于 2023-01-18 10:40

我正在使用opencv和python我已经校准了具有以下参数的相机:

camera_matrix=[[ 532.80990646 ,0.0,342.49522219],[0.0,532.93344713,233.88792491],[0.0,0.0,1.0]] 
dist_coeff = [-2.81325798e-01,2.91150014e-02,1.21234399e-03,-1.40823665e-04,1.54861424e-01]

我在python中工作.我编写了以下代码将上述内容保存到文件中,但文件就像一个普通的文本文件.

f = open("../calibration_camera.xml","w")
f.write('Camera Matrix:\n'+str(camera_matrix))
f.write('\n')
f.write('Distortion Coefficients:\n'+str(dist_coefs))
f.write('\n')
f.close()

如何使用python命令将此数据保存到xml/yaml文件中,从而获得所需的输出.请帮助.提前致谢

1 个回答
  • 使用JSON

    在您的情况下,JSON似乎是最简单的序列化格式

    camera_matrix=[[ 532.80990646 ,0.0,342.49522219],[0.0,532.93344713,233.88792491],[0.0,0.0,1.0]]
    dist_coeff = [-2.81325798e-01,2.91150014e-02,1.21234399e-03,-1.40823665e-04,1.54861424e-01]
    data = {"camera_matrix": camera_matrix, "dist_coeff": dist_coeff}
    fname = "data.json"
    import json
    with open(fname, "w") as f:
        json.dump(data, f)
    

    data.json:

    {"dist_coeff": [-0.281325798, 0.0291150014, 0.00121234399, -0.000140823665, 0.154861424], "camera_matrix": [[532.80990646, 0.0, 342.49522219], [0.0, 532.93344713, 233.88792491], [0.0, 0.0, 1.0]]}
    

    使用YAML

    如果您希望人工编辑内容,YAML是最佳选择

    json模块不同,yaml它不是Python的一部分,必须先安装:

    $ pip install pyyaml

    这里是保存数据的代码:

    fname = "data.yaml"
    import yaml
    with open(fname, "w") as f:
        yaml.dump(data, f)
    

    data.yaml:

    camera_matrix:
    - [532.80990646, 0.0, 342.49522219]
    - [0.0, 532.93344713, 233.88792491]
    - [0.0, 0.0, 1.0]
    dist_coeff: [-0.281325798, 0.0291150014, 0.00121234399, -0.000140823665, 0.154861424]
    

    使用XML

    我的例子是使用我最喜欢的lxml包,也可以使用其他XML包.

    from lxml import etree
    from lxml.builder import E
    
    camera_matrix=[[ 532.80990646 ,0.0,342.49522219],[0.0,532.93344713,233.88792491],[0.0,0.0,1.0]]
    dist_coeff = [-2.81325798e-01,2.91150014e-02,1.21234399e-03,-1.40823665e-04,1.54861424e-01]
    
    def triada(itm):
        a, b, c = itm
        return E.Triada(a = str(a), b = str(b), c = str(c))
    
    camera_matrix_xml = E.CameraMatrix(*map(triada, camera_matrix))
    dist_coeff_xml = E.DistCoef(*map(E.Coef, map(str, dist_coeff)))
    
    
    xmldoc = E.CameraData(camera_matrix_xml, dist_coeff_xml)
    
    fname = "data.xml"
    with open(fname, "w") as f:
        f.write(etree.tostring(xmldoc, pretty_print=True))
    

    data.xml中:

    <CameraData>
      <CameraMatrix>
        <Triada a="532.80990646" c="342.49522219" b="0.0"/>
        <Triada a="0.0" c="233.88792491" b="532.93344713"/>
        <Triada a="0.0" c="1.0" b="0.0"/>
      </CameraMatrix>
      <DistCoef>
        <Coef>-0.281325798</Coef>
        <Coef>0.0291150014</Coef>
        <Coef>0.00121234399</Coef>
        <Coef>-0.000140823665</Coef>
        <Coef>0.154861424</Coef>
      </DistCoef>
    </CameraData>
    

    您应该使用代码进行一些操作,以便以适当的精度格式化表示数字的字符串.我留给你了.

    2023-01-18 10:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有