0

我正在开发一个项目,我想使用 Kinect 相机 2(SDK v2)和 Emgu 库(2.4.10.1940)。

首先我将 Kinect 转换ColorFrameBitmapSource,然后从转换BitmapSourceDrawing.Bitmap。当我尝试从 转换为Drawing.BitmapImage<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);
            }
        }

4

1 回答 1

1

大家好,我发现了问题并解决了。首先,我忘记将 x86 和 x64 文件夹从 Emgu\bin 复制到 Visual Studio 目录的 Debug 文件夹。此外,转换Media.BitmapSourceEmgu.CV.Image不是最好的主意,因此在阅读了一本书(James Ashley - 使用 Microsoft SDK 开始 Kinect 编程)后,我可以转换Drawing.BitmapEmgu.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);
                
            }
        }

于 2015-06-11T07:39:00.213 回答