changeset 644:e54751e71d61

more cleanup
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 10 Apr 2015 16:09:13 +0200
parents bfaa6b95dae2
children 5ed2118c959d
files python/objectsmoothing.py
diffstat 1 files changed, 42 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/python/objectsmoothing.py	Fri Apr 10 15:40:27 2015 +0200
+++ b/python/objectsmoothing.py	Fri Apr 10 16:09:13 2015 +0200
@@ -13,41 +13,42 @@
             dist[f]= moving.Point.distanceNorm2(feat.getPositionAtInstant(t-1),f.getPositionAtInstant(t))
     return min(dist, key=dist.get) # = utils.argmaxDict(dist)
     
-def getFeatures(obj,features,featureID):
-    t1,t3 = features[featureID].getFirstInstant(), features[featureID].getLastInstant()
-    listFeatures=[[features[featureID],t1,t3,moving.Point(0,0)]]
+def getFeatures(obj, featureID):
+    first = obj.features[featureID].getFirstInstant()
+    last = obj.features[featureID].getLastInstant()
+    featureList=[[obj.features[featureID],first,last,moving.Point(0,0)]]
     # find the features to fill in the beginning of the object existence
-    currentFeature = features[featureID]
-    while t1!=obj.getFirstInstant():
-        delta=listFeatures[-1][3]
-        featureSet = [f for f in obj.features if f.existsAtInstant(t1-1)]
-        feat = findNearest(currentFeature,featureSet,t1-1,reverse=True)
-        if feat.existsAtInstant(t1):
-            listFeatures.append([feat,feat.getFirstInstant(),t1-1,(currentFeature.getPositionAtInstant(t1)-feat.getPositionAtInstant(t1))+delta])
+    currentFeature = obj.features[featureID]
+    while first != obj.getFirstInstant():
+        delta=featureList[-1][3]
+        featureSet = [f for f in obj.features if f.existsAtInstant(first-1)]
+        feat = findNearest(currentFeature,featureSet,first-1,reverse=True)
+        if feat.existsAtInstant(first):
+            featureList.append([feat,feat.getFirstInstant(),first-1,(currentFeature.getPositionAtInstant(first)-feat.getPositionAtInstant(first))+delta])
         else:
-            listFeatures.append([feat,feat.getFirstInstant(),t1-1,(currentFeature.getPositionAtInstant(t1)-feat.getPositionAtInstant(t1-1))+delta])
+            featureList.append([feat,feat.getFirstInstant(),first-1,(currentFeature.getPositionAtInstant(first)-feat.getPositionAtInstant(first-1))+delta])
         currentFeature = feat
-        t1= feat.getFirstInstant()
+        first= feat.getFirstInstant()
     # find the features to fill in the end of the object existence
     delta=moving.Point(0,0)
-    currentFeature = features[featureID]
-    while t3!= obj.getLastInstant():
-        featureSet = [f for f in obj.features if f.existsAtInstant(t3+1)]
-        feat = findNearest(currentFeature,featureSet,t3+1,reverse=False)
-        if feat.existsAtInstant(t3):
-            listFeatures.append([feat,t3+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(t3)-feat.getPositionAtInstant(t3))+delta])
+    currentFeature = obj.features[featureID]
+    while last!= obj.getLastInstant():
+        featureSet = [f for f in obj.features if f.existsAtInstant(last+1)]
+        feat = findNearest(currentFeature,featureSet,last+1,reverse=False)
+        if feat.existsAtInstant(last):
+            featureList.append([feat,last+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(last)-feat.getPositionAtInstant(last))+delta])
         else:
-            listFeatures.append([feat,t3+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(t3)-feat.getPositionAtInstant(t3+1))+delta])
+            featureList.append([feat,last+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(last)-feat.getPositionAtInstant(last+1))+delta])
         currentFeature = feat
-        t3= feat.getLastInstant()
-        delta=listFeatures[-1][3]
-    return listFeatures
+        last= feat.getLastInstant()
+        delta=featureList[-1][3]
+    return featureList
     
-def buildFeature(obj,features,featureID,num=1):
-    listFeatures= getFeatures(obj,features,featureID)
+def buildFeature(obj, featureID, num = 1):
+    featureList= getFeatures(obj, featureID)
     tmp={}
     delta={}
-    for i in listFeatures:
+    for i in featureList:
         for t in xrange(i[1],i[2]+1):
             tmp[t]=[i[0],i[3]]
     newTraj = moving.Trajectory()
@@ -113,13 +114,13 @@
         t+= jerk[i]* jerk[i]
     return t
     
-def smoothObjectTrajectory(obj,features,featureID,newNum,smoothing=False,halfWidth=3,create=False):
+def smoothObjectTrajectory(obj, featureID,newNum,smoothing=False,halfWidth=3,create=False):
     results=[]    
     bearing={}
     if create:
-        feature = buildFeature(obj,features,featureID,num=1)
+        feature = buildFeature(obj, featureID , num=1) # why num=1
     else:
-        feature = features[featureID]
+        feature = obj.features[featureID]
     for t in feature.getTimeInterval():
         p1= feature.getPositionAtInstant(t)
         p2= obj.getPositionAtInstant(t)
@@ -173,18 +174,24 @@
     newObj= moving.MovingObject(newNum,timeInterval=feature.getTimeInterval(),positions=translated)
     return newObj
     
-def smoothObject(obj,features,newNum,minLengthParam=0.7,smoothing=False,plotResults=True,halfWidth=3, _computeVelocities=True,optimize=True,create=False):
+def smoothObject(obj, newNum, minLengthParam = 0.7, smoothing = False, plotResults = True, halfWidth = 3, _computeVelocities = True, optimize = True, create = False):
     '''Computes a smoother trajectory for the object
     and optionnally smoother velocities
-
+    
+    The object should have its features in obj.features
     TODO: check whether features are necessary'''
-    featureList=[i.num for i in obj.features if i.length() >= minLengthParam*obj.length()]
+    if len(obj.features) == 0:
+        print('Object {} has an empty list of features: please load and add them using obj.setFeatures(features)'.format(obj.getNum()))
+        from sys import exit
+        exit()
+
+    featureList=[i for i,f in enumerate(obj.features) if f.length() >= minLengthParam*obj.length()]
     if featureList==[]:
-        featureList.append(utils.argmaxDict({f.getNum():f.length() for f in obj.features}))
+        featureList.append(utils.argmaxDict({i:f.length() for i,f in enumerate(obj.features)}))
         create = True
     newObjects = []
-    for featureID in featureList:
-        newObjects.append(smoothObjectTrajectory(obj,features,featureID,newNum,smoothing=smoothing,halfWidth=halfWidth,create=create))
+    for featureID in featureList: # featureID should be the index in the list of obj.features
+        newObjects.append(smoothObjectTrajectory(obj, featureID, newNum, smoothing = smoothing, halfWidth = halfWidth, create = create))
 
     newTranslated = moving.Trajectory()
     newInterval = []
@@ -232,7 +239,7 @@
         plt.figure()
         plt.title('objects_id = {}'.format(obj.num))
         for i in featureList:
-            features[i].plot('cx-')
+            obj.features[i].plot('cx-')
         obj.plot('rx-')
         newObj.plot('gx-')        
     return newObj