2014-12-22 3 views
0

Я читаю цветную рамку от датчика Kinect V2 с помощью Microsoft Kinect SDK v2. Я копирую данные фрейма в массив байтов, который позже преобразуется в изображение EmguCV. Ниже приведен фрагмент кода.Изображение повреждено после масштабирования

// A pixel buffer to hold image data from the incoming color frame 
private byte[] pixels = null; 
private KinectSensor kinectSensor = null; 
private ColorFrameReader colorFrameReader = null; 
public KinectForm() 
{ 
    this.kinectSensor = KinectSensor.GetDefault(); 
    this.colorFrameReader = this.kinectSensor.ColorFrameSource.OpenReader(); 
    this.colorFrameReader.FrameArrived += this.Reader_ColorFrameArrived; 
    // create the colorFrameDescription from the ColorFrameSource using Bgra format 
    FrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra); 
    // Create a pixel buffer to hold the frame's image data as a byte array 
    this.pixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * colorFrameDescription.BytesPerPixel]; 
    // open the sensor 
    this.kinectSensor.Open(); 
    InitializeComponent(); 
} 

private void Reader_ColorFrameArrived(object sender, ColorFrameArrivedEventArgs e) 
{ 
    using (ColorFrame colorFrame = e.FrameReference.AcquireFrame()) 
    { 
     if (colorFrame != null) 
     { 
      FrameDescription colorFrameDescription = colorFrame.FrameDescription; 
      if (colorFrame.RawColorImageFormat == ColorImageFormat.Bgra) 
       colorFrame.CopyRawFrameDataToArray(pixels); 
      else 
       colorFrame.CopyConvertedFrameDataToArray(this.pixels, ColorImageFormat.Bgra); 

      //Initialize Emgu CV image then assign byte array of pixels to it 
      Image<Bgr, byte> img = new Image<Bgr, byte>(colorFrameDescription.Width, colorFrameDescription.Height); 
      img.Bytes = pixels; 

      imgBox.Image = img;//Show image in Emgu.CV.UI.ImageBox 
     } 
    } 
} 

Преобразованное изображение повреждено после увеличения более чем на 25%. Пожалуйста, смотрите ниже screenshots-

50% Zoom - 50% Zoom

25% Увеличить - 25% Zoom

12,5% - Увеличить 12.5% Zoom

ответ

1

< TColor> должен быть Bgra, вы можете подтвердить из массива байтов «пикселей».

Редактировать: Поскольку интенсивность цветной рамки Kinect равна 0, изображение не будет видно, поэтому я добавил этот код для решения проблемы, я надеюсь, что есть лучший (более быстрый) способ ее решения.

private void FixIntensity(byte[] p) 
    { 
     int i = 0; 
     while (i < p.Length) 
     { 
      p[i+3] = 255; 
      i += 4; 
     } 
    } 
Смежные вопросы