[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38116] branches/soc-2011-pepper/release/ scripts/modules/mocap_tools.py: Added denoising function.

Benjy Cook benjycook at hotmail.com
Tue Jul 5 12:55:36 CEST 2011


Revision: 38116
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38116
Author:   benjycook
Date:     2011-07-05 10:55:35 +0000 (Tue, 05 Jul 2011)
Log Message:
-----------
Added denoising function. Uses a type of median filter to smooth out spikes, typical of sensor noise in motion capture data

Modified Paths:
--------------
    branches/soc-2011-pepper/release/scripts/modules/mocap_tools.py

Modified: branches/soc-2011-pepper/release/scripts/modules/mocap_tools.py
===================================================================
--- branches/soc-2011-pepper/release/scripts/modules/mocap_tools.py	2011-07-05 10:35:48 UTC (rev 38115)
+++ branches/soc-2011-pepper/release/scripts/modules/mocap_tools.py	2011-07-05 10:55:35 UTC (rev 38116)
@@ -513,3 +513,37 @@
             print(str(totalt)[:5] + " seconds, total time elapsed")
 
     return
+
+# Implementation of non-linear median filter, with variable kernel size
+# Double pass - one marks spikes, the other smooths one
+# Expects sampled keyframes on everyframe
+
+
+def denoise_median():
+    context = bpy.context
+    obj = context.active_object
+    fcurves = obj.animation_data.action.fcurves
+    medKernel = 1  # actually *2+1... since it this is offset
+    flagKernel = 4
+    highThres = (flagKernel * 2) - 1
+    lowThres = 0
+    for fcurve in fcurves:
+        orgPts = fcurve.keyframe_points[:]
+        flaggedFrames = []
+        # mark frames that are spikes by sorting a large kernel
+        for i in range(flagKernel, len(fcurve.keyframe_points) - flagKernel):
+            center = orgPts[i]
+            neighborhood = orgPts[i - flagKernel: i + flagKernel]
+            neighborhood.sort(key=lambda pt: pt.co[1])
+            weight = neighborhood.index(center)
+            if weight >= highThres or weight <= lowThres:
+                flaggedFrames.append((i, center))
+        # clean marked frames with a simple median filter
+        # averages all frames in the kernel equally, except center which has no weight
+        for i, pt in flaggedFrames:
+            newValue = 0
+            sumWeights = 0
+            neighborhood = [neighpt.co[1] for neighpt in orgPts[i - medKernel: i + medKernel + 1] if neighpt != pt]
+            newValue = sum(neighborhood) / len(neighborhood)
+            pt.co[1] = newValue
+    return




More information about the Bf-blender-cvs mailing list