2

私はkinectの開発に不慣れで、stackoverflowにも不慣れです!これが私の状況です:

デプスカメラを持っているので、デプスデータを簡単に取得できます。私がやりたいのは、カメラの前に人(プレーヤー)がいることを検出したら、プレーヤーの深度ピクセルのみを抽出し、それを透明な背景に配置して、出力が静止画像になるようにすることです。透明な背景に、プレーヤーの深度画像のみを表示します。

仕事はできますか?私はいくつかの調査を行い、SkeletonToDepthImage()や深度ピクセルデータ(距離とプレーヤーのインデックスを含む)のようないくつかの関数がそうするのに役立つかもしれないことを発見しました。

4

1 に答える 1

1

深度データに基づいて、プレーヤーの輪郭だけを表示して、プレーヤーのシルエットをレンダリングすることを意味していると思います。あれは正しいですか?

Kinect for Windows Developer Toolkitは、まさにこれを行う複数の例を提供します。「グリーンスクリーン」の例は、深度データを抽出してカラーストリームにマッピングし、選択した背景にプレーヤーだけを表示する方法を示しています。「基本的な相互作用」の例には、私があなたが望んでいると解釈していることを正確に実行するシルエットの例があります。

Kinectの基本的な使用シナリオの多くをよく理解するには、Microsoftが提供する例を確認してください。

Basic Interactionsプロジェクトのシルエットの例に基づいて、シルエットコントロールを作成しました。コントロールのコアは、次の2つの機能(つまり、実際にシルエットを生成する機能)で構成されています。

private void OnSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
    {
        if (skeletonFrame != null && skeletonFrame.SkeletonArrayLength > 0)
        {
            if (_skeletons == null || _skeletons.Length != skeletonFrame.SkeletonArrayLength)
            {
                _skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
            }

            skeletonFrame.CopySkeletonDataTo(_skeletons);

            // grab the tracked skeleton and set the playerIndex for use pulling
            // the depth data out for the silhouette.
            // TODO: this assumes only a single tracked skeleton, we want to find the
            // closest person out of the tracked skeletons (see above).
            this.playerIndex = -1;
            for (int i = 0; i < _skeletons.Length; i++)
            {
                if (_skeletons[i].TrackingState != SkeletonTrackingState.NotTracked)
                {
                    this.playerIndex = i+1;
                }
            }
        }
    }
}

private void OnDepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
    using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
    {
        if (depthFrame != null)
        {
            // check if the format has changed.
            bool haveNewFormat = this.lastImageFormat != depthFrame.Format;

            if (haveNewFormat)
            {
                this.pixelData = new short[depthFrame.PixelDataLength];
                this.depthFrame32 = new byte[depthFrame.Width * depthFrame.Height * Bgra32BytesPerPixel];
                this.convertedDepthBits = new byte[this.depthFrame32.Length];
            }

            depthFrame.CopyPixelDataTo(this.pixelData);

            for (int i16 = 0, i32 = 0; i16 < pixelData.Length && i32 < depthFrame32.Length; i16++, i32 += 4)
            {
                int player = pixelData[i16] & DepthImageFrame.PlayerIndexBitmask;
                if (player == this.playerIndex)
                {
                    convertedDepthBits[i32 + RedIndex] = 0x44;
                    convertedDepthBits[i32 + GreenIndex] = 0x23;
                    convertedDepthBits[i32 + BlueIndex] = 0x59;
                    convertedDepthBits[i32 + 3] = 0x66;
                }
                else if (player > 0)
                {
                    convertedDepthBits[i32 + RedIndex] = 0xBC;
                    convertedDepthBits[i32 + GreenIndex] = 0xBE;
                    convertedDepthBits[i32 + BlueIndex] = 0xC0;
                    convertedDepthBits[i32 + 3] = 0x66;
                }
                else
                {
                    convertedDepthBits[i32 + RedIndex] = 0x0;
                    convertedDepthBits[i32 + GreenIndex] = 0x0;
                    convertedDepthBits[i32 + BlueIndex] = 0x0;
                    convertedDepthBits[i32 + 3] = 0x0;
                }
            }

            if (silhouette == null || haveNewFormat)
            {
                silhouette = new WriteableBitmap(
                    depthFrame.Width,
                    depthFrame.Height,
                    96,
                    96,
                    PixelFormats.Bgra32,
                    null);

                SilhouetteImage.Source = silhouette;
            }

            silhouette.WritePixels(
                new Int32Rect(0, 0, depthFrame.Width, depthFrame.Height),
                convertedDepthBits,
                depthFrame.Width * Bgra32BytesPerPixel,
                0);

            Silhouette = silhouette;

            this.lastImageFormat = depthFrame.Format;
        }
    }
}
于 2012-12-10T16:17:59.913 に答える