復習
- 前回、kinectと最近傍法で物体認識で、Kinectの深度データを使い物体認識を行った。
- 今回、精度を上げるために、少しだけプログラムを書き換え、k-近傍法を使うことにする。
implementation
- 前回は、NearestNeighborクラスで、最小の誤差のデータを選んだが、今回は、最も近似した3つのデータの中で多数決を行い、答えを推測する。
- 色々な方法はあるが、以下のフィールドを持つクラスを作って値を突っ込み、ソートすることにした。
- 観測地とデータの誤差
- 推測された名前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インターフェースを実装
- 全ての格納されたデータに対してこのクラスオブジェクトをArrayListにいれた後、Listの関数のSort()でソート。
- そして、最小3つを取り出し多数決を以下のように行った
if (sorted.Count < 3)
{
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の数を増やすようにした方がいいのかも。