0

I am using kinect with emgucv in visual stdio 2010 with WPF!I want to get frame from kinect and convert it in grayscale using emgucv I have that!

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 BitmapFromWriteableBitmap(WriteableBitmap writeBmp)
    {
        System.Drawing.Bitmap bmp;
        using (MemoryStream outStream = new MemoryStream())
        {
            BitmapEncoder enc = new BmpBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create((BitmapSource)writeBmp));
            enc.Save(outStream);
            bmp = new System.Drawing.Bitmap(outStream);
        }
        return bmp;
    }

    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;
        }
    }
  • See http://stackoverflow.com/questions/3751715/convert-bitmapsource-to-image and http://stackoverflow.com/questions/2950392/conversion-to-grayscale-using-emgucv-in-c-sharp – Liam McInroy Feb 25 '14 at 00:29
  • possible duplicate of [Using Kinect with Emgu CV](http://stackoverflow.com/questions/11821575/using-kinect-with-emgu-cv) – Prabindh Feb 25 '14 at 00:49
  • I am using that examples but my program consum a lot of memory and crash!I dont understand why – user2981047 Feb 25 '14 at 01:54
  • @user2981047 This is probably because you are not using a writeablebitmap, which just requires another conversion – Liam McInroy Feb 25 '14 at 23:42
  • Yes, I will update the code but now!!My program consume a lot of Cpu usage, can you look my code? – user2981047 Feb 25 '14 at 23:56

0 Answers0