Mercurial Hosting > traffic-intelligence
comparison python/metadata.py @ 865:5afa1d30edd8
minor improvement to path description and path accessors
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 08 Dec 2016 11:07:14 -0500 |
parents | 2d6249fe905a |
children | 8fba46899e74 |
comparison
equal
deleted
inserted
replaced
864:8f28b4fcf129 | 865:5afa1d30edd8 |
---|---|
17 Base = declarative_base() | 17 Base = declarative_base() |
18 | 18 |
19 class Site(Base): | 19 class Site(Base): |
20 __tablename__ = 'sites' | 20 __tablename__ = 'sites' |
21 idx = Column(Integer, primary_key=True) | 21 idx = Column(Integer, primary_key=True) |
22 name = Column(String) # same as path, relative to the database position | 22 name = Column(String) # path to directory containing all site information (in subdirectories), relative to the database position |
23 description = Column(String) # longer names, eg intersection of road1 and road2 | 23 description = Column(String) # longer names, eg intersection of road1 and road2 |
24 xcoordinate = Column(Float) # ideally moving.Point, but needs to be | 24 xcoordinate = Column(Float) # ideally moving.Point, but needs to be |
25 ycoordinate = Column(Float) | 25 ycoordinate = Column(Float) |
26 mapImageFilename = Column(String) # path to filename, relative to site name, ie sitename/mapImageFilename | 26 mapImageFilename = Column(String) # path to map image file, relative to site name, ie sitename/mapImageFilename |
27 nUnitsPerPixel = Column(Float) # number of units of distance per pixel in map image | 27 nUnitsPerPixel = Column(Float) # number of units of distance per pixel in map image |
28 worldDistanceUnit = Column(String, default = 'm') # make sure it is default in the database | 28 worldDistanceUnit = Column(String, default = 'm') # make sure it is default in the database |
29 | 29 |
30 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None, mapImageFilename = None, nUnitsPerPixel = 1., worldDistanceUnit = 'm'): | 30 def __init__(self, name, description = "", xcoordinate = None, ycoordinate = None, mapImageFilename = None, nUnitsPerPixel = 1., worldDistanceUnit = 'm'): |
31 self.name = name | 31 self.name = name |
34 self.ycoordinate = ycoordinate | 34 self.ycoordinate = ycoordinate |
35 self.mapImageFilename = mapImageFilename | 35 self.mapImageFilename = mapImageFilename |
36 self.nUnitsPerPixel = nUnitsPerPixel | 36 self.nUnitsPerPixel = nUnitsPerPixel |
37 self.worldDistanceUnit = worldDistanceUnit | 37 self.worldDistanceUnit = worldDistanceUnit |
38 | 38 |
39 def getFilename(self): | 39 def getPath(self): |
40 return self.name | 40 return self.name |
41 | |
42 def getMapImageFilename(self, relativeToSiteFilename = True): | |
43 if relativeToSiteFilename: | |
44 return path.join(self.getPath(), self.mapImageFilename) | |
45 else: | |
46 return self.mapImageFilename | |
41 | 47 |
42 @staticmethod | 48 @staticmethod |
43 def getSite(session, siteId): | 49 def getSite(session, siteId): |
44 'Returns the site(s) matching the index or the name' | 50 'Returns the site(s) matching the index or the name' |
45 if str.isdigit(siteId): | 51 if str.isdigit(siteId): |
145 | 151 |
146 class CameraView(Base): | 152 class CameraView(Base): |
147 __tablename__ = 'camera_views' | 153 __tablename__ = 'camera_views' |
148 idx = Column(Integer, primary_key=True) | 154 idx = Column(Integer, primary_key=True) |
149 description = Column(String) | 155 description = Column(String) |
150 homographyFilename = Column(String) # path to homograph filename, relative to the site name | 156 homographyFilename = Column(String) # path to homograph file, relative to the site name |
151 siteIdx = Column(Integer, ForeignKey('sites.idx')) | 157 siteIdx = Column(Integer, ForeignKey('sites.idx')) |
152 cameraTypeIdx = Column(Integer, ForeignKey('camera_types.idx')) | 158 cameraTypeIdx = Column(Integer, ForeignKey('camera_types.idx')) |
153 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name | 159 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name |
154 maskFilename = Column(String) # path to mask file, relative to site name | 160 maskFilename = Column(String) # path to mask file, relative to site name |
155 virtual = Column(Boolean) # indicates it is not a real camera view, eg merged | 161 virtual = Column(Boolean) # indicates it is not a real camera view, eg merged |
166 self.maskFilename = maskFilename | 172 self.maskFilename = maskFilename |
167 self.virtual = virtual | 173 self.virtual = virtual |
168 | 174 |
169 def getHomographyFilename(self, relativeToSiteFilename = True): | 175 def getHomographyFilename(self, relativeToSiteFilename = True): |
170 if relativeToSiteFilename: | 176 if relativeToSiteFilename: |
171 return self.site.getFilename()+path.sep+self.homographyFilename | 177 return path.join(self.site.getPath(), self.homographyFilename) |
172 else: | 178 else: |
173 return self.homographyFilename | 179 return self.homographyFilename |
174 | 180 |
175 def getTrackingConfigurationFilename(self, relativeToSiteFilename = True): | 181 def getTrackingConfigurationFilename(self, relativeToSiteFilename = True): |
176 if relativeToSiteFilename: | 182 if relativeToSiteFilename: |
177 return self.site.getFilename()+path.sep+self.trackingConfigurationFilename | 183 return path.join(self.site.getPath(), self.trackingConfigurationFilename) |
178 else: | 184 else: |
179 return self.trackingConfigurationFilename | 185 return self.trackingConfigurationFilename |
180 | 186 |
181 def getMaskFilename(self, relativeToSiteFilename = True): | 187 def getMaskFilename(self, relativeToSiteFilename = True): |
182 if relativeToSiteFilename: | 188 if relativeToSiteFilename: |
183 return self.site.getFilename()+path.sep+self.maskFilename | 189 return path.join(self.site.getPath(), self.maskFilename) |
184 else: | 190 else: |
185 return self.maskFilename | 191 return self.maskFilename |
186 | 192 |
187 def getTrackingParameters(self): | 193 def getTrackingParameters(self): |
188 return ProcessParameters(self.getTrackingConfigurationFilename()) | 194 return ProcessParameters(self.getTrackingConfigurationFilename()) |
216 self.y = y | 222 self.y = y |
217 | 223 |
218 class VideoSequence(Base): | 224 class VideoSequence(Base): |
219 __tablename__ = 'video_sequences' | 225 __tablename__ = 'video_sequences' |
220 idx = Column(Integer, primary_key=True) | 226 idx = Column(Integer, primary_key=True) |
221 name = Column(String) # path relative to the the site name | 227 name = Column(String) # path to the video file relative to the the site name |
222 startTime = Column(DateTime) | 228 startTime = Column(DateTime) |
223 duration = Column(Interval) # video sequence duration | 229 duration = Column(Interval) # video sequence duration |
224 databaseFilename = Column(String) # path relative to the the site name | 230 databaseFilename = Column(String) # path to the database file relative to the the site name |
225 virtual = Column(Boolean) # indicates it is not a real video sequence (no video file), eg merged | 231 virtual = Column(Boolean) # indicates it is not a real video sequence (no video file), eg merged |
226 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) | 232 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) |
227 | 233 |
228 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx)) | 234 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx)) |
229 | 235 |
243 self.databaseFilename = databaseFilename | 249 self.databaseFilename = databaseFilename |
244 self.virtual = virtual | 250 self.virtual = virtual |
245 | 251 |
246 def getVideoSequenceFilename(self, relativeToSiteFilename = True): | 252 def getVideoSequenceFilename(self, relativeToSiteFilename = True): |
247 if relativeToSiteFilename: | 253 if relativeToSiteFilename: |
248 return self.cameraView.site.getFilename()+path.sep+self.name | 254 return path.join(self.cameraView.site.getPath(), self.name) |
249 else: | 255 else: |
250 return self.name | 256 return self.name |
251 | 257 |
252 def getDatabaseFilename(self, relativeToSiteFilename = True): | 258 def getDatabaseFilename(self, relativeToSiteFilename = True): |
253 if relativeToSiteFilename: | 259 if relativeToSiteFilename: |
254 return self.cameraView.site.getFilename()+path.sep+self.databaseFilename | 260 return path.join(self.cameraView.site.getPath(), self.databaseFilename) |
255 else: | 261 else: |
256 return self.databaseFilename | 262 return self.databaseFilename |
257 | 263 |
258 def getTimeInterval(self): | 264 def getTimeInterval(self): |
259 return TimeInterval(self.startTime, self.startTime+self.duration) | 265 return TimeInterval(self.startTime, self.startTime+self.duration) |
270 'Warning, there is no check of correct time units' | 276 'Warning, there is no check of correct time units' |
271 if self.containsInstant(instant): | 277 if self.containsInstant(instant): |
272 return int(floor((instant-self.startTime).seconds*self.cameraView.cameraType.frameRate)) | 278 return int(floor((instant-self.startTime).seconds*self.cameraView.cameraType.frameRate)) |
273 else: | 279 else: |
274 return None | 280 return None |
281 | |
282 class TrackingAnnotation(Base): | |
283 __tablename__ = 'tracking_annotations' | |
284 idx = Column(Integer, primary_key=True) | |
285 description = Column(String) # description | |
275 | 286 |
276 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file) | 287 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file) |
277 | 288 |
278 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines | 289 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines |
279 | 290 |