カテゴリ:C#( 3 )

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;
}
}
}


[PR]
by onigirism | 2015-12-10 18:26 | C# | Comments(0)

修飾子「this」の必要性

VisualStudio2015にしてから行番号の横のところに豆電球が出るようになった。
(もしかすると前からかもしれないけど)
Intellisenseの派生みたいなもんで、ココのコードこうした方がよくね?的なガイド機能。
e0349767_11230093.png
ほんで気になってるのが「this」の存在。
なんかダークカラーのテーマにすると見ての通り、thisの色はやたら暗め。
で、このガイドである。

えっ、もしかしてMSさんthisはいらねーって言ってる?明らかに邪魔者扱いしてない?
そもそも前から思ってたけどthisってマジでいらんだろ。

ということで今さらながら、この謎修飾子について調べてみた。

MSDNより
thisキーワードは、クラスの現在のインスタンスを参照します。拡張メソッドの最初のパラメーターの修飾子としても使用されます。

んなこたぁ分かってんだよ
で、ソース見てみると当たり前なんだけどこういうことになる。


private string name;
private string alias;
private decimal salary = 3000.00m;

// Constructor:
public Employee(string name, string alias)
{

// Use this to qualify the fields, name and alias:
this.name = name;
this.alias = alias;
}


this.name はクラスのメンバのname、ただのnameはEmployeeに与えられた引数のname

要するにコンストラクタのパラメータとメンバ変数が同名な時に、this付けた方はクラスのメンバですよ。

って状況で使うもんらしい。(まぁそりゃそうだな・・・)


こういうことがオブジェクト指向プログラミングのセオリーと言えばそうなんだろうけど

個人的にはあんまりこのやり方は好きじゃないんだよなぁ。

冗長になるから使わない方がすっきりするんだよな・・・。

あるいはややこしいから別の変数名にした方がいい気がするけど、人の好き好きで済ませて良い問題なのかしら。

もちろん大規模システムの開発だったり大人数が関わるプロジェクトだったりの場合は必要なんだろう。

まぁクセとして持っといて損ではないだろうけど。


上の例みたいにシンプルな状況では別の書き方もあるけど、もうちょい詳しく読み下しが必要だなぁコレ。

無いとヤバい!みたいなサンプルはきっとあるだろうから。

とりあえず、「無くてもいい場面では書かなくていい」ってことで。



[PR]
by onigirism | 2015-08-12 11:53 | C# | Comments(0)

ジェネリックコレクション所感

今さらまとめる話でもないのでここには書かないが、一応

こちらのサイト様がすごく参考になる

なんかもう便利だねぇ、ジェネリック何某いうのは。

ListやDictionaryはセオリーだからいいとしても

Queueってのはみんなプログラマ始めてどこで情報仕入れたんだろう、これもメジャーなのかな?

自分がQueueの存在を知ったのは、実はごく最近で
Kinectのスムージングを実装した時の話。
Pointをバッファに貯め込んで毎フレーム順番に平均化した値を算出する部分でQueueが登場した。
ソースは以下のような感じ

private Queue<CameraSpacePoint> pointBuffer = new Queue<CameraSpacePoint>();
private Queue<CameraSpacePoint> pointBuffer2 = new Queue<CameraSpacePoint>();

private CameraSpacePoint SmoothingFilter(CameraSpacePoint newPoint, int parameter=5)
{
pointBuffer.Enqueue(newPoint);
if (pointBuffer.Count <= parameter)
{
return newPoint;
}
pointBuffer.Dequeue();
CameraSpacePoint[] list = pointBuffer.ToArray();
CameraSpacePoint point = new CameraSpacePoint();
float x = 0;
float y = 0;
float z = 0;
int n = pointBuffer.Count;
for (int i = 0; i < pointBuffer.Count; i++)
{
CameraSpacePoint p = list[i];
x += p.X;
y += p.Y;
z += p.Z;
}
point.X = x / n;
point.Y = y / n;
point.Z = z / n;

return point;
}

確か上記もどこかのサイト様を参考にさせていただいた。
あと、この手の処理はCameraSpacePointよりはColorSpacePointの方が多いから
これを丸々Color系に書き換えたソースも作った。CoordinateMapperで変換した後にzが消えるだけなんだけどw
引数のparameterは無くてもいいと思うから、デフォルトで5ぐらい与えてるけど固定でもいい気がする。

てかExciteはjsアップロードできねーのか、ソースがクソみたいな表示だ。
インデントもプレビューがバカっぽくて何かやだなぁ。


[PR]
by onigirism | 2015-08-11 11:00 | C# | Comments(0)