Mercurial Hosting > traffic-intelligence
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 |