1

オブジェクトの移動にkinectを使用するWPF/C#アプリを作成していますが、マウスを使用しても実行されます。現在、マウスを使用して動作するkinectコードをコメントアウトしています。kinectが接続されているかどうかを認識する方法が必要なので、接続されていないときにマウスを使用し(現在のように例外をスローせずに)、接続されているときにkinectを使用するために、コードをコメントアウトする必要はありません。どうすればいいですか?情報:公式のMicrosoft Kinect SDKを使用しています(約1週間前にダウンロード)

編集-私はこれらを使用しています

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
using System.Windows.Media.Media3D;
using System.Windows.Media.Animation;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using GridAnimationDemo;
using System.Windows.Threading;
using HtmlAgilityPack;
using System.Xml.Linq;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Net;
using Microsoft.Research.Kinect.Nui;
using Microsoft.Research.Kinect.Audio;
using Microsoft.Research.Kinect;
using Microsoft.Office.Interop.PowerPoint;
using System.Windows.Data;
using Microsoft.Research.Kinect.Samples.CursorControl;
using Coding4Fun.Kinect.Wpf;
using Coding4Fun;
using System.Speech.Synthesis;

これらの一部との競合が発生するため、参照を追加してMicrosoft.Kinectを使用することはできません

編集 -

Device dvc = new Device();
            if (dvc.Count.Equals(0))
                MessageBox.Show("apoellin");

上記のコードを試しましたが、Kinectが接続されていない状態でKinectコードを使用すると、アプリがクラッシュするのと同じエラーが発生します

4

4 に答える 4

5

これは、「MicrosoftSDKを使用したKinectプログラミングの開始」という本のコードです。これはこれを適切に処理します。

// (in your page/window constructor):

this.KinectDevice = KinectSensor.KinectSensors
.FirstOrDefault(x => x.Status == KinectStatus.Connected);

// (and create a property like this:)

public KinectSensor KinectDevice
{
get { return this._KinectDevice; }
set
{
if (this._KinectDevice != value)
{
//Uninitialize
if (this._KinectDevice != null)
{
this._KinectDevice.Stop();
this._KinectDevice.SkeletonFrameReady -= KinectDevice_SkeletonFrameReady;
this._KinectDevice.SkeletonStream.Disable();
this._FrameSkeletons = null;
}

this._KinectDevice = value;

//Initialize
if (this._KinectDevice != null)
{
if (this._KinectDevice.Status == KinectStatus.Connected)
{
this._KinectDevice.SkeletonStream.Enable();
this._FrameSkeletons = new
Skeleton[this._KinectDevice.SkeletonStream.FrameSkeletonArrayLength];
this.KinectDevice.SkeletonFrameReady +=
KinectDevice_SkeletonFrameReady;
ColorImageStream colorStream = this._KinectDevice.ColorStream;
colorStream.Enable();
this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth,
colorStream.FrameHeight, 96, 96, PixelFormats.Bgr32, null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth,
colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel;
ColorImageElement.Source = this._ColorImageBitmap;
this._KinectDevice.ColorFrameReady += Kinect_ColorFrameReady;

this.ColorImageElement.Dispatcher.BeginInvoke(new Action(() =>
{
this._ColorImageBitmap = new WriteableBitmap(colorStream.FrameWidth,
colorStream.FrameHeight,
96, 96, PixelFormats.Bgr32,
null);
this._ColorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth,
colorStream.FrameHeight);
this._ColorImageStride = colorStream.FrameWidth *
colorStream.FrameBytesPerPixel;
this._ColorImagePixelData = new byte[colorStream.FramePixelDataLength];

this.ColorImageElement.Source = this._ColorImageBitmap;
}));
this._KinectDevice.Start();
}
}
}
}
}
于 2012-11-16T17:26:32.267 に答える
2

最新のWindowsSDKを使用している場合は、の値を確認できますRuntime.Kinects.Count

値が0の場合、Kinectは接続されていません-

if (Runtime.Kinects.Count == 0)
{
    // No Kinects are connected
}
else
{
    // Kinect is connecetd
}
于 2012-11-13T12:10:00.367 に答える
2

非常に古いバージョンのKinectforWindowsSDKを使用しています。名前Microsoft.Research.Kinect空間はベータ版のものです。

最新のSDKはここからダウンロードできます。

http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx

その後、上記のリンクからも入手できるDeveloperToolkitをダウンロードします。多くのタスクを実行する方法の複数の例が含まれています。

Kinectエクスプローラーの例を確認することを強くお勧めします。これは、KinectSensorManagerと呼ばれるデータコンテナの使用方法を示しています。このクラスはデータラッパーであり、SDKの一部ではありません。Kinectセンサーの管理に役立ちます。これは、ツールキットのいくつかの例に含まれています。

このクラスは、特に、Kinectセンサーの状態が変化したときにイベントを発生させます。したがって、適切なイベントハンドラーでKinectを初期化および非初期化するようにプログラムを設定できます。

于 2012-11-13T14:59:17.070 に答える
2

Kinect2.0SDKの回答を追加したいと思います。残念ながら、SDKには、Runtimeデバイスを一覧表示するための名前空間やその他の方法がありません。ただし、WMIを使用して、Kinect2.0が接続されているかどうかを判断できます。

これを機能させるには、System.Managementライブラリへの参照を追加する必要があります。

public static bool IsConnected()
{            
    // Use WMI to find devices with the proper hardware id for the Kinect2
    // note that one Kinect2 is listed as three harwdare devices    
    string query = String.Format(WmiQuery, HardwareId);
    using (var searcher = new ManagementObjectSearcher(query))
    {
        using (var collection = searcher.Get())
        {
            return collection.Count > 0;
        }
    }            
}

private const string HardwareId = @"VID_045E&PID_02C4";
private const string WmiQuery = @"SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE '%{0}%'";

アップデート、MicrosoftはKinect 2 for Windowsを廃止し、XboxOneのKinectfor Windowsを使用しているため、すべてのKinect2が同じIDを使用しているわけではないことがわかりました。現在、これらのIDを使用しています。これはうまくいくようです。

<!-- Kinect 2 For Xbox -->
USB\VID_045E&PID_02C4
<!-- Kinect 2 For Windows -->
USB\VID_045E&PID_02D9
于 2015-01-29T11:07:21.920 に答える