mit beiliegendem Code waere ein symmetrischer gleitender Mittelwert realisierbar
sonst kommt es zu grossen Fehlern am Anfang und Ende / mehr im persoenlichen Gespraech Steuerung ueber bool symmetric gf nach aussen legen und False als default, damit alte Ergebnisse sich nicht veraendern.
class MovingAverageSmoother(object):
def __init__(self, num_frames=30):
"""
"""
self.num_frames = num_frames
def smooth(self, trajectory):
symmetric = True # False
nf = int(self.num_frames/2)
smooth_x = []
smooth_y = []
for frame in trajectory:
if trajectory.startframe > frame - nf:
nfstart = frame - trajectory.startframe
else:
nfstart = nf
if trajectory.endframe < frame + nf:
nfend = trajectory.endframe - frame
else:
nfend = nf
nfsym = min(nfstart, nfend)
if symmetric:
min_frame = frame - nfsym
max_frame = frame + nfsym + 1
else:
min_frame = frame - nfstart
max_frame = frame + nfend + 1
#min_frame = max(trajectory.startframe, frame-nf)
#max_frame = min(trajectory.endframe, frame+nf)
#print frame, min_frame, max_frame
distance = max_frame-min_frame
average_point = sum([trajectory[f] for f in range(min_frame, max_frame)]) / distance
smooth_x.append(average_point[0])
smooth_y.append(average_point[1])
smooth_z = trajectory.z_values
return Trajectory(trajectory.person_id, smooth_x, smooth_y, smooth_z, trajectory.frames, trajectory.framerate)