Mercurial Hosting > traffic-intelligence
view python/ubc_utils.py @ 398:3399bd48cb40
Ajout d'une méthode pour obtenir le nombre de FPS
Méthode de capture des trames vidéos plus résistante aux erreur
Utilisation d'un dictionnaire pour les fichier de configuration afin de garder le nom des sections
author | Jean-Philippe Jodoin <jpjodoin@gmail.com> |
---|---|
date | Mon, 29 Jul 2013 13:46:07 -0400 |
parents | 2f39c4ed0b62 |
children | 15e244d2a1b5 |
line wrap: on
line source
#! /usr/bin/env python '''Various utilities to load data saved by the UBC tool(s)''' import utils, events from moving import MovingObject, TimeInterval, Trajectory __metaclass__ = type fileTypeNames = ['feature', 'object', 'prototype', 'contoursequence'] severityIndicatorNames = ['Distance', 'Collision Course Cosine', 'Velocity Cosine', 'Speed Differential', 'Collision Probability', 'Severity Index', 'Time to Collision'] userTypeNames = ['car', 'pedestrian', 'twowheels', 'bus', 'truck'] # severityIndicator = {'Distance': 0, # 'Cosine': 1, # 'Velocity Cosine': 2, # 'Speed Differential': 3, # 'Collision Probability': 4, # 'Severity Index': 5, # 'TTC': 6} mostSevereIsMax = [False, False, True, True, True, True, False] ignoredValue = [None, None, None, None, None, None, -1] def getFileType(s): 'Finds the type in fileTypeNames' for fileType in fileTypeNames: if s.find(fileType)>0: return fileType return '' def isFileType(s, fileType): return (s.find(fileType)>0) def saveTrajectoryUserTypes(inFilename, outFilename, objects): '''The program saves the objects, by just copying the corresponding trajectory and velocity data from the inFilename, and saving the characteristics in objects (first line) into outFilename''' infile = utils.openCheck(inFilename) outfile = utils.openCheck(outFilename,'w') if (inFilename.find('features') >= 0) or (not infile) or (not outfile): return lines = utils.getLines(infile) objNum = 0 # in inFilename while lines != []: # find object in objects (index i) i = 0 while (i<len(objects)) and (objects[i].num != objNum): i+=1 if i<len(objects): l = lines[0].split(' ') l[3] = str(objects[i].userType) outfile.write(' '.join(l)+'\n') for l in lines[1:]: outfile.write(l+'\n') outfile.write(utils.delimiterChar+'\n') # next object objNum += 1 lines = utils.getLines(infile) print('read {0} objects'.format(objNum)) def modifyTrajectoryFile(modifyLines, filenameIn, filenameOut): '''Reads filenameIn, replaces the lines with the result of modifyLines and writes the result in filenameOut''' fileIn = utils.openCheck(filenameIn, 'r', True) fileOut = utils.openCheck(filenameOut, "w", True) lines = utils.getLines(fileIn) trajNum = 0 while (lines != []): modifiedLines = modifyLines(trajNum, lines) if modifiedLines: for l in modifiedLines: fileOut.write(l+"\n") fileOut.write(utils.delimiterChar+"\n") lines = utils.getLines(fileIn) trajNum += 1 fileIn.close() fileOut.close() def copyTrajectoryFile(keepTrajectory, filenameIn, filenameOut): '''Reads filenameIn, keeps the trajectories for which the function keepTrajectory(trajNum, lines) is True and writes the result in filenameOut''' fileIn = utils.openCheck(filenameIn, 'r', True) fileOut = utils.openCheck(filenameOut, "w", True) lines = utils.getLines(fileIn) trajNum = 0 while (lines != []): if keepTrajectory(trajNum, lines): for l in lines: fileOut.write(l+"\n") fileOut.write(utils.delimiterChar+"\n") lines = utils.getLines(fileIn) trajNum += 1 fileIn.close() fileOut.close() def loadTrajectories(filename, nObjects = -1): '''Loads trajectories''' file = utils.openCheck(filename) if (not file): return [] objects = [] objNum = 0 objectType = getFileType(filename) lines = utils.getLines(file) while (lines != []) and ((nObjects<0) or (objNum<nObjects)): l = lines[0].split(' ') parsedLine = [int(n) for n in l[:4]] obj = MovingObject(num = objNum, timeInterval = TimeInterval(parsedLine[1],parsedLine[2])) #add = True if len(lines) >= 3: obj.positions = Trajectory.load(lines[1], lines[2]) if len(lines) >= 5: obj.velocities = Trajectory.load(lines[3], lines[4]) if objectType == 'object': obj.userType = parsedLine[3] obj.nObjects = float(l[4]) obj.featureNumbers = [int(n) for n in l[5:]] # load contour data if available if len(lines) >= 6: obj.contourType = utils.line2Floats(lines[6]) obj.contourOrigins = Trajectory.load(lines[7], lines[8]) obj.contourSizes = Trajectory.load(lines[9], lines[10]) elif objectType == 'prototype': obj.userType = parsedLine[3] obj.nMatchings = int(l[4]) if len(lines) != 2: objects.append(obj) objNum+=1 else: print("Error two lines of data for feature %d"%(f.num)) lines = utils.getLines(file) file.close() return objects def getFeatureNumbers(objects): featureNumbers=[] for o in objects: featureNumbers += o.featureNumbers return featureNumbers def loadInteractions(filename, nInteractions = -1): 'Loads interactions from the old UBC traffic event format' from events import Interaction from indicators import SeverityIndicator file = utils.openCheck(filename) if (not file): return [] interactions = [] interactionNum = 0 lines = utils.getLines(file) while (lines != []) and ((nInteractions<0) or (interactionNum<nInteractions)): parsedLine = [int(n) for n in lines[0].split(' ')] inter = Interaction(interactionNum, TimeInterval(parsedLine[1],parsedLine[2]), parsedLine[3], parsedLine[4], categoryNum = parsedLine[5]) indicatorFrameNums = [int(n) for n in lines[1].split(' ')] for indicatorNum,line in enumerate(lines[2:]): values = {} for i,v in enumerate([float(n) for n in line.split(' ')]): if not ignoredValue[indicatorNum] or v != ignoredValue[indicatorNum]: values[indicatorFrameNums[i]] = v inter.addIndicator(SeverityIndicator(severityIndicatorNames[indicatorNum], values, None, mostSevereIsMax[indicatorNum])) interactions.append(inter) interactionNum+=1 lines = utils.getLines(file) file.close() return interactions def loadCollisionPoints(filename, nPoints = -1): '''Loads collision points and returns a dict with keys as a pair of the numbers of the two interacting objects''' file = utils.openCheck(filename) if (not file): return [] points = {} num = 0 lines = utils.getLines(file) while (lines != []) and ((nPoints<0) or (num<nPoints)): parsedLine = [int(n) for n in lines[0].split(' ')] protagonistNums = (parsedLine[0], parsedLine[1]) points[protagonistNums] = [[float(n) for n in lines[1].split(' ')], [float(n) for n in lines[2].split(' ')]] num+=1 lines = utils.getLines(file) file.close() return points