1

kinect を介して 1 人の人物だけを追跡し、その骨格データを追跡したいと同時に、他のプレイヤーではなくそのプレイヤーのみを含むことの深さを示したいと考えています。

ここに添付されているのは、その原因となるコードです。

void mySensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
        {
            if (closing)
                return;

            using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
            {
                if (depthFrame == null)
                {
                    return;
                }
                byte[] pixels = GenerateDepthImage(depthFrame);

                int stride = depthFrame.Width * 4;
                depthImage.Source =
                    BitmapSource.Create(depthFrame.Width, depthFrame.Height,
                    96, 96, PixelFormats.Bgra32, null, pixels, stride);
            }

            //Get a skeleton
            Skeleton first = GetFirstSkeleton(e);

            ProcessSkeletalData(first, e);
        }

深度画像を生成する方法は次のとおりです。

private byte[] GenerateDepthImage(DepthImageFrame depthFrame)
        {
            //get the raw data from kinect with the depth for every pixel
            short[] rawDepthData = new short[depthFrame.PixelDataLength];
            depthFrame.CopyPixelDataTo(rawDepthData);

            //use depthFrame to create the image to display on-screen
            //depthFrame contains color information for all pixels in image
            //Height x Width x 4 (Red, Green, Blue, empty byte)
            Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];

            //Bgr32  - Blue, Green, Red, empty byte
            //Bgra32 - Blue, Green, Red, transparency 
            //You must set transparency for Bgra as .NET defaults a byte to 0 = fully transparent

            //hardcoded locations to Blue, Green, Red (BGR) index positions       
            const int BlueIndex = 0;
            const int GreenIndex = 1;
            const int RedIndex = 2;
            const int AlphaIndex = 3;

            //loop through all distances
            //pick a RGB color based on distance
            for (int depthIndex = 0, colorIndex = 0;
                depthIndex < rawDepthData.Length && colorIndex < pixels.Length;
                depthIndex++, colorIndex += 4)
            {
                //get the player (requires skeleton tracking enabled for values)
                int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;

                //gets the depth value
                int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;

                pixels[colorIndex + BlueIndex] = 255;
                pixels[colorIndex + GreenIndex] = 255;
                pixels[colorIndex + RedIndex] = 255;
                pixels[colorIndex + AlphaIndex] = 0;

                //Color all players
                //Debug.WriteLine(player);
                if (player > 0 )
                {
                    pixels[colorIndex + BlueIndex] = 0;
                    pixels[colorIndex + GreenIndex] = 0;
                    pixels[colorIndex + RedIndex] = 0;
                    pixels[colorIndex + AlphaIndex] = 40;
                }
            }
            return pixels;
        }

GetFirstSkeleton MEthod のコード

Skeleton GetFirstSkeleton(AllFramesReadyEventArgs e)
        {
            using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame())
            {
                if (skeletonFrameData == null)
                    return null;

                skeletonFrameData.CopySkeletonDataTo(allSkeletons);

                //get the first tracked skeleton
                Skeleton first = (from s in allSkeletons
                                  where s.TrackingState == SkeletonTrackingState.Tracked
                                  select s).FirstOrDefault();

                return first;
            }
        }

ここでの問題は、深度画像によって検出された最大 6 人のプレーヤーすべてがあり、スケルトン トラッキングによって 1 つだけが検出され、両方で同じプレーヤーを 1 つだけにしたいことです。

player > 0 から player ==1 に変更したとき、プレイヤーの ID が常に 1 であるとは限らないため、機能しませんでした。

問題を解決する方法はありますか?!

どうもありがとう、マイケル

4

2 に答える 2

0

Kinect は、TrackingState == Tracked で最大 2 つのスケルトンを返し、PositionOnly で 4 つを返します。

スケルトンを追跡するには、プレイヤーに最も近い方法を使用します。

スケルトンから、最初の TrackingState == Tracked と最小の Position.Z 値を保持します。

このようにして、後ろの他のスケルトンを避け、完全に追跡されたものだけに焦点を合わせます.

于 2013-02-21T13:06:48.503 に答える
0

私は見るでしょう:

これらはプレーヤーの検出についてすべて説明しています。次に、そのプレーヤーの深さについてのみ、Kinect SDK を使用したボディのポイント クラウドに注目します。

于 2012-09-16T22:30:31.657 に答える