使用Kinect将保存的动作与其他动作进行比较

Ewe*_*ton 10 physics gesture kinect

我需要开发一个应用程序,其中用户(物理治疗师)将在Kinect前面执行运动,我将在数据库中写入数据运动,然后患者将尝试模仿此运动.系统将计算记录和执行的运动之间的相似性.

我的第一个想法是,在记录期间(每5秒,例如),存储点的位置(x,y,z),然后在执行时间(按患者)比较它们.

我知道这种方法太简单了,因为我想在不同大小的人中,骨架的识别方式不同,因此比较不可靠.

我的问题是将保存的动作与执行的动作(动态)进行比较的最佳方法.

Lia*_*roy 7

我已经这样做了,医生框架投射到患者框架上,但由于骨骼高度不同,整个骨架不能很好地工作:/.代码可以在这里找到.它是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执行此操作.否则它将无法工作.希望这可以帮助.