简体   繁体   English

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

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

I am working on an project where I want to use Kinect camera 2 (SDK v2), with Emgu library (2.4.10.1940). 我正在一个项目中使用Emgu库(2.4.10.1940)使用Kinect相机2(SDK v2)。

First I converted the Kinect ColorFrame to BitmapSource and then from BitmapSource to Drawing.Bitmap . 首先,我将Kinect ColorFrame转换为BitmapSource ,然后从BitmapSourceDrawing.Bitmap When I try to convert from Drawing.Bitmap to Image<Bgr, Byte> , I get an "A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll. Additional information: URI formats are not supported". 当我尝试从Drawing.Bitmap转换为Image<Bgr, Byte> ,出现“ mscorlib.dll中发生类型'System.ArgumentException'的第一次机会异常。附加信息:不支持URI格式”。

Does anyone has an idea, or can someone prompt me of how I can do it with another way? 有谁有主意,或者有人可以提示我如何用另一种方法来做?

Below you will find the code I used. 在下面,您将找到我使用的代码。

  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); } } 

Hi guys I found the problem and solve it. 嗨,我发现了问题并解决了。 First I forgot to copy the x86 and x64 folders from Emgu\\bin to Debug folder of the Visual Studio directory. 首先,我忘记将x86和x64文件夹从Emgu \\ bin复制到Visual Studio目录的Debug文件夹中。 Moreover, converting Media.BitmapSource to Emgu.CV.Image isn't the best idea so after reading a book (James Ashley - Beginning Kinect Programming with Microsoft SDK) I could convert Drawing.Bitmap to Emgu.CV.Image . 此外,将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