BitmapSource到位图返回Null(EmguCV2.4.2.1777+Kinect)
本文关键字:1777+Kinect EmguCV2 位图 返回 Null BitmapSource | 更新日期: 2023-09-27 17:50:41
Hy,我正在尝试将BitmapSource从Kinect RGB颜色流转换为位图。我变空了。我使用的是Kinect for Windows SDK 1.6、Visual Studio 2012、Windows 7 Ultimate 64位、EmguCV 2.4.2.1777。这是代码:
void _kinect_ColorFrameReady( object sender, ColorImageFrameReadyEventArgs e )
{
using ( ColorImageFrame colorFrame = e.OpenColorImageFrame() )
{
if ( colorFrame == null )
{
return;
}
if ( colorFrame != null )
{
this.colorPixels = new byte[colorFrame.PixelDataLength];
colorFrame.CopyPixelDataTo( this.colorPixels );
int stride = colorFrame.Width * 4;
colorBmp = BitmapSource.Create(
colorFrame.Width,
colorFrame.Height,
96,
96,
PixelFormats.Bgr32,
null,
colorPixels,
stride
);
currentColorFrame = new Image<Bgr, Byte>( colorBmp.ToBitmap() );
this.imgOutput.Source = ImageHelpers.ToBitmapSource( currentColorFrame );
}
}
}
辅助方法:
public static System.Drawing.Bitmap ToBitmap(this BitmapSource bitmapsource)
{
System.Drawing.Bitmap bitmap;
using ( var outStream = new MemoryStream() )
{
// from System.Media.BitmapImage to System.Drawing.Bitmap
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);
/// <summary>
/// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source
/// </summary>
/// <param name="image">The Emgu CV Image</param>
/// <returns>The equivalent BitmapSource</returns>
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;
}
}
请尽快指出我的错误或给我任何建议。
尝试更改ToBitmap方法中的return语句,如下所示。另请参见此处。
return (Bitmap)Image.FromStream(stream)
请注意,ToBitmapSource中的CreateBitmapSourceFromHBitmap可能会导致内存泄漏。请参阅此帖子。有许多其他方法可以将位图转换为BitmapSource,但根据我的经验,没有一种更快。
快速搜索得到了一些关于如何将BitmapSource
转换为Bitmap
的资源。
有没有一种好的方法可以在BitmapSource和Bitmap之间转换?
http://snipplr.com/view/63090/how-to-convert-bitmapsource-to-bitmap/
https://gist.github.com/916300
它们都遵循一个总的主题,尽管略有不同。
由于您使用的是64位操作系统,我希望您也参考了以下文件(对于EMGU CV版本>=2.4(
cudart64_42_9.dll, cvextern.dll, npp64_42_9.dll
如果您不进行64位构建,这将有助于在64位操作系统中使用emgucv。除此之外,您的代码看起来还不错。