Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

import cv2 

import os 

import numpy as np 

import xml.etree.ElementTree as ET 

 

 

def load(filename, key): 

cv_file = cv2.FileStorage(filename, cv2.FILE_STORAGE_READ) 

matrix = cv_file.getNode(key).mat() 

cv_file.release() 

return matrix 

 

 

def save(filename, key, data, overwrite=False): 

if os.path.exists(filename) and (overwrite is False): 

cv_file = cv2.FileStorage(filename, cv2.FILE_STORAGE_APPEND) 

else: 

cv_file = cv2.FileStorage(filename, cv2.FILE_STORAGE_WRITE) 

cv_file.write(key, data) 

cv_file.release() 

 

 

def intrinsic_matrix(filename, key="intrinsic_matrix"): 

return load(filename, key) 

 

 

def distortion(filename, key="distortion"): 

return load(filename, key) 

 

 

def cameras_intrinsic_calibration(filenames): 

"""Load the intrinsic calibration from files 

 

:param filenames:dictionary of filenames, here the key is the camera name 

:returns: a dictionary containing instrinsic_matrix and distortions 

:rtype: dict 

 

""" 

 

cameras_intrinsics = dict() 

for cam_i, cfile in filenames.items(): 

cameras_intrinsics[cam_i] = dict() 

cameras_intrinsics[cam_i]['intrinsic_matrix'] = intrinsic_matrix(cfile) 

cameras_intrinsics[cam_i]['distortion'] = distortion(cfile) 

return cameras_intrinsics 

 

 

def load_cameras_calibration(filename): 

"""Load the intrinsic and intrinsic calibration from file 

 

:param filenames:calibration filename 

:returns: a dictionary containing intrinsic and extrinsic calib 

:rtype: dict 

 

""" 

tree = ET.parse(filename) 

root = tree.getroot() 

 

ncameras_key = 'ncameras' 

ncameras = 0 

for ncameras_node in root.iter(ncameras_key): 

ncameras = np.round(float(ncameras_node.text)).astype(int) 

break 

if ncameras == 0: 

raise ValueError('ncameras is missing in xml file') 

 

cameras_calib = dict() 

for cam_i in range(ncameras): 

cameras_calib[cam_i] = dict() 

for key in ['intrinsic_matrix', 'pose', 'distortion']: 

cameras_calib[cam_i][key] = load(filename, 

key + '_{}'.format(cam_i)) 

return cameras_calib 

 

 

def save_cameras_calibration(cameras_intrinsics, cameras_extrinsics, 

filename, overwrite=False): 

"""Save the intrinsic and intrinsic calibration 

""" 

ncameras_key = 'ncameras' 

ncameras = len(cameras_intrinsics) 

if len(cameras_extrinsics) != ncameras: 

raise KeyError( 

'Number of cameras differ between intrinsics, and extrinsics') 

 

save(filename, ncameras_key, ncameras, overwrite) 

 

for cam_i in range(ncameras): 

for key in ['pose']: 

data = cameras_extrinsics[cam_i][key] 

save(filename, key + '_{}'.format(cam_i), data) 

for key in ['intrinsic_matrix', 'distortion']: 

data = cameras_intrinsics[cam_i][key] 

save(filename, key + '_{}'.format(cam_i), data)