Problem to convert BitmapSource to bitmap

victor solorzano

New member
Joined
Feb 25, 2014
Messages
1
Programming Experience
Beginner
I want to get a frame with Kinect then convert it to bitmap, use emgucv to convert it in grayscale and then convert that in bitmapsource to show in window! I have the code for that but when I run the program there is a case that the video freeze or lag for a moment!I open task manager I can see that program consume a lot of cpu usage in moments!!I want to know if my code is right or there are another way in order to consume less!! I supposed that is the part I convert to bitmap and in grayscale!

byte[] colorData = null;
WriteableBitmap colorImageBitmap = null;

void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{

using
(ColorImageFrame colorFrame = e.OpenColorImageFrame())
{

if (colorFrame == null) return;

if (colorData == null)
colorData
= new byte[colorFrame.PixelDataLength];

colorFrame
.CopyPixelDataTo(colorData);

if (colorImageBitmap == null)
{
this.colorImageBitmap = new WriteableBitmap(
colorFrame
.Width,
colorFrame
.Height,
96, // DpiX
96, // DpiY
PixelFormats.Bgr32,
null);
}

this.colorImageBitmap.WritePixels(
new Int32Rect(0, 0, colorFrame.Width, colorFrame.Height),
colorData
, // video data
colorFrame
.Width * colorFrame.BytesPerPixel, // stride,
0 // offset into the array - start at 0
);


Image<Gray, Byte> My_Image = new Image<Gray, byte>(BitmapFromSource(colorImageBitmap));
kinectVideo
.Source = ToBitmapSource(My_Image);


}
}



private System.Drawing.Bitmap BitmapFromSource(BitmapSource bitmapsource)
{
System.Drawing.Bitmap bitmap;
using
(MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc
.Frames.Add(BitmapFrame.Create(bitmapsource));
enc
.Save(outStream);
bitmap
= new System.Drawing.Bitmap(outStream);

}
return bitmap;

}

[DllImport("gdi32")]
private static extern int DeleteObject(IntPtr o);


public static BitmapSource ToBitmapSource(IImage image)
{
using
(System.Drawing.Bitmap source = image.Bitmap)
{
IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap

BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
ptr
,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

DeleteObject(ptr); //release the HBitmap
return bs;
}
}

}
 
Top Bottom