質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

1回答

2015閲覧

Kinect ある骨格の座標情報の取得

bigb

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0グッド

0クリップ

投稿2018/01/25 02:59

前提・実現したいこと

Kinectで現在認識している骨格情報の中で、ある特定の骨格の座標を取得したいです。
その取得したx,y,z座標を利用したいのですが、座標の取得方法がわかりません。

現在骨格の認識はできているのですが、座標を取得しようと記述を加えるとエラーが発生してしまいます。

発生している問題・エラーメッセージ

Joint rightHand = skeleton.Joints[JointType.HandRight]; //上記のskeletonの部分が利用できず、座標の値を取得できません。 double rightX = rightHand.Position.X; double rightY = rightHand.Position.Y; double rightZ = rightHand.Position.Z;

該当のソースコード

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Diagnostics; using Microsoft.Kinect; namespace KinectV3 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { KinectSensor kinect; ColorFrameReader colorFrameReader; FrameDescription colorFrameDesc; byte[] colorBuffer; BodyFrameReader bodyFrameReader; Body[] bodies; public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { try { kinect = KinectSensor.GetDefault(); if (kinect == null) { throw new Exception("Kinectを開けません"); } kinect.Open(); // カラー画像の情報を作成する(BGRAフォーマット) colorFrameDesc = kinect.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra); // カラーリーダーを開く colorFrameReader = kinect.ColorFrameSource.OpenReader(); colorFrameReader.FrameArrived += colorFrameReader_FrameArrived; // Bodyを入れる配列を作る bodies = new Body[kinect.BodyFrameSource.BodyCount]; // ボディーリーダーを開く bodyFrameReader = kinect.BodyFrameSource.OpenReader(); bodyFrameReader.FrameArrived += bodyFrameReader_FrameArrived; } catch (Exception ex) { MessageBox.Show(ex.Message); Close(); } } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (colorFrameReader != null) { colorFrameReader.Dispose(); colorFrameReader = null; } if (bodyFrameReader != null) { bodyFrameReader.Dispose(); bodyFrameReader = null; } if (kinect != null) { kinect.Close(); kinect = null; } } void colorFrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e) { // カラーフレームを取得する using (var colorFrame = e.FrameReference.AcquireFrame()) { if (colorFrame == null) { return; } // BGRAデータを取得する colorBuffer = new byte[colorFrameDesc.Width * colorFrameDesc.Height * colorFrameDesc.BytesPerPixel]; colorFrame.CopyConvertedFrameDataToArray(colorBuffer, ColorImageFormat.Bgra); // ビットマップにする ImageColor.Source = BitmapSource.Create(colorFrameDesc.Width, colorFrameDesc.Height, 96, 96, PixelFormats.Bgra32, null, colorBuffer, colorFrameDesc.Width * (int)colorFrameDesc.BytesPerPixel); } } void bodyFrameReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e) { UpdateBodyFrame(e); DrawBodyFrame(); } // ボディの更新 private void UpdateBodyFrame(BodyFrameArrivedEventArgs e) { using (var bodyFrame = e.FrameReference.AcquireFrame()) { if (bodyFrame == null) { return; } // ボディデータを取得する bodyFrame.GetAndRefreshBodyData(bodies); } } // ボディの表示 private void DrawBodyFrame() { CanvasBody.Children.Clear(); foreach (var body in bodies.Where(b => b.IsTracked)) { foreach (var joint in body.Joints) { // 手の位置が追跡状態 if (joint.Value.TrackingState == TrackingState.Tracked) { DrawEllipse(joint.Value, 10, Brushes.Blue); // 左手を追跡していたら、手の状態を表示する if (joint.Value.JointType == JointType.HandLeft) { DrawHandState(body.Joints[JointType.HandLeft], body.HandLeftConfidence, body.HandLeftState); } // 右手を追跡していたら、手の状態を表示する else if (joint.Value.JointType == JointType.HandRight) { DrawHandState(body.Joints[JointType.HandRight], body.HandRightConfidence, body.HandRightState); } } // 手の位置が推測状態 else if (joint.Value.TrackingState == TrackingState.Inferred) { DrawEllipse(joint.Value, 10, Brushes.Yellow); } } } } private void DrawHandState(Joint joint, TrackingConfidence trackingConfidence, HandState handState) { // 手の追跡信頼性が高い if (trackingConfidence != TrackingConfidence.High) { return; } // 手が開いている(パー) if (handState == HandState.Open) { DrawEllipse(joint, 40, new SolidColorBrush(new Color() { R = 255, G = 255, A = 128 })); } // チョキのような感じ else if (handState == HandState.Lasso) { DrawEllipse(joint, 40, new SolidColorBrush(new Color() { R = 255, B = 255, A = 128 })); } // 手が閉じている(グー) else if (handState == HandState.Closed) { DrawEllipse(joint, 40, new SolidColorBrush(new Color() { G = 255, B = 255, A = 128 })); } } private void DrawEllipse(Joint joint, int R, Brush brush) { var ellipse = new Ellipse() { Width = R, Height = R, Fill = brush, }; // カメラ座標系をColor座標系に変換する var point = kinect.CoordinateMapper.MapCameraPointToColorSpace(joint.Position); if ((point.X < 0) || (point.Y < 0)) { return; } // Color座標系で円を配置する Canvas.SetLeft(ellipse, point.X - (R / 2)); Canvas.SetTop(ellipse, point.Y - (R / 2)); CanvasBody.Children.Add(ellipse); } } }

試したこと

どこに問題の記述を加えればいいかわからず、
private void checkSkeleton(Skeleton skeleton){
などで追加しようともしましたが、Skeleton自体が利用できないので、次に進むことができません。

参照を追加するなどでこのエラーが発生しているのかと思い、現在利用しているもの以外に
kinectに関する参照の追加も行ってみたりしましたが、わかりませんでした。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2013 Community, WPFアプリケーション

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

提示のコードはどかからか入手したサンプルですか?
urlを追記すると、もっと回答が得られるかもしれません。

内容は異なりますが、以下が参考にならないでしょうか?
Kinect for Windows SDK でスケルトンを表示する(C# + WPF)

投稿2018/01/25 08:20

編集2018/01/25 08:21
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/01/26 02:05

そのurlにはスケルトンのサンプルが無いですね。 別々のソリューションになってますし、私が引用したサンプルをベースにされればどうですか? 初期化部分で必要なStreamを有効にするだけで良いようになっているみたいですし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問