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 であるとは限らないため、機能しませんでした。
問題を解決する方法はありますか?!
どうもありがとう、マイケル