最近、Microsoft Kinect for Windows SDK を使用して、デバイスの Kinect を使用して何かをプログラムするようになりました。
特定の手が閉じているか開いているかを検出する方法を見つけるために、お尻をつぶしています。
Kinect for Windows Toolkit を見ましたが、ドキュメントが存在せず、機能させる方法が見つかりません。
手の状況を検出する簡単な方法を知っている人はいますか? Kinect ツールキットを使用する必要がなければ、なおさらです。
これは私が最終的にそれをした方法です:
まず最初に、次のようなダミー クラスが必要です。
public class DummyInteractionClient : IInteractionClient
{
public InteractionInfo GetInteractionInfoAtLocation(
int skeletonTrackingId,
InteractionHandType handType,
double x,
double y)
{
var result = new InteractionInfo();
result.IsGripTarget = true;
result.IsPressTarget = true;
result.PressAttractionPointX = 0.5;
result.PressAttractionPointY = 0.5;
result.PressTargetControlId = 1;
return result;
}
}
次に、メイン アプリケーション コードで、次のようにインタラクション イベント ハンドラーについてアナウンスする必要があります。
this.interactionStream = new InteractionStream(args.NewSensor, new DummyInteractionClient());
this.interactionStream.InteractionFrameReady += InteractionStreamOnInteractionFrameReady;
最後に、ハンドラー自体のコード:
private void InteractionStreamOnInteractionFrameReady(object sender, InteractionFrameReadyEventArgs e)
{
using (InteractionFrame frame = e.OpenInteractionFrame())
{
if (frame != null)
{
if (this.userInfos == null)
{
this.userInfos = new UserInfo[InteractionFrame.UserInfoArrayLength];
}
frame.CopyInteractionDataTo(this.userInfos);
}
else
{
return;
}
}
foreach (UserInfo userInfo in this.userInfos)
{
foreach (InteractionHandPointer handPointer in userInfo.HandPointers)
{
string action = null;
switch (handPointer.HandEventType)
{
case InteractionHandEventType.Grip:
action = "gripped";
break;
case InteractionHandEventType.GripRelease:
action = "released";
break;
}
if (action != null)
{
string handSide = "unknown";
switch (handPointer.HandType)
{
case InteractionHandType.Left:
handSide = "left";
break;
case InteractionHandType.Right:
handSide = "right";
break;
}
if (handSide == "left")
{
if (action == "released")
{
// left hand released code here
}
else
{
// left hand gripped code here
}
}
else
{
if (action == "released")
{
// right hand released code here
}
else
{
// right hand gripped code here
}
}
}
}
}
}
SDK 1.7 では、「グリップ」と呼ばれるインタラクションの概念が導入されています。すべてのKinectInteraction概念については、次のリンクを参照してください: http://msdn.microsoft.com/en-us/library/dn188673.aspx
Microsoft がこれを実装した方法は、KinectRegion. KinectRegionイベントの中には とがHandPointerGripありHandPointerGripRelease、適切なタイミングで発生します。イベントはハンド オーバーの要素から発生しているため、イベント ハンドラーから適切なアクションを簡単に実行できます。
KinectRegionaは何でもよいことに注意してください。基本クラスは であるContentControlため、画像のような単純なものを、操作Grid対象の領域内の複雑なレイアウトに配置できます。
SDK で提供されるControlBasics-WPF の例で、この相互作用の使用方法の例を見つけることができます。
アップデート:
KinectRegionは単に空想ContentControlであり、これは単なるコンテナであり、内部には何でも入れることができます。Kinect for Windows CodePlexControlBasics-WPFの例を見て、ファイル内でを検索してください。その中にいくつかのコントロールがあり、それに基づいて操作されていることがわかります。KinectRegionMainWindow.xaml
Gripこの例でとがどのようGripReleaseに実装されているかを確認するには、Visual Studio でソリューションを開いて "grip" を検索することをお勧めします。私の意見では、彼らのやり方は少し奇妙ですが、非常にうまく流れるクリーンな実装です。
このようなものを使用できます
private void OnHandleHandMove(object source, HandPointerEventArgs args)
{
HandPointer ptr = args.HandPointer;
if (ptr.HandEventType==HandEventType.Grip)
{
// TODO
}
}