Mercurial Hosting > traffic-intelligence
changeset 1078:8cc3feb1c1c5
merged
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Fri, 20 Jul 2018 16:26:57 -0400 |
parents | b123fa0e5440 (current diff) 3939ae415be0 (diff) |
children | 845d694af7b8 |
files | |
diffstat | 2 files changed, 52 insertions(+), 79 deletions(-) [+] |
line wrap: on
line diff
--- a/trafficintelligence/moving.py Fri Jul 20 16:24:30 2018 -0400 +++ b/trafficintelligence/moving.py Fri Jul 20 16:26:57 2018 -0400 @@ -80,7 +80,7 @@ @classmethod def union(cls, interval1, interval2): '''Smallest interval comprising self and interval2''' - return cls(min(interval1.first, interval2.first), max(interval2.last, interval2.last)) + return cls(min(interval1.first, interval2.first), max(interval1.last, interval2.last)) @classmethod def intersection(cls, interval1, interval2): @@ -1159,6 +1159,29 @@ self.setNObjects(nObjects) # a feature has None for nObjects self.features = None # compute bounding polygon from trajectory + + @staticmethod + def cropedTimeInterval(obj, value, after = True): + newTimeInterval = TimeInterval(obj.getFirstInstant(), min(value, obj.getLastInstant())) if after else TimeInterval(max(obj.getFirstInstant(), value), obj.getLastInstant()) + if obj.positions is not None : + newPositions = obj.positions[slice(newTimeInterval.first, newTimeInterval.last+1)] + else: + newPositions = None + if obj.velocities is not None : + newVelocities = obj.velocities[slice(newTimeInterval.first, newTimeInterval.last+1)] + else: + newVelocities = None + if obj.features is not None : + newFeatures = [f.cropedTimeInterval(value, after) for f in obj.features] + else: + newFeatures = None + res = MovingObject(obj.getNum(), newTimeInterval, newPositions, newVelocities, obj.geometry, obj.userType, obj.nObjects) + res.features = newFeatures + res.featureNumbers = obj.featureNumbers + if hasattr(obj, 'projectedPositions'): + res.projectedPositions = obj.projectedPositions[slice(newTimeInterval.first, newTimeInterval.last+1)] + return res + @staticmethod def aggregateTrajectories(features, interval = None, aggFunc = mean): @@ -1201,7 +1224,7 @@ commonTimeInterval = obj1.commonTimeInterval(obj2) if commonTimeInterval.empty(): #print('The two objects\' time intervals do not overlap: obj1 {} and obj2 {}'.format(obj1.getTimeInterval(), obj2.getTimeInterval())) - emptyInterval = TimeInterval(min(obj1.getLastInstant(),obj2.getLastInstant()), max(obj1.getFirstInstant(),obj2.getFirstInstant())) + emptyInterval = TimeInterval(min(obj1.getLastInstant(),obj2.getLastInstant()), max(obj1.getFirstInstant(),obj2.getFirstInstant())+1) if obj1.existsAtInstant(emptyInterval.last): firstObject = obj2 secondObject = obj1 @@ -1214,7 +1237,7 @@ featurePositions = Trajectory() featureVelocities = Trajectory() p = firstObject.getPositionAtInstant(emptyInterval.first)+v - for t in range(emptyInterval.first+1, emptyInterval.last): + for t in range(emptyInterval.first+1, emptyInterval.last+1): positions.addPosition(p) velocities.addPosition(v) featurePositions.addPosition(p) @@ -1231,6 +1254,7 @@ print('Issue, new created feature has no num id') if obj1.hasFeatures() and obj2.hasFeatures(): newObject.features = obj1.getFeatures()+obj2.getFeatures()+[MovingObject(newFeatureNum, TimeInterval(emptyInterval.first+1, emptyInterval.last-1), featurePositions, featureVelocities)] + newObject.updatePositions() else: # time intervals overlap newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) newObject = MovingObject(newNum, newTimeInterval, nObjects = 1) # hypothesis is that it's the same object being reunited @@ -1348,6 +1372,7 @@ self.nObjects = nObjects else: print('Number of objects represented by object {} must be greater or equal to 1 ({})'.format(self.getNum(), nObjects)) + self.nObjects = None def setFeatures(self, features, featuresOrdered = False): '''Sets the features in the features field based on featureNumbers
--- a/trafficintelligence/storage.py Fri Jul 20 16:24:30 2018 -0400 +++ b/trafficintelligence/storage.py Fri Jul 20 16:26:57 2018 -0400 @@ -1377,10 +1377,10 @@ method parameters, etc. for tracking and safety Note: framerate is already taken into account''' - - def loadTrackerConfig(self, filename = None): + + def loadConfigFile(self, filename): from configparser import ConfigParser - + config = ConfigParser({ 'acceleration-bound' : '3', 'min-velocity-cosine' : '0.8', 'ndisplacements' : '3', @@ -1399,78 +1399,7 @@ 'min-feature-time' : '15', 'min-feature-displacement' : '0.05', 'tracker-reload-time' : '10'}, strict=False) - if filename is not None: - config.read_file(addSectionHeader(utils.openCheck(filename))) - self.sectionHeader = config.sections()[0] - else: - self.sectionHeader = 'DEFAULT' - - #Tracker parameters - self.accelerationBound = config.getint(self.sectionHeader, 'acceleration-bound') - self.minVelocityCosine = config.getfloat(self.sectionHeader, 'min-velocity-cosine') - self.ndisplacements = config.getint(self.sectionHeader, 'ndisplacements') - self.maxNFeatures = config.getint(self.sectionHeader, 'max-nfeatures') - self.minFeatureDistanceKLT = config.getfloat(self.sectionHeader, 'min-feature-distanceklt') - self.featureQuality = config.getfloat(self.sectionHeader, 'feature-quality') - self.blockSize = config.getint(self.sectionHeader, 'block-size') - self.useHarrisDetector = config.getboolean(self.sectionHeader, 'use-harris-detector') - self.k = config.getfloat(self.sectionHeader, 'k') - self.winSize = config.getint(self.sectionHeader, 'window-size') - self.pyramidLevel = config.getint(self.sectionHeader, 'pyramid-level') - self.maxNumberTrackingIterations = config.getint(self.sectionHeader, 'max-number-iterations') - self.minTrackingError = config.getfloat(self.sectionHeader, 'min-tracking-error') - self.featureFlags = config.getboolean(self.sectionHeader, 'feature-flag') - self.minFeatureEigThreshold = config.getfloat(self.sectionHeader, 'min-feature-eig-threshold') - self.minFeatureTime = config.getint(self.sectionHeader, 'min-feature-time') - self.minFeatureDisplacement = config.getfloat(self.sectionHeader, 'min-feature-displacement') - self.updateTimer = config.getint(self.sectionHeader, 'tracker-reload-time') - - def loadHomographyConfig(self, filename = None): - if filename is None: - self.homographyFilename = None - self.homography = None - else : - from configparser import ConfigParser - config = ConfigParser(strict=False) - config.read_file(addSectionHeader(utils.openCheck(filename))) - parentPath = Path(filename).parent - self.sectionHeader = config.sections()[0] - self.homographyFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'homography-filename')) - if Path(self.homographyFilename).is_file(): - self.homography = loadtxt(self.homographyFilename) - else: - self.homography = None - - def loadDistortionConfig(self, filename = None): - if filename is None: - self.intrinsicCameraFilename = None - self.intrinsicCameraMatrix = None - self.distortionCoefficients = None - self.undistort = False - self.undistortedImageMultiplication = 1. - else: - from configparser import ConfigParser - config = ConfigParser(strict=False) - config.read_file(addSectionHeader(utils.openCheck(filename))) - parentPath = Path(filename).parent - self.sectionHeader = config.sections()[0] - self.intrinsicCameraFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'intrinsic-camera-filename')) - if Path(self.intrinsicCameraFilename).is_file(): - self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename) - else: - self.intrinsicCameraMatrix = None - distortionCoefficients = getValuesFromINIFile(filename, 'distortion-coefficients', '=') - self.distortionCoefficients = [float(x) for x in distortionCoefficients] - self.undistortedImageMultiplication = config.getfloat(self.sectionHeader, 'undistorted-size-multiplication') - self.undistort = config.getboolean(self.sectionHeader, 'undistort') - - - def loadConfigFile(self, filename): - from configparser import ConfigParser - - config = ConfigParser(strict=False) config.read_file(addSectionHeader(utils.openCheck(filename))) - parentPath = Path(filename).parent self.sectionHeader = config.sections()[0] # Tracking/display parameters @@ -1492,8 +1421,6 @@ self.undistort = config.getboolean(self.sectionHeader, 'undistort') self.firstFrameNum = config.getint(self.sectionHeader, 'frame1') self.videoFrameRate = config.getfloat(self.sectionHeader, 'video-fps') - - self.minFeatureTime = config.getint(self.sectionHeader, 'min-feature-time') self.classifierFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'classifier-filename')) @@ -1514,6 +1441,27 @@ self.maxLcssDistance = config.getfloat(self.sectionHeader, 'max-lcss-distance') self.lcssMetric = config.get(self.sectionHeader, 'lcss-metric') self.minLcssSimilarity = config.getfloat(self.sectionHeader, 'min-lcss-similarity') + + # Tracking parameters + self.accelerationBound = config.getint(self.sectionHeader, 'acceleration-bound') + self.minVelocityCosine = config.getfloat(self.sectionHeader, 'min-velocity-cosine') + self.ndisplacements = config.getint(self.sectionHeader, 'ndisplacements') + self.maxNFeatures = config.getint(self.sectionHeader, 'max-nfeatures') + self.minFeatureDistanceKLT = config.getfloat(self.sectionHeader, 'min-feature-distanceklt') + self.featureQuality = config.getfloat(self.sectionHeader, 'feature-quality') + self.blockSize = config.getint(self.sectionHeader, 'block-size') + self.useHarrisDetector = config.getboolean(self.sectionHeader, 'use-harris-detector') + self.k = config.getfloat(self.sectionHeader, 'k') + self.winSize = config.getint(self.sectionHeader, 'window-size') + self.pyramidLevel = config.getint(self.sectionHeader, 'pyramid-level') + self.maxNumberTrackingIterations = config.getint(self.sectionHeader, 'max-number-iterations') + self.minTrackingError = config.getfloat(self.sectionHeader, 'min-tracking-error') + self.featureFlags = config.getboolean(self.sectionHeader, 'feature-flag') + self.minFeatureEigThreshold = config.getfloat(self.sectionHeader, 'min-feature-eig-threshold') + self.minFeatureTime = config.getint(self.sectionHeader, 'min-feature-time') + self.minFeatureDisplacement = config.getfloat(self.sectionHeader, 'min-feature-displacement') + self.updateTimer = config.getint(self.sectionHeader, 'tracker-reload-time') + def __init__(self, filename = None): self.configFilename = filename