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