繁体   English   中英

将位图图像(Kinect v2)转换为Emgu Image时,“不支持URI格式”

[英]“URI formats are not supported” when converting Bitmap image (Kinect v2) to Emgu Image

我正在一个项目中使用Emgu库(2.4.10.1940)使用Kinect相机2(SDK v2)。

首先,我将Kinect ColorFrame转换为BitmapSource ,然后从BitmapSourceDrawing.Bitmap 当我尝试从Drawing.Bitmap转换为Image<Bgr, Byte> ,出现“ mscorlib.dll中发生类型'System.ArgumentException'的第一次机会异常。附加信息:不支持URI格式”。

有谁有主意,或者有人可以提示我如何用另一种方法来做?

在下面,您将找到我使用的代码。

  public MainWindow() { InitializeComponent(); kinectSensor = KinectSensor.GetDefault(); if (kinectSensor == null) return; FrameDescription colorFrameDescription = kinectSensor.ColorFrameSource.FrameDescription; colorReader = kinectSensor.ColorFrameSource.OpenReader(); colorPixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * BytePerPixel]; colorBitmap = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null); kinectSensor.Open(); colorReader.FrameArrived += colorReader_FrameArrived; kinectSensor.IsAvailableChanged += kinectSensor_IsAvailableChanged; StatusText = kinectSensor.IsAvailable ? "Running" : "Kinect sensor not available"; } void colorReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e) { using (ColorFrame colorFrame = e.FrameReference.AcquireFrame()) { if (colorFrame == null) return; FrameDescription colorFrameDesc = colorFrame.FrameDescription; // Check if the pixelWidth and pixelHeight is right if ((colorFrameDesc.Width == colorBitmap.PixelWidth) && (colorFrameDesc.Height == colorBitmap.PixelHeight)) { // Check if the image format is right. if (colorFrame.RawColorImageFormat == ColorImageFormat.Bgra) colorFrame.CopyRawFrameDataToArray(this.colorPixels); else colorFrame.CopyConvertedFrameDataToArray(this.colorPixels, ColorImageFormat.Bgra); // Write pixels to BitmapSource format colorBitmap.WritePixels(new Int32Rect(0, 0, colorFrameDesc.Width, colorFrameDesc.Height), colorPixels, colorFrameDesc.Width * BytePerPixel, 0); // Convert to Drawing.Bitmap image System.Drawing.Bitmap bmap = BitmapImage2Bitmap(colorBitmap); // Convert to Emgu image (This is where I get my error). Emgu.CV.Image<Bgr, byte> imageFrame = new Image<Bgr,byte>(bmap); } } } private System.Drawing.Bitmap BitmapImage2Bitmap(BitmapSource bitmapImage) { using (MemoryStream outStream = new MemoryStream()) { BitmapEncoder enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitmapImage)); enc.Save(outStream); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream); return new System.Drawing.Bitmap(bitmap); } } 

嗨,我发现了问题并解决了。 首先,我忘记将x86和x64文件夹从Emgu \\ bin复制到Visual Studio目录的Debug文件夹中。 此外,将Media.BitmapSource转换为Emgu.CV.Image也不是最好的主意,因此在阅读一本书(James Emgu.CV.Image使用Microsoft SDK开始Kinect编程)之后,我可以将Drawing.Bitmap转换为Emgu.CV.Image

  private void InitializeKinect() { KinectSensor Sensor = KinectSensor.GetDefault(); FrameDescription frameDescription = Sensor.ColorFrameSource.FrameDescription; ColorFrameReader FrameReader = Sensor.ColorFrameSource.OpenReader(); FrameReader.FrameArrived += FrameReader_FrameArrived; } void FrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e) { using (ColorFrame frame = e.FrameReference.AcquireFrame()) { if (frame == null) return; var width = frame.FrameDescription.Width; var heigth = frame.FrameDescription.Height; var data = new byte[width * heigth * System.Windows.Media.PixelFormats.Bgra32.BitsPerPixel / 8]; frame.CopyConvertedFrameDataToArray(data, ColorImageFormat.Bgra); var bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format32bppRgb); var bitmapData = bitmap.LockBits( new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); Marshal.Copy(data, 0, bitmapData.Scan0, data.Length); bitmap.UnlockBits(bitmapData); Emgu.CV.Image<Bgr, Byte> imageFrame = new Image<Bgr, Byte>(bitmap); } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM