comparison python/storage.py @ 509:935430b1d408

corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 23 May 2014 16:27:26 -0400
parents 343cfd185ca6
children 1ba618fb0f70
comparison
equal deleted inserted replaced
508:6f7fa0093162 509:935430b1d408
6 6
7 import sqlite3, logging 7 import sqlite3, logging
8 8
9 __metaclass__ = type 9 __metaclass__ = type
10 10
11
12 commentChar = '#'
13
14 delimiterChar = '%';
11 15
12 ngsimUserTypes = {'twowheels':1, 16 ngsimUserTypes = {'twowheels':1,
13 'car':2, 17 'car':2,
14 'truck':3} 18 'truck':3}
15 19
350 354
351 ######################### 355 #########################
352 # txt files 356 # txt files
353 ######################### 357 #########################
354 358
359 def openCheck(filename, option = 'r', quit = False):
360 '''Open file filename in read mode by default
361 and checks it is open'''
362 try:
363 return open(filename, option)
364 except IOError:
365 print 'File %s could not be opened.' % filename
366 if quit:
367 from sys import exit
368 exit()
369 return None
370
371 def readline(f, commentChar = commentChar):
372 '''Modified readline function to skip comments.'''
373 s = f.readline()
374 while (len(s) > 0) and s.startswith(commentChar):
375 s = f.readline()
376 return s.strip()
377
378 def getLines(f, commentChar = commentChar):
379 '''Gets a complete entry (all the lines) in between delimiterChar.'''
380 dataStrings = []
381 s = readline(f, commentChar)
382 while len(s) > 0:
383 dataStrings += [s.strip()]
384 s = readline(f, commentChar)
385 return dataStrings
386
387 def writeList(filename, l):
388 f = utils.openCheck(filename, 'w')
389 for x in l:
390 f.write('{}\n'.format(x))
391 f.close()
392
393 def loadListStrings(filename, commentChar = commentChar):
394 f = utils.openCheck(filename, 'r')
395 result = getLines(f, commentChar)
396 f.close()
397 return result
398
399 def getValuesFromINIFile(filename, option, delimiterChar = '=', commentChar = commentChar):
400 values = []
401 for l in loadListStrings(filename, commentChar):
402 if l.startswith(option):
403 values.append(l.split(delimiterChar)[1].strip())
404 return values
405
406 class FakeSecHead(object):
407 '''Add fake section header [asection]
408
409 from http://stackoverflow.com/questions/2819696/parsing-properties-file-in-python/2819788#2819788
410 use read_file in Python 3.2+
411 '''
412 def __init__(self, fp):
413 self.fp = fp
414 self.sechead = '[main]\n'
415
416 def readline(self):
417 if self.sechead:
418 try: return self.sechead
419 finally: self.sechead = None
420 else: return self.fp.readline()
421
355 def loadTrajectoriesFromNgsimFile(filename, nObjects = -1, sequenceNum = -1): 422 def loadTrajectoriesFromNgsimFile(filename, nObjects = -1, sequenceNum = -1):
356 '''Reads data from the trajectory data provided by NGSIM project 423 '''Reads data from the trajectory data provided by NGSIM project
357 and returns the list of Feature objects''' 424 and returns the list of Feature objects'''
358 objects = [] 425 objects = []
359 426
452 f = utils.openCheck(filename, 'w') 519 f = utils.openCheck(filename, 'w')
453 for i,obj in enumerate(objects): 520 for i,obj in enumerate(objects):
454 writePositionsToCsv(f, obj) 521 writePositionsToCsv(f, obj)
455 f.close() 522 f.close()
456 523
457 def writeList(filename, l): 524
458 f = utils.openCheck(filename, 'w') 525 #########################
459 for x in l: 526 # Utils to read .ini type text files for configuration, meta data...
460 f.write('{}\n'.format(x)) 527 #########################
461 f.close() 528
462 529 class TrackingParameters:
463 def loadListStrings(filename): 530 '''Class for tracking and safety parameters
464 f = utils.openCheck(filename, 'r') 531
465 result = [l.strip() for l in f] 532 Note: framerate is already taken into account'''
466 f.close() 533
467 return result 534 def loadConfigFile(self, filename):
468 535 from ConfigParser import ConfigParser
536 from numpy import loadtxt
537 from os import path
538
539 config = ConfigParser()
540 config.readfp(FakeSecHead(openCheck(filename)))
541 self.sectionHeader = config.sections()[0]
542 self.videoFilename = config.get(self.sectionHeader, 'video-filename')
543 self.databaseFilename = config.get(self.sectionHeader, 'database-filename')
544 self.homographyFilename = config.get(self.sectionHeader, 'homography-filename')
545 if (path.exists(self.homographyFilename)):
546 self.homography = loadtxt(self.homographyFilename)
547 else:
548 self.homography = None
549 self.intrinsicCameraFilename = config.get(self.sectionHeader, 'intrinsic-camera-filename')
550 if (path.exists(self.intrinsicCameraFilename)):
551 self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename)
552 else:
553 self.intrinsicCameraMatrix = None
554 distortionCoefficients = getValuesFromINIFile(filename, 'distortion-coefficients', '=')
555 self.distortionCoefficients = [float(x) for x in distortionCoefficients]
556 self.undistortedImageMultiplication = config.getfloat(self.sectionHeader, 'undistorted-size-multiplication')
557 self.undistort = config.getboolean(self.sectionHeader, 'undistort')
558 self.firstFrameNum = config.getint(self.sectionHeader, 'frame1')
559 self.videoFrameRate = config.getfloat(self.sectionHeader, 'video-fps')
560
561 self.maxPredictedSpeed = config.getfloat(self.sectionHeader, 'max-predicted-speed')/3.6/self.videoFrameRate
562 self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')*self.videoFrameRate
563 self.collisionDistance = config.getfloat(self.sectionHeader, 'collision-distance')
564 self.crossingZones = config.getboolean(self.sectionHeader, 'crossing-zones')
565 self.predictionMethod = config.get(self.sectionHeader, 'prediction-method')
566 self.nPredictedTrajectories = config.getint(self.sectionHeader, 'npredicted-trajectories')
567 self.maxNormalAcceleration = config.getfloat(self.sectionHeader, 'max-normal-acceleration')/self.videoFrameRate**2
568 self.maxNormalSteering = config.getfloat(self.sectionHeader, 'max-normal-steering')/self.videoFrameRate
569 self.minExtremeAcceleration = config.getfloat(self.sectionHeader, 'min-extreme-acceleration')/self.videoFrameRate**2
570 self.maxExtremeAcceleration = config.getfloat(self.sectionHeader, 'max-extreme-acceleration')/self.videoFrameRate**2
571 self.maxExtremeSteering = config.getfloat(self.sectionHeader, 'max-extreme-steering')/self.videoFrameRate
572 self.useFeaturesForPrediction = config.getboolean(self.sectionHeader, 'use-features-prediction')
573
574 def __init__(self, filename = None):
575 if filename != None:
576 self.loadConfigFile(filename)
577
578 class SceneParameters:
579 def __init__(self, config, sectionName):
580 from ConfigParser import NoOptionError
581 from ast import literal_eval
582 try:
583 self.sitename = config.get(sectionName, 'sitename')
584 self.databaseFilename = config.get(sectionName, 'data-filename')
585 self.homographyFilename = config.get(sectionName, 'homography-filename')
586 self.calibrationFilename = config.get(sectionName, 'calibration-filename')
587 self.videoFilename = config.get(sectionName, 'video-filename')
588 self.frameRate = config.getfloat(sectionName, 'framerate')
589 self.date = datetime.strptime(config.get(sectionName, 'date'), datetimeFormat) # 2011-06-22 11:00:39
590 self.translation = literal_eval(config.get(sectionName, 'translation')) # = [0.0, 0.0]
591 self.rotation = config.getfloat(sectionName, 'rotation')
592 self.duration = config.getint(sectionName, 'duration')
593 except NoOptionError as e:
594 print(e)
595 print('Not a section for scene meta-data')
596
597 @staticmethod
598 def loadConfigFile(filename):
599 from ConfigParser import ConfigParser
600 config = ConfigParser()
601 config.readfp(openCheck(filename))
602 configDict = dict()
603 for sectionName in config.sections():
604 configDict[sectionName] = SceneParameters(config, sectionName)
605 return configDict
606
469 607
470 if __name__ == "__main__": 608 if __name__ == "__main__":
471 import doctest 609 import doctest
472 import unittest 610 import unittest
473 suite = doctest.DocFileSuite('tests/storage.txt') 611 suite = doctest.DocFileSuite('tests/storage.txt')