医師のフレームが患者のフレームに投影されるようにしましたが、骨の高さが異なるため、スケルトン全体ではうまく機能しません :/. コードはここにあります。これはベータ 2 コードです。最新バージョンは ここにありますが、現在は完全には機能していません。
比較に関しては、このようなことをしてください
for (int i = 0; i < patientList.Count; i++)
{
int diff = (int)Math.Abs(patientList[i] - doctorList[i]);
if (diff < 100) //or whatever number you want
{
Debug.WriteLine("Good Job");
}
}
Fixus によって言及された骨の高さのために、私は全体の図のアイデアを放棄したので、私の現在のプログラムは次のようになります:

編集
これは、kinect で 2 つの動きを比較し、2 つの動きの類似性を計算するという概念です。詳しく説明します。
点 A (0, 0, 0) と点 B (1, 1, 1) の 2 つの点があるとします。ここで、点 A から点 B までの差を見つけたいので、X、Y、Z のすべての数値を引くと、差は 1 X 1 Y 1 Z になります。これは簡単なことです。今すぐ実装します。私が上に書いたコードは、このように実装します。
//get patient hand coordinates
double patienthandX = Canvas.GetLeft(patienthand);
double patienthandY = Canvas.GetTop(patienthand);
//get doctor hand coordinates
double doctorhandX = Canvas.GetLeft(doctorhand);
double doctorhandY = Canvas.GetTop(doctorhand);
//compare difference for each x and y
//take Absolute value so that it is positive
double diffhandX = Math.Abs(patienthandX - doctorhandX);
double diffhandY = Math.Abs(patienthandY - doctorhandY);
ここで別の問題が発生します。医師の座標は常に同じですが、医師の座標が記録された場所に患者が立っていない場合はどうなるでしょうか。次に、より単純な数学を実装します。この簡単な例を見てみましょう。点 A(8, 2) を点 B(4, 12) に移動するとします。A の x と y を掛けると B になります。X を 0.5 倍し、Y を 6 倍します。Kinect の場合、患者の腰に要素を配置し、これを医師の腰と比較します。 . 次に、すべてのドクター ジョイントにその数を掛けて、患者の上にドクター ジョイントを (多かれ少なかれ) 配置します。例えば
double whatToMultiplyX = (double) doctorhipX / patienthipX;
double whatToMultiplyY = (double) doctorhipY / patienthipY;
これはすべて非常に単純ですが、それをまとめるのが難しい部分です。これまでのところ、1) 医師のフレームを患者のフレームの上にスケーリングし、2) 差を計算します。3) レップ全体の違いを比較します。4) 次の担当者のためにリセットします。これは単純に思えますが、そうではありません。担当者の差全体を計算するには、次のようにします。
//get patient hand coordinates
double patienthandX = Canvas.GetLeft(patienthand);
double patienthandY = Canvas.GetTop(patienthand);
//get doctor hand coordinates
double doctorhandX = Canvas.GetLeft(doctorhand);
double doctorhandY = Canvas.GetTop(doctorhand);
//compare difference for each x and y
//take Absolute value so that it is positive
double diffhandX = Math.Abs(patienthandX - doctorhandX);
double diffhandY = Math.Abs(patienthandY - doctrorhandY);
//+= so that it keeps adding to it.
totaldiffhandX += diffhandX;
totaldiffhandY += diffhandY;
これで比較して、次のように言えます。
if (totaldiffhandX < 1000 && totaldiffhandY < 1000) //keep numbers pretty high since it is an entire rep
{
//reset difference
totaldiffhandX = 0;
totaldiffhandY = 0;
//tell the patient good job
Debug.WriteLine("Good Job");
}
これは非常に簡単ですが、すべてのジョイントの x と y に対してこれを行う必要があることに注意してください。そうしないと機能しません。お役に立てれば。