Click here to Skip to main content
15,881,600 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am working on an project where I want to use Kinect camera 2 (SDK v2), with Emgu library (2.4.10.1940).

First I converted the Kinect ColorFrame to BitmapSource and then from BitmapSource to Drawing.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".

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.
C#
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);
            }
        }
Posted

1 solution

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. 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.

C#
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,> imageFrame = new Image<bgr,>(bitmap);
                
            }
        }
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900