2013-08-15 5 views
0

Я пытаюсь создать противоположное зеркальное изображение из цветового потока, то есть когда правая рука движется вверх, я хочу, чтобы киндекс рисовал левый, чтобы двигаться вверх (в отличие от -front реального зеркала, которое поднимает правая рука), я хочу манипулировать цветным изображением, чтобы сделать это: просто переместив положение X. Тем не менее, я получаю синий экран:Создание oposite Зеркальное изображение, манипулируя Kinect Цветные пиксели

void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) 
    { 
     try 
     { 
       using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame()) 
      { 
       if (colorImageFrame != null) 
       { 
        byte[] pixelsFromFrame = new byte[colorImageFrame.PixelDataLength]; 
        colorImageFrame.CopyPixelDataTo(pixelsFromFrame); 
        Color[] color = new Color[colorImageFrame.Height * colorImageFrame.Width]; 
        kinectRGBVideo = new Texture2D(graphics.GraphicsDevice, colorImageFrame.Width, colorImageFrame.Height); 

        // Go through each pixel and set the bytes correctly 
        // Remember, each pixel got a Rad, Green and Blue 
        int index = 0; 
        for (int y = 0; y < colorImageFrame.Height; y++) 
        { 
         for (int x = 0; x < colorImageFrame.Width; x++, index += 4) 
         { 
          color[(y * colorImageFrame.Width + x)] = new Color(pixelsFromFrame[(y+1)*(2560 -index)], 
           pixelsFromFrame[(y + 1) * (2560 - index)], 
           pixelsFromFrame[(y + 1) * (2560 - index)]); 
         } 
        } 
           // Set pixeldata from the ColorImageFrame to a Texture2D 
        kinectRGBVideo.SetData(color); 


       } 
      } 
     } 
     catch { 


     } 
    } 

Может ли кто-нибудь сказать мне, что такое worng? Благодаря Эрез

ответ

0

код, чтобы создать отражение

unsafe void reflectImage(byte[] colorData, int width, int height) 
{ 
    fixed (byte* imageBase = colorData) 
    { 
     // Get the base position as an integer pointer 
     int* imagePosition = (int*)imageBase; 
     // repeat for each row 
     for (int row = 0; row < height; row++) 
     { 
      // read from the left edge 
      int* fromPos = imagePosition + (row * width); 
      // write to the right edge 
      int* toPos = fromPos + width - 1; 
      while (fromPos < toPos) 
      { 
       *toPos = *fromPos; 
       //copy the pixel 
       fromPos++; // move towards the middle 
       toPos--; // move back from the right edge 
      } 
     } 
    } 
} 

Это делает его так, что байты в toPos и fromPos переключателя сторон, поскольку код фиксирует указатель байт на основе байтов данных изображения а затем создает целочисленный указатель из этого значения. Это означает, что копировать все байты данных для одного пикселя с одного места на другое, программа может использовать одно заявление: *toPos = *fromPos;

Source

+0

это не поменяться байт, значение Топос теперь потеряна когда он перезаписывается fromPos. Чтобы правильно менять значения, вы должны добавить временное целое буфера за пределы циклов, а в цикле - скопировать значение toPos в буфер, а затем назначить fromPos для toPos и, наконец, назначить временное значение fromPos. – catchmeifyoutry

Смежные вопросы