comparison python/metadata.py @ 861:f9c9457b60c2

modification of storage of intrinsic camera and distortion parameters
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 04 Nov 2016 11:47:42 -0400
parents 37d14818db89
children 2d6249fe905a
comparison
equal deleted inserted replaced
860:07c5eab11eba 861:f9c9457b60c2
2 2
3 from datetime import datetime, timedelta 3 from datetime import datetime, timedelta
4 from os import path 4 from os import path
5 from math import floor 5 from math import floor
6 6
7 from numpy import zeros 7 from numpy import zeros, loadtxt, array
8 8
9 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval 9 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval
10 from sqlalchemy.orm import relationship, backref, sessionmaker 10 from sqlalchemy.orm import relationship, backref, sessionmaker
11 from sqlalchemy.ext.declarative import declarative_base 11 from sqlalchemy.ext.declarative import declarative_base
12 12
78 name = Column(String) 78 name = Column(String)
79 resX = Column(Integer) 79 resX = Column(Integer)
80 resY = Column(Integer) 80 resY = Column(Integer)
81 frameRate = Column(Float) 81 frameRate = Column(Float)
82 frameRateTimeUnit = Column(String, default = 's') 82 frameRateTimeUnit = Column(String, default = 's')
83 intrinsicCameraMatrix00 = Column(Float) 83 intrinsicCameraMatrixStr = Column(String)
84 intrinsicCameraMatrix01 = Column(Float) 84 distortionCoefficientsStr = Column(String)
85 intrinsicCameraMatrix02 = Column(Float)
86 intrinsicCameraMatrix10 = Column(Float)
87 intrinsicCameraMatrix11 = Column(Float)
88 intrinsicCameraMatrix12 = Column(Float)
89 intrinsicCameraMatrix20 = Column(Float)
90 intrinsicCameraMatrix21 = Column(Float)
91 intrinsicCameraMatrix22 = Column(Float)
92 distortionCoefficients0 = Column(Float)
93 distortionCoefficients1 = Column(Float)
94 distortionCoefficients2 = Column(Float)
95 distortionCoefficients3 = Column(Float)
96 distortionCoefficients4 = Column(Float)
97 undistortedImageMultiplication = Column(Float) 85 undistortedImageMultiplication = Column(Float)
98 86
99 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None): 87 def __init__(self, name, resX, resY, frameRate, frameRateTimeUnit = 's', trackingConfigurationFilename = None, intrinsicCameraFilename = None, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = None):
100 self.name = name 88 self.name = name
101 self.resX = resX 89 self.resX = resX
102 self.resY = resY 90 self.resY = resY
103 self.frameRate = frameRate 91 self.frameRate = frameRate
104 self.frameRateTimeUnit = frameRateTimeUnit 92 self.frameRateTimeUnit = frameRateTimeUnit
105 93 self.intrinsicCameraMatrix = None # should be np.array
94 self.distortionCoefficients = None # list
95
106 if trackingConfigurationFilename is not None: 96 if trackingConfigurationFilename is not None:
107 from storage import ProcessParameters 97 from storage import ProcessParameters
108 params = ProcessParameters(trackingConfigurationFilename) 98 params = ProcessParameters(trackingConfigurationFilename)
109 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix 99 self.intrinsicCameraMatrix = params.intrinsicCameraMatrix
110 self.distortionCoefficients = params.distortionCoefficients 100 self.distortionCoefficients = params.distortionCoefficients
111 self.undistortedImageMultiplication = params.undistortedImageMultiplication 101 self.undistortedImageMultiplication = params.undistortedImageMultiplication
102 elif intrinsicCameraFilename is not None:
103 self.intrinsicCameraMatrix = loadtxt(intrinsicCameraFilename)
104 self.distortionCoefficients = distortionCoefficients
105 self.undistortedImageMultiplication = undistortedImageMultiplication
112 else: 106 else:
113 self.intrinsicCameraMatrix = intrinsicCameraMatrix 107 self.intrinsicCameraMatrix = intrinsicCameraMatrix
114 self.distortionCoefficients = distortionCoefficients 108 self.distortionCoefficients = distortionCoefficients
115 self.undistortedImageMultiplication = undistortedImageMultiplication 109 self.undistortedImageMultiplication = undistortedImageMultiplication
116 110
117 if self.intrinsicCameraMatrix is not None and self.intrinsicCameraMatrix.size == 9: 111 if self.intrinsicCameraMatrix is not None:
118 self.intrinsicCameraMatrix00 = self.intrinsicCameraMatrix[0,0] 112 self.intrinsicCameraMatrixStr = '{}'.format(self.intrinsicCameraMatrix.tolist())
119 self.intrinsicCameraMatrix01 = self.intrinsicCameraMatrix[0,1]
120 self.intrinsicCameraMatrix02 = self.intrinsicCameraMatrix[0,2]
121 self.intrinsicCameraMatrix10 = self.intrinsicCameraMatrix[1,0]
122 self.intrinsicCameraMatrix11 = self.intrinsicCameraMatrix[1,1]
123 self.intrinsicCameraMatrix12 = self.intrinsicCameraMatrix[1,2]
124 self.intrinsicCameraMatrix20 = self.intrinsicCameraMatrix[2,0]
125 self.intrinsicCameraMatrix21 = self.intrinsicCameraMatrix[2,1]
126 self.intrinsicCameraMatrix22 = self.intrinsicCameraMatrix[2,2]
127 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5: 113 if self.distortionCoefficients is not None and len(self.distortionCoefficients) == 5:
128 self.distortionCoefficients0 = self.distortionCoefficients[0] 114 self.distortionCoefficientsStr = '{}'.format(self.distortionCoefficients)
129 self.distortionCoefficients1 = self.distortionCoefficients[1]
130 self.distortionCoefficients2 = self.distortionCoefficients[2]
131 self.distortionCoefficients3 = self.distortionCoefficients[3]
132 self.distortionCoefficients4 = self.distortionCoefficients[4]
133 115
134 @orm.reconstructor 116 @orm.reconstructor
135 def initOnLoad(self): 117 def initOnLoad(self):
136 if self.intrinsicCameraMatrix00 is not None: 118 if self.intrinsicCameraMatrixStr is not None:
137 self.intrinsicCameraMatrix = zeros((3,3)) 119 from ast import literal_eval
138 self.intrinsicCameraMatrix[0,0] = self.intrinsicCameraMatrix00 120 self.intrinsicCameraMatrix = array(literal_eval(self.intrinsicCameraMatrixStr))
139 self.intrinsicCameraMatrix[0,1] = self.intrinsicCameraMatrix01
140 self.intrinsicCameraMatrix[0,2] = self.intrinsicCameraMatrix02
141 self.intrinsicCameraMatrix[1,0] = self.intrinsicCameraMatrix10
142 self.intrinsicCameraMatrix[1,1] = self.intrinsicCameraMatrix11
143 self.intrinsicCameraMatrix[1,2] = self.intrinsicCameraMatrix12
144 self.intrinsicCameraMatrix[2,0] = self.intrinsicCameraMatrix20
145 self.intrinsicCameraMatrix[2,1] = self.intrinsicCameraMatrix21
146 self.intrinsicCameraMatrix[2,2] = self.intrinsicCameraMatrix22
147 else: 121 else:
148 self.intrinsicCameraMatrix = None 122 self.intrinsicCameraMatrix = None
149 if self.distortionCoefficients0 is not None: 123 if self.distortionCoefficientsStr is not None:
150 self.distortionCoefficients = [0]*5 124 self.distortionCoefficients = literal_eval(self.distortionCoefficientsStr)
151 self.distortionCoefficients[0] = self.distortionCoefficients0
152 self.distortionCoefficients[1] = self.distortionCoefficients1
153 self.distortionCoefficients[2] = self.distortionCoefficients2
154 self.distortionCoefficients[3] = self.distortionCoefficients3
155 self.distortionCoefficients[4] = self.distortionCoefficients4
156 else: 125 else:
157 self.distortionCoefficients = None 126 self.distortionCoefficients = None
158 127
159 def computeUndistortMaps(self): 128 def computeUndistortMaps(self):
160 if self.undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None: 129 if self.undistortedImageMultiplication is not None and self.intrinsicCameraMatrix is not None and self.distortionCoefficients is not None:
161 self.map1, self.map2 = computeUndistortMaps(self.resX, self.resY, self.undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients) 130 self.map1, self.map2 = computeUndistortMaps(self.resX, self.resY, self.undistortedImageMultiplication, self.intrinsicCameraMatrix, self.distortionCoefficients)
162 else: 131 else:
163 self.map1 = None 132 self.map1 = None
164 self.map2 = None 133 self.map2 = None
165 134
135 @staticmethod
136 def getCameraType(session, cameraTypeId):
137 'Returns the site(s) matching the index or the name'
138 if str.isdigit(cameraTypeId):
139 return session.query(CameraType).filter(CameraType.idx == int(cameraTypeId)).all()
140 else:
141 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all()
142
166 class CameraView(Base): 143 class CameraView(Base):
167 __tablename__ = 'camera_views' 144 __tablename__ = 'camera_views'
168 idx = Column(Integer, primary_key=True) 145 idx = Column(Integer, primary_key=True)
169 description = Column(String) 146 description = Column(String)
170 homographyFilename = Column(String) # path to homograph filename, relative to the site name 147 homographyFilename = Column(String) # path to homograph filename, relative to the site name