人気ブログランキング | 話題のタグを見る

SmoothingFilter拡張

以前書いたPointの平滑化をさらに拡張、
一度インスタンスを作れば各JointType全てに平滑処理が走るように実装してみた。
でもコレの違いってやってる人じゃないと分かんないかもしれない。
個人的にはかなりヌルヌル動いてて結果に満足だけど・・・。

以下ソース

using System;
using System.Windows;
using System.Collections.Generic;
using Microsoft.Kinect;

namespace Microsoft.Samples.Kinect.BodyBasics
{
class SmoothingPoint
{
private static Dictionary<JointType, Queue<Point>> pointBufferS = new Dictionary<JointType, Queue<Point>>();
private static Dictionary<JointType, Queue<Point>> pointBufferE = new Dictionary<JointType, Queue<Point>>();

public SmoothingPoint()
{
foreach (JointType jt in Enum.GetValues(typeof(JointType)))
{
pointBufferS.Add(jt, new Queue<Point>());
pointBufferE.Add(jt, new Queue<Point>());
}
}

public Point Smoothing(JointType jType, Point p)
{
return DoubleMovingAverage(jType, p);
}

private Point SimpleAverageFilter(JointType jt, Point newPoint, int parameter)
{
pointBufferS[jt].Enqueue(newPoint);
if (pointBufferS[jt].Count <= parameter)
{
return newPoint;
}
pointBufferS[jt].Dequeue();
Point[] list = pointBufferS[jt].ToArray();
Point point = new Point();
double x = 0;
double y = 0;

int n = pointBufferS[jt].Count;
for (int i = 0; i < pointBufferS[jt].Count; i++)
{
Point p = list[i];
x += p.X;
y += p.Y;
}
point.X = x / n;
point.Y = y / n;

return point;
}

private Point DoubleMovingAverage(JointType jt, Point newPoint, int parameter = 5)
{
Point newSimpleAverage = SimpleAverageFilter(jt, newPoint, parameter);
pointBufferE[jt].Enqueue(newSimpleAverage);
if (pointBufferE[jt].Count <= parameter)
{
return newSimpleAverage;
}
pointBufferE[jt].Dequeue();
Point[] list = pointBufferE[jt].ToArray();
Point point = new Point();
double x = 0;
double y = 0;

int n = pointBufferE[jt].Count;
for (int i = 0; i < pointBufferE[jt].Count; i++)
{
Point p = list[i];
x += p.X;
y += p.Y;
}
point.X = x / n;
point.Y = y / n;

return point;
}
}
}


by onigirism | 2015-12-10 18:26 | C# | Comments(0)
<< VBA死滅せよ Excelの進化による退化 >>