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