Ewe*_*ton 10 physics gesture kinect
我需要开发一个应用程序,其中用户(物理治疗师)将在Kinect前面执行运动,我将在数据库中写入数据运动,然后患者将尝试模仿此运动.系统将计算记录和执行的运动之间的相似性.
我的第一个想法是,在记录期间(每5秒,例如),存储点的位置(x,y,z),然后在执行时间(按患者)比较它们.
我知道这种方法太简单了,因为我想在不同大小的人中,骨架的识别方式不同,因此比较不可靠.
我的问题是将保存的动作与执行的动作(动态)进行比较的最佳方法.
我已经这样做了,医生框架投射到患者框架上,但由于骨骼高度不同,整个骨架不能很好地工作:/.代码可以在这里找到.它是beta 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");
}
}
Run Code Online (Sandbox Code Playgroud)
由于Fixus提到的骨骼高度,我已经放弃了整个人物的想法,因此我当前的程序看起来像:

编辑
这是用kinect训练两个运动的概念,并计算我深入解释的两个运动之间的相似性.
假设我有以下2点,点A(0,0,0)和点B(1,1,1).现在我想找到从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);
Run Code Online (Sandbox Code Playgroud)
现在又来了另一个问题.医生的坐标总是一样的,但如果患者没有站在医生坐标记录的位置怎么办?现在我们实现更简单的数学.举个简单的例子吧.假设我想要点A(8,2)移动到B点(4,12).你将A的x和y乘以得到B.所以我将X乘以.5,将Y乘以6.所以对于Kinect,我会在患者臀部放一个元素,然后将其与医生臀部进行比较.然后将所有医生关节乘以该数字,以实现患者顶部的医生关节(或多或少).例如
double whatToMultiplyX = (double) doctorhipX / patienthipX;
double whatToMultiplyY = (double) doctorhipY / patienthipY;
Run Code Online (Sandbox Code Playgroud)
这一切都非常简单,但将它组合在一起是更难的部分.到目前为止,我们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;
Run Code Online (Sandbox Code Playgroud)
现在我们可以比较,并说:
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");
}
Run Code Online (Sandbox Code Playgroud)
这非常简单,但请记住,您必须为每个关节的x和y执行此操作.否则它将无法工作.希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
3425 次 |
| 最近记录: |