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