-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkalibr-to-calibration.py
79 lines (66 loc) · 2.59 KB
/
kalibr-to-calibration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/python
import argparse
import os
import yaml
import json
parser = argparse.ArgumentParser()
parser.add_argument("yamlFile", help="Folder containing JSONL and video file")
parser.add_argument("-output", help="Output folder, if not current directory")
parser.add_argument("--imu_to_camera_matrix", default=None,
help='Optional IMU-to-camera matrix (for cam0), for example: [[1,0,0,0.1],[0,1,0,0.2],[0,0,1,0.3],[0,0,0,1]]')
args = parser.parse_args()
def parseCamera(results, imuToCam0=None):
# see https://github.com/ethz-asl/kalibr/wiki/supported-models
# and https://spectacularai.github.io/docs/pdf/calibration_manual.pdf
coeffs = results["distortion_coeffs"]
model = results['distortion_model']
if model == 'equidistant':
assert(len(coeffs) == 4)
distortionModel = 'kannala-brandt4'
elif model == 'radtan':
k1, k2, p1, p2 = coeffs
coeffs = [k1, k2, p1, p2, 0, 0, 0, 0]
distortionModel = 'brown-conrady'
else:
raise RuntimeError('unsupported model %s' % model)
if 'T_cam_imu' in results:
imuToCam = results['T_cam_imu']
else:
assert(imuToCam0 is not None)
if 'T_cn_cnm1' in results:
import numpy as np
T = results['T_cn_cnm1']
imuToCam = np.dot(T, imuToCam0).tolist()
else:
imuToCam = imuToCam0
return {
"imuToCamera": imuToCam,
"imageWidth": results["resolution"][0],
"imageHeight": results["resolution"][1],
"distortionCoefficients": coeffs,
"focalLengthX": results["intrinsics"][0],
"focalLengthY": results["intrinsics"][1],
"model": distortionModel,
"principalPointX": results["intrinsics"][2],
"principalPointY": results["intrinsics"][3]
}
def main(args):
outputFolder = args.output if args.output else "."
os.makedirs(outputFolder, exist_ok=True)
outputDict = {
"cameras": []
}
with open(args.yamlFile) as f:
calibrationResults = yaml.load(f, Loader=yaml.FullLoader)
imuToCam = args.imu_to_camera_matrix
if imuToCam is not None:
imuToCam = json.loads(imuToCam)
outputDict["cameras"].append(parseCamera(calibrationResults["cam0"], imuToCam))
if calibrationResults.get("cam1"):
outputDict["cameras"].append(parseCamera(calibrationResults["cam1"], imuToCam))
with open(outputFolder + "/calibration.json", "w") as f:
outputString = json.dumps(outputDict, sort_keys=True, indent=4)
print(outputString)
f.write(outputString)
if __name__ == "__main__":
main(args)