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

时间:2014-04-30 20:37:28

标签: python opencv

我正在使用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 个答案:

答案 0 :(得分:8)

使用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>

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