J'essaye de produire une image de la kinect où tous les pixels qui ne représentent pas un joueur seront mis au noir.Profondeur de Kinect avec l'index de joueur + flux visuel
Mon idée est d'utiliser les données produites par le depthstream avec l'index du lecteur avec le flux vidéo pour accomplir cette tâche.
Mon espoir était de faire quelque chose comme ceci:
byte[] pixelData = video.imageFrame.Bits;
byte[] depthData = depth.imageFrame.Bits;
var depthIndex = 0;
for (var y = 0; y < height; y++)
{
var heightOffset = y * width;
for (var x = 0; x < width; x++)
{
var index = (x + heightOffset) * 4;
var distance = GetDistanceWithPlayerIndex(depthData[depthIndex], depthData[depthIndex + 1]);
if (GetPlayerIndex(depthData[depthIndex]) == 0)
{
pixelData[index + BlueIndex] = 0;
pixelData[index + GreenIndex] = 0;
pixelData[index + RedIndex] = 0;
}
}
}
La question que je travaille actuellement sur elle en essayant d'obtenir les données de VideoStream d'avoir la même résolution que le depthwithplayerindex.
J'ai essayé de reconstituer des choses ensemble d'autres messages ici mais je ne peux pas le faire fonctionner:
private byte[] ScaleVideoImage(ImageFrame imageFrame, int newWidth, int newHeight)
{
//convert imageFrame to byte array
Byte[] oPixelData = imageFrame.Image.Bits;
Image tempImage = BytesToImg(oPixelData);
//scale image
Bitmap bmp = new Bitmap(newWidth, newHeight);
using (Graphics graphics = Graphics.FromImage(bmp))
{
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.DrawImage(tempImage, 0, 0, bmp.Width, bmp.Height);
}
//Convert image to byte array
MemoryStream ms1 = new MemoryStream();
bmp.Save(ms1, ImageFormat.Jpeg);
byte[] result = ms1.GetBuffer();
bmp.Dispose();
ms1.Close();
return result;
}
Toutes les idées?