Mercurial > hg > nsaunier > 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')) |
