将相机矩阵写入xml/yaml文件
我正在使用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 个回答
14
使用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>
你需要稍微调整一下代码,以便正确格式化表示数字的字符串。我就不多说了,这个留给你自己去做。