comparison python/metadata.py @ 971:9897a13772fb

added utils to load video sequence in metadata
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 13 Dec 2017 14:06:20 -0500
parents bf401567a933
children b50145235f9e
comparison
equal deleted inserted replaced
970:bf401567a933 971:9897a13772fb
6 6
7 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval 7 from sqlalchemy import orm, create_engine, Column, Integer, Float, DateTime, String, ForeignKey, Boolean, Interval
8 from sqlalchemy.orm import relationship, backref, sessionmaker 8 from sqlalchemy.orm import relationship, backref, sessionmaker
9 from sqlalchemy.ext.declarative import declarative_base 9 from sqlalchemy.ext.declarative import declarative_base
10 10
11 from utils import datetimeFormat, removeExtension, getExtension 11 from utils import datetimeFormat, removeExtension, getExtension, TimeConverter
12 from cvutils import computeUndistortMaps, videoFilenameExtensions, infoVideo 12 from cvutils import computeUndistortMaps, videoFilenameExtensions, infoVideo
13 from moving import TimeInterval 13 from moving import TimeInterval
14 14
15 """ 15 """
16 Metadata to describe how video data and configuration files for video analysis are stored 16 Metadata to describe how video data and configuration files for video analysis are stored
68 if relativeToSiteFilename: 68 if relativeToSiteFilename:
69 return path.join(self.getPath(), self.mapImageFilename) 69 return path.join(self.getPath(), self.mapImageFilename)
70 else: 70 else:
71 return self.mapImageFilename 71 return self.mapImageFilename
72 72
73 @staticmethod 73
74 def getSite(session, siteId):
75 'Returns the site(s) matching the index or the name'
76 if str.isdigit(siteId):
77 return session.query(Site).filter(Site.idx == int(siteId)).all()
78 else:
79 return session.query(Site).filter(Site.description.like('%'+siteId+'%')).all()
80
81
82 class EnvironementalFactors(Base): 74 class EnvironementalFactors(Base):
83 '''Represents any environmental factors that may affect the results, in particular 75 '''Represents any environmental factors that may affect the results, in particular
84 * changing weather conditions 76 * changing weather conditions
85 * changing road configuration, geometry, signalization, etc. 77 * changing road configuration, geometry, signalization, etc.
86 ex: sunny, rainy, before counter-measure, after counter-measure''' 78 ex: sunny, rainy, before counter-measure, after counter-measure'''
356 'creates a session to query the filename' 348 'creates a session to query the filename'
357 engine = create_engine('sqlite:///'+filename) 349 engine = create_engine('sqlite:///'+filename)
358 Session = sessionmaker(bind=engine) 350 Session = sessionmaker(bind=engine)
359 return Session() 351 return Session()
360 352
361 def initializeSites(session, directoryName): 353 def getSite(session, siteId):
362 '''Initializes default site objects and Camera Views 354 'Returns the site(s) matching the index or the name'
355 if str.isdigit(siteId):
356 return session.query(Site).filter(Site.idx == int(siteId)).all()
357 else:
358 return session.query(Site).filter(Site.description.like('%'+siteId+'%')).all()
359
360 def getCameraView(session, viewId):
361 'Returns the site(s) matching the index'
362 return session.query(CameraView).filter(CameraView.idx == int(viewId)).first()
363
364 def initializeSites(session, directoryName, nViewsPerSite = 1):
365 '''Initializes default site objects and n camera views per site
363 366
364 eg somedirectory/montreal/ contains intersection1, intersection2, etc. 367 eg somedirectory/montreal/ contains intersection1, intersection2, etc.
365 The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.''' 368 The site names would be somedirectory/montreal/intersection1, somedirectory/montreal/intersection2, etc.
369 The views should be directories in somedirectory/montreal/intersection1'''
366 sites = [] 370 sites = []
367 cameraViews = [] 371 cameraViews = []
368 names = listdir(directoryName) 372 names = listdir(directoryName)
369 cameraViewIdx = 1
370 for name in names: 373 for name in names:
371 if path.isdir(directoryName+sep+name): 374 if path.isdir(directoryName+sep+name):
372 sites.append(Site(directoryName+sep+name, None)) 375 sites.append(Site(directoryName+sep+name, None))
373 cameraViews.append(CameraView('view{}'.format(cameraViewIdx), None, sites[-1], None, None, None)) 376 for cameraViewIdx in range(1, nViewsPerSite+1):
374 cameraViewIdx += 1 377 cameraViews.append(CameraView('view{}'.format(cameraViewIdx), None, sites[-1], None, None, None))
375 session.add_all(sites) 378 session.add_all(sites)
376 session.add_all(cameraViews) 379 session.add_all(cameraViews)
377 session.commit() 380 session.commit()
378 # TODO crawler for video files?
379 381
380 def initializeVideos(session, cameraView, directoryName, startTime = None, datetimeFormat = None): 382 def initializeVideos(session, cameraView, directoryName, startTime = None, datetimeFormat = None):
381 '''Initializes videos with time or tries to guess it from filename 383 '''Initializes videos with time or tries to guess it from filename
382 directoryName should contain the videos to find and be the relative path from the site location''' 384 directoryName should contain the videos to find and be the relative path from the site location'''
383 names = listdir(directoryName) 385 names = listdir(directoryName)
384 videoSequences = [] 386 videoSequences = []
387 if datetimeFormat is not None:
388 timeConverter = TimeConverter(datetimeFormat)
385 for name in names: 389 for name in names:
386 prefix = removeExtension(name) 390 prefix = removeExtension(name)
387 extension = getExtension(name) 391 extension = getExtension(name)
388 if extension in videoFilenameExtensions: 392 if extension in videoFilenameExtensions:
393 if datetimeFormat is not None:
394 from argparse import ArgumentTypeError
395 try:
396 prefix = name[:name.rfind('_')]
397 t1 = timeConverter.convert(prefix)
398 print('DB time {} / Time from filename {}'.format(startTime, t1))
399 except ArgumentTypeError as e:
400 print('File format error for time {} (prefix {})'.format(name, prefix))
389 vidinfo = infoVideo(directoryName+sep+name) 401 vidinfo = infoVideo(directoryName+sep+name)
390 duration = vidinfo['number of frames']#timedelta(minutes = 27, seconds = 33) 402 duration = vidinfo['number of frames']#timedelta(minutes = 27, seconds = 33)
391 fps = vidinfo['fps'] 403 fps = vidinfo['fps']
392 duration = timedelta(seconds=duration/fps) 404 duration = timedelta(seconds=duration/fps)
393 videoSequences.append(VideoSequence(directoryName+sep+name, startTime, duration, cameraView, directoryName+sep+prefix+'.sqlite')) 405 videoSequences.append(VideoSequence(directoryName+sep+name, startTime, duration, cameraView, directoryName+sep+prefix+'.sqlite'))