comparison python/objectsmoothing.py @ 644:e54751e71d61

more cleanup
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 10 Apr 2015 16:09:13 +0200
parents 9fe254f11743
children d74e8c175d6b
comparison
equal deleted inserted replaced
643:bfaa6b95dae2 644:e54751e71d61
11 dist[f]= moving.Point.distanceNorm2(feat.getPositionAtInstant(t+1),f.getPositionAtInstant(t)) 11 dist[f]= moving.Point.distanceNorm2(feat.getPositionAtInstant(t+1),f.getPositionAtInstant(t))
12 else: 12 else:
13 dist[f]= moving.Point.distanceNorm2(feat.getPositionAtInstant(t-1),f.getPositionAtInstant(t)) 13 dist[f]= moving.Point.distanceNorm2(feat.getPositionAtInstant(t-1),f.getPositionAtInstant(t))
14 return min(dist, key=dist.get) # = utils.argmaxDict(dist) 14 return min(dist, key=dist.get) # = utils.argmaxDict(dist)
15 15
16 def getFeatures(obj,features,featureID): 16 def getFeatures(obj, featureID):
17 t1,t3 = features[featureID].getFirstInstant(), features[featureID].getLastInstant() 17 first = obj.features[featureID].getFirstInstant()
18 listFeatures=[[features[featureID],t1,t3,moving.Point(0,0)]] 18 last = obj.features[featureID].getLastInstant()
19 featureList=[[obj.features[featureID],first,last,moving.Point(0,0)]]
19 # find the features to fill in the beginning of the object existence 20 # find the features to fill in the beginning of the object existence
20 currentFeature = features[featureID] 21 currentFeature = obj.features[featureID]
21 while t1!=obj.getFirstInstant(): 22 while first != obj.getFirstInstant():
22 delta=listFeatures[-1][3] 23 delta=featureList[-1][3]
23 featureSet = [f for f in obj.features if f.existsAtInstant(t1-1)] 24 featureSet = [f for f in obj.features if f.existsAtInstant(first-1)]
24 feat = findNearest(currentFeature,featureSet,t1-1,reverse=True) 25 feat = findNearest(currentFeature,featureSet,first-1,reverse=True)
25 if feat.existsAtInstant(t1): 26 if feat.existsAtInstant(first):
26 listFeatures.append([feat,feat.getFirstInstant(),t1-1,(currentFeature.getPositionAtInstant(t1)-feat.getPositionAtInstant(t1))+delta]) 27 featureList.append([feat,feat.getFirstInstant(),first-1,(currentFeature.getPositionAtInstant(first)-feat.getPositionAtInstant(first))+delta])
27 else: 28 else:
28 listFeatures.append([feat,feat.getFirstInstant(),t1-1,(currentFeature.getPositionAtInstant(t1)-feat.getPositionAtInstant(t1-1))+delta]) 29 featureList.append([feat,feat.getFirstInstant(),first-1,(currentFeature.getPositionAtInstant(first)-feat.getPositionAtInstant(first-1))+delta])
29 currentFeature = feat 30 currentFeature = feat
30 t1= feat.getFirstInstant() 31 first= feat.getFirstInstant()
31 # find the features to fill in the end of the object existence 32 # find the features to fill in the end of the object existence
32 delta=moving.Point(0,0) 33 delta=moving.Point(0,0)
33 currentFeature = features[featureID] 34 currentFeature = obj.features[featureID]
34 while t3!= obj.getLastInstant(): 35 while last!= obj.getLastInstant():
35 featureSet = [f for f in obj.features if f.existsAtInstant(t3+1)] 36 featureSet = [f for f in obj.features if f.existsAtInstant(last+1)]
36 feat = findNearest(currentFeature,featureSet,t3+1,reverse=False) 37 feat = findNearest(currentFeature,featureSet,last+1,reverse=False)
37 if feat.existsAtInstant(t3): 38 if feat.existsAtInstant(last):
38 listFeatures.append([feat,t3+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(t3)-feat.getPositionAtInstant(t3))+delta]) 39 featureList.append([feat,last+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(last)-feat.getPositionAtInstant(last))+delta])
39 else: 40 else:
40 listFeatures.append([feat,t3+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(t3)-feat.getPositionAtInstant(t3+1))+delta]) 41 featureList.append([feat,last+1,feat.getLastInstant(),(currentFeature.getPositionAtInstant(last)-feat.getPositionAtInstant(last+1))+delta])
41 currentFeature = feat 42 currentFeature = feat
42 t3= feat.getLastInstant() 43 last= feat.getLastInstant()
43 delta=listFeatures[-1][3] 44 delta=featureList[-1][3]
44 return listFeatures 45 return featureList
45 46
46 def buildFeature(obj,features,featureID,num=1): 47 def buildFeature(obj, featureID, num = 1):
47 listFeatures= getFeatures(obj,features,featureID) 48 featureList= getFeatures(obj, featureID)
48 tmp={} 49 tmp={}
49 delta={} 50 delta={}
50 for i in listFeatures: 51 for i in featureList:
51 for t in xrange(i[1],i[2]+1): 52 for t in xrange(i[1],i[2]+1):
52 tmp[t]=[i[0],i[3]] 53 tmp[t]=[i[0],i[3]]
53 newTraj = moving.Trajectory() 54 newTraj = moving.Trajectory()
54 55
55 for instant in obj.getTimeInterval(): 56 for instant in obj.getTimeInterval():
111 t=0 112 t=0
112 for i in sorted(jerk.keys()): 113 for i in sorted(jerk.keys()):
113 t+= jerk[i]* jerk[i] 114 t+= jerk[i]* jerk[i]
114 return t 115 return t
115 116
116 def smoothObjectTrajectory(obj,features,featureID,newNum,smoothing=False,halfWidth=3,create=False): 117 def smoothObjectTrajectory(obj, featureID,newNum,smoothing=False,halfWidth=3,create=False):
117 results=[] 118 results=[]
118 bearing={} 119 bearing={}
119 if create: 120 if create:
120 feature = buildFeature(obj,features,featureID,num=1) 121 feature = buildFeature(obj, featureID , num=1) # why num=1
121 else: 122 else:
122 feature = features[featureID] 123 feature = obj.features[featureID]
123 for t in feature.getTimeInterval(): 124 for t in feature.getTimeInterval():
124 p1= feature.getPositionAtInstant(t) 125 p1= feature.getPositionAtInstant(t)
125 p2= obj.getPositionAtInstant(t) 126 p2= obj.getPositionAtInstant(t)
126 if t!=feature.getLastInstant(): 127 if t!=feature.getLastInstant():
127 p3= feature.getPositionAtInstant(t+1) 128 p3= feature.getPositionAtInstant(t+1)
171 translated.setPosition(-i-1,p2) 172 translated.setPosition(-i-1,p2)
172 173
173 newObj= moving.MovingObject(newNum,timeInterval=feature.getTimeInterval(),positions=translated) 174 newObj= moving.MovingObject(newNum,timeInterval=feature.getTimeInterval(),positions=translated)
174 return newObj 175 return newObj
175 176
176 def smoothObject(obj,features,newNum,minLengthParam=0.7,smoothing=False,plotResults=True,halfWidth=3, _computeVelocities=True,optimize=True,create=False): 177 def smoothObject(obj, newNum, minLengthParam = 0.7, smoothing = False, plotResults = True, halfWidth = 3, _computeVelocities = True, optimize = True, create = False):
177 '''Computes a smoother trajectory for the object 178 '''Computes a smoother trajectory for the object
178 and optionnally smoother velocities 179 and optionnally smoother velocities
179 180
181 The object should have its features in obj.features
180 TODO: check whether features are necessary''' 182 TODO: check whether features are necessary'''
181 featureList=[i.num for i in obj.features if i.length() >= minLengthParam*obj.length()] 183 if len(obj.features) == 0:
184 print('Object {} has an empty list of features: please load and add them using obj.setFeatures(features)'.format(obj.getNum()))
185 from sys import exit
186 exit()
187
188 featureList=[i for i,f in enumerate(obj.features) if f.length() >= minLengthParam*obj.length()]
182 if featureList==[]: 189 if featureList==[]:
183 featureList.append(utils.argmaxDict({f.getNum():f.length() for f in obj.features})) 190 featureList.append(utils.argmaxDict({i:f.length() for i,f in enumerate(obj.features)}))
184 create = True 191 create = True
185 newObjects = [] 192 newObjects = []
186 for featureID in featureList: 193 for featureID in featureList: # featureID should be the index in the list of obj.features
187 newObjects.append(smoothObjectTrajectory(obj,features,featureID,newNum,smoothing=smoothing,halfWidth=halfWidth,create=create)) 194 newObjects.append(smoothObjectTrajectory(obj, featureID, newNum, smoothing = smoothing, halfWidth = halfWidth, create = create))
188 195
189 newTranslated = moving.Trajectory() 196 newTranslated = moving.Trajectory()
190 newInterval = [] 197 newInterval = []
191 for t in obj.getTimeInterval(): 198 for t in obj.getTimeInterval():
192 xCoord=[] 199 xCoord=[]
230 237
231 if plotResults: 238 if plotResults:
232 plt.figure() 239 plt.figure()
233 plt.title('objects_id = {}'.format(obj.num)) 240 plt.title('objects_id = {}'.format(obj.num))
234 for i in featureList: 241 for i in featureList:
235 features[i].plot('cx-') 242 obj.features[i].plot('cx-')
236 obj.plot('rx-') 243 obj.plot('rx-')
237 newObj.plot('gx-') 244 newObj.plot('gx-')
238 return newObj 245 return newObj