C# 将ColorImageStream转换为Emgu cv图像
我正在使用kinect和emgucv在visual stdio 2010和WPF中!我想从kinect获取帧,并使用emgucv将其转换为灰度,我有 void myKinect_ColorFrameReady(对象发送方,ColorImageFrameReadyEventArgs e) {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
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,你能看看我的代码吗?