kinectとk近傍法で物体認識

復習

  • 前回、kinectと最近傍法で物体認識で、Kinectの深度データを使い物体認識を行った。
  • 今回、精度を上げるために、少しだけプログラムを書き換え、k-近傍法を使うことにする。
    • 今回はid:nowokay:20080328さんに習って、k=3にした。

implementation

  • 前回は、NearestNeighborクラスで、最小の誤差のデータを選んだが、今回は、最も近似した3つのデータの中で多数決を行い、答えを推測する。
  • 色々な方法はあるが、以下のフィールドを持つクラスを作って値を突っ込み、ソートすることにした。
    1. 観測地とデータの誤差
    2. 推測された名前index
public class IndexAndDifference: IComparable
{
    public int index;
    public double difference;
    public IndexAndDifference(int _index, double _difference)
    {
        index = _index;
        difference = _difference;
    }
    public int CompareTo(object obj)
    {
        IndexAndDifference Compare = (IndexAndDifference)obj;
        if (this.difference < Compare.difference)
            return -1;
        else if (this.difference > Compare.difference)
            return 1;
        else
            return 0;
    }
}
  • ソートの際に、オブジェクトの比較が行われるため、IComparableインターフェースを実装
    • CompareToをオーバーライドする。
  • 全ての格納されたデータに対してこのクラスオブジェクトをArrayListにいれた後、Listの関数のSort()でソート。
  • そして、最小3つを取り出し多数決を以下のように行った
if (sorted.Count < 3)//データが2つ以下なら多数決を取れないから
{
    index = ((IndexAndDifference)sorted[0]).index;
}
else if (((IndexAndDifference)sorted[1]).index == ((IndexAndDifference)sorted[2]).index)
{
    index = ((IndexAndDifference)sorted[1]).index;
}
else
{
    index = ((IndexAndDifference)sorted[0]).index;
}
return index;
  • こんな感じで、少しは精度上がったかな。
    • データの量に応じてkの数を増やすようにした方がいいのかも。