###前提・実現したいこと
Visual studioの環境にて、Kinectv2.0を操作するプログラムを記述しています。
具体的に説明しますと、SDK browser v2.0にもともと入っているBodyBasics-WPFというサンプルプログラムをいじり、kinectの目の前にて一人の人間が腕を前にだし手前にひく動作をするとある動作が行われるというものです。今回は、メールを送信するという目標ですがそこはすでにクリアされているので省きます。
###発生している問題・エラーメッセージ
エラーメッセージなどは特になくサンプルプログラムの解析やアルゴリズムの製作に難航しています。今一人の人を認識し、手の動作に合わせ、checkPostureという関数の中でzの値を動きに合わせ増やしていくということができています。しかし、これはkinectが二人の人を同時に認識している場合うまくいかないのです。ですので、二人の人をkinectが認識している場合にどのような処理が内部的に処理され、どこを使えば制御できるか教えて頂けると幸いです。bodiesという配列が怪しいのではないかと個人的に睨んでやってみたりもしましたがうまくいきませんでした。プログラミング能力が私自身低いため、初心者にもわかりやすい簡単なお言葉で説明頂けると嬉しいです。宜しくお願い致します。
文字数オーバーの為サンプルプログラムをいじった部分だけ添付いたします。
エラーメッセージ
###該当のソースコード
foreach (JointType jointType in joints.Keys) { // sometimes the depth(Z) of an inferred joint may show as negative // clamp down to 0.1f to prevent coordinatemapper from returning (-Infinity, -Infinity) CameraSpacePoint position = joints[jointType].Position; if (position.Z < 0) { position.Z = InferredZPositionClamp; } DepthSpacePoint depthSpacePoint = this.coordinateMapper.MapCameraPointToDepthSpace(position); jointPoints[jointType] = new Point(depthSpacePoint.X, depthSpacePoint.Y); } this.DrawBody(joints, jointPoints, dc, drawPen); this.DrawHand(body.HandLeftState, jointPoints[JointType.HandLeft], dc); this.DrawHand(body.HandRightState, jointPoints[JointType.HandRight], dc); this.checkPosture(joints, this.bodies[0].HandRightState, jointPoints[JointType.SpineMid], jointPoints[JointType.HandRight], JointType.HandRight, JointType.ElbowRight); if (x==0) {//一人を認識したら認識し終わるまで繰り返せないように設定 this.checkPosture2(joints, this.bodies[1].HandRightState, jointPoints[JointType.SpineMid], jointPoints[JointType.HandRight], JointType.HandRight, JointType.ElbowRight); } } } // prevent drawing outside of our render area this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, this.displayWidth, this.displayHeight)); } } } private void checkPosture(IReadOnlyDictionary<JointType, Joint> joints, HandState handState, Point SpinePoint, Point righthandPoint, JointType hand, JointType elbow) { Joint jh = joints[hand]; Joint je = joints[elbow]; int y = x; if (SpinePoint.Y > righthandPoint.Y) { if ((je.Position.Z - jh.Position.Z > 0.2))//&& (handState == HandState.Lasso)) { //x = 0; flag = 1; } else if ((jh.Position.Z > je.Position.Z)) { if (flag == 1) { //x = 1; flag = 0; //if (y != x) //{ z++; //MailSend.Mailsend.Send(); //} } } } else { flag = 0; //x = 0; } this.Text.Text = flag.ToString(); this.Textbox2.Text = z.ToString(); //this.Textbox3.Text = flag.ToString(); //this.Textbox4.Text = z.ToString(); } private void checkPosture2(IReadOnlyDictionary<JointType, Joint> joints, HandState handState, Point SpinePoint, Point righthandPoint, JointType hand, JointType elbow) { Joint jh = joints[hand]; Joint je = joints[elbow]; int y = x; if (SpinePoint.Y > righthandPoint.Y) { if ((je.Position.Z - jh.Position.Z > 0.2))//&& (handState == HandState.Lasso)) { //x = 0; flag = 1; } else if ((jh.Position.Z > je.Position.Z)) { if (flag == 1) { //x = 1; flag = 0; //if (y != x) //{ z++; //MailSend.Mailsend.Send(); x = 0;//認識完了したので制限を解除 //} } } x = 1;//フラグがたっているときに他の人をご認識しないようにする } else { flag = 0; //x = 0; } this.Textbox3.Text = flag.ToString(); this.Textbox4.Text = z.ToString(); } }
}
###試したこと checkPosture2などの関数を作り二つの別な関数で二人の人の動きを積御しようとした。 bodiesという配列の中身である、bodies[0]などを checkPostureの関数の引数に当てたりなどした。 ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
あなたの回答
tips
プレビュー