我是Kinect和C#的新手。我試圖從Kinect中獲取深度圖像,將其轉換爲位圖以執行一些OpenCV操作,然後顯示它。問題是,我得到的只有深度圖像的三分之一,其餘全部是黑色的(如圖所示)。這不是原始深度圖像,而是繪畫後我收到的圖像。Kinect深度圖像僅部分可見
這裏是代碼 -
圖像和image1的是兩個圖像畫布我有用於顯示。
void DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
DepthImageFrame Image;
Bitmap bm;
using (Image = e.OpenDepthImageFrame())
{
if (Image != null)
{
this.shortpixeldata = new short[Image.PixelDataLength];
this.depthFrame32 = new byte[Image.Width * Image.Height * Bgr32BytesPerPixel];
bmp = new Bitmap(Image.Width, Image.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
Image.CopyPixelDataTo(this.shortpixeldata);
byte[] convertedDepthBits = this.ConvertDepthFrame(this.shortpixeldata, ((KinectSensor)sender).DepthStream);
BitmapData bmapdata = bmp.LockBits(
new System.Drawing.Rectangle(0, 0, Image.Width, Image.Height),
ImageLockMode.WriteOnly,
bmp.PixelFormat);
IntPtr ptr = bmapdata.Scan0;
Marshal.Copy(convertedDepthBits, 0, ptr, Image.PixelDataLength);
bmp.UnlockBits(bmapdata);
MemoryStream ms1 = new MemoryStream();
bmp.Save(ms1, System.Drawing.Imaging.ImageFormat.Jpeg);
System.Windows.Media.Imaging.BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(ms1.ToArray());
bImg.EndInit();
image.Source = bImg;
if (bmp != null)
{
Image<Bgr, Byte> currentFrame = new Image<Bgr, Byte>(bmp);
Image<Gray, Byte> grayImage = currentFrame.Convert<Gray, Byte>().PyrDown().PyrUp();
Image<Gray, Byte> Dest = new Image<Gray, Byte>(grayImage.Size);
CvInvoke.cvCanny(grayImage, Dest, 10, 60, 3);
image1.Source = ToBitmapSource(Dest);
CalculateFps();
}
}
else
{
System.Diagnostics.Debug.WriteLine("depth bitmap empty :/");
}
}
}
private byte[] ConvertDepthFrame(short[] depthFrame, DepthImageStream depthStream)
{
System.Diagnostics.Debug.WriteLine("depthframe len :{0}", depthFrame.Length);
for (int i16 = 0, i32 = 0; i16 < depthFrame.Length && i32 < this.depthFrame32.Length; i16++, i32 += 4)
{
int realDepth = depthFrame[i16] >> DepthImageFrame.PlayerIndexBitmaskWidth;
byte Distance = 0;
int MinimumDistance = 800;
int MaximumDistance = 4096;
if (realDepth > MinimumDistance)
{
//White = Close
//Black = Far
Distance = (byte)(255-((realDepth-MinimumDistance)*255/(MaximumDistance-MinimumDistance)));
this.depthFrame32[i32 + RedIndex] = (byte)(Distance);
this.depthFrame32[i32 + GreenIndex] = (byte)(Distance);
this.depthFrame32[i32 + BlueIndex] = (byte)(Distance);
}
else
{
this.depthFrame32[i32 + RedIndex] = 0;
this.depthFrame32[i32 + GreenIndex] = 150;
this.depthFrame32[i32 + BlueIndex] = 0;
}
}
return this.depthFrame32;
}
我嘗試了不同的PixelFormats無濟於事。我無法弄清楚這個問題。有人知道我在做什麼錯嗎? 謝謝
一旦你有機會,不要忘記接受你的答案。 ;) – weberc2 2013-03-15 20:25:13