C# 将ColorImageStream转换为Emgu cv图像

C# 将ColorImageStream转换为Emgu cv图像,c#,visual-studio-2010,kinect,emgucv,C#,Visual Studio 2010,Kinect,Emgucv,我正在使用kinect和emgucv在visual stdio 2010和WPF中!我想从kinect获取帧,并使用emgucv将其转换为灰度,我有 void myKinect_ColorFrameReady(对象发送方,ColorImageFrameReadyEventArgs e) { using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) { if (colorFra

我正在使用kinect和emgucv在visual stdio 2010和WPF中!我想从kinect获取帧,并使用emgucv将其转换为灰度,我有

void myKinect_ColorFrameReady(对象发送方,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;
        }
    }
使用(ColorImageFrame colorFrame=e.OpenColorImageFrame())
{
if(colorFrame==null)返回;
if(colorData==null)
colorData=新字节[colorFrame.PixelDataLength];
CopyPixelDataTo(colorData);
if(colorImageBitmap==null)
{
this.colorImageBitmap=新的WriteableBitmap(
彩色边框,宽度,
色框,高度,
96,//DpiX
96,//DpiY
PixelFormats.Bgr32,
无效);
}
此文件为.colorImageBitmap.WritePixels(
新的Int32Rect(0,0,colorFrame.Width,colorFrame.Height),
colorData,//视频数据
colorFrame.Width*colorFrame.BytesPerPixel,//步长,
0//偏移到数组中-从0开始
);
Image My_Image=新图像(BitmapFromSource(colorImageBitmap));
kinectVideo.Source=ToBitmapSource(我的图片);
}
}
private System.Drawing.Bitmap位图FromWriteableBitMap(WriteableBitmap writeBmp)
{
System.Drawing.bmp;
使用(MemoryStream outStream=新MemoryStream())
{
BitMapEnc=新的BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create((BitmapSource)writeBmp));
加密保存(扩展);
bmp=新系统.绘图.位图(扩展);
}
返回bmp;
}
private System.Drawing.BitmapFromSource位图(BitmapSource BitmapSource)
{
System.Drawing.Bitmap位图;
使用(MemoryStream outStream=新MemoryStream())
{
BitMapEnc=新的BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapsource));
加密保存(扩展);
位图=新系统.绘图.位图(扩展);
}
返回位图;
}
[DllImport(“gdi32”)]
私有静态外部intdeleteObject(IntPtr o);
公共静态位图源到位图源(IImage图像)
{
使用(System.Drawing.Bitmap源=image.Bitmap)
{
IntPtr ptr=source.GetHbitmap();//获取Hbitmap
BitmapSource bs=System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
ptr,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
DeleteObject(ptr);//释放HBitmap
返回bs;
}
}

请参阅和可能重复的示例,我正在使用这些示例,但我的程序消耗了大量内存并崩溃!我不明白why@user2981047这可能是因为您没有使用writeablebitmap,它只需要另一个转换,我将更新代码,但现在!!我的程序占用了很多Cpu,你能看看我的代码吗?