2016-08-08 33 views
1

EDIT: Die Frage war nicht klar, sorry, ich aktualisiert und fügte Details hinzu.Wie kann ich einen Puffer vertikal während einer YUV in RGB-Konvertierung spiegeln

Ich habe einen Puffer mit Bilddaten (YUV-Format), die ich in ein RGB-Format umwandeln. Das Problem ist, ich möchte das Bild vertikal spiegeln (Y-Position umkehren).

Was ich im Moment tun kann, ist meine YUV-Daten in RGB-Daten in einem Puffer zu konvertieren, dann diesen Puffer vertikal zu spiegeln.

Hier ist der Arbeits Code hierfür:

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char *flippedCopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 


    //Conversion from YUV to RGB 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
     unsigned char v = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char u = pData[j+2]; 

     mycopy[i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[i] = 1.0*y + 1.772*(u-128) + 0;       // b 

     y = pData[j+3]; 
     mycopy[i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[i+3] = 1.0*y + 1.772*(u-128) + 0; 
    } 

    //Vertical flip 

    for (int i = 0; i < width; ++i) { 
     for (int j = 0; j < height; ++j) { 
      for (int k = 0; k < 3; ++k) { 
       flippedCopy[(i + j * width) * 3 + k] = mycopy[(i + (height - 1 - j) * width) * 3 + k]; 
      } 
     } 
    } 

    return flippedCopy; 
} 

Was ich Leistung zu gewinnen tun möchte, ist der Puffer WÄHREND die Umwandlung von YUV auf RGB-Flip. Ich hatte keine Ahnung, wie es und Yusuf Antwort zu tun haben mir geholfen, hier so ist das, was ich im Moment habe:

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 
    int k = height - 1; 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
      unsigned char v = pData[j]; 
      unsigned char y = pData[j+1]; 
      unsigned char u = pData[j+2]; 

      mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
      mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
      mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;       // b 

      y = pData[j+3]; 
      mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
      mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
      mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0; 

      if (<i multiple of (width*3)-1>){ 
       k = k - 2; 
      } 

    } 

    return mycopy; 
} 

Wenn ich richtig, dies sollte funktionieren, vorausgesetzt, die if Bedingung richtig ist. Aber ich weiß nicht, wie dieser if Zustand zum Ausdruck bringen, da i um 6 jedes Mal erhöht wird, so dass ich vielleicht „überspringen“, um den richtigen Moment k

zu verringern Ich hoffe, ich bin klar genug. Danke

+5

Sie scheinen vergessen zu haben, eine Frage zu stellen. –

+0

Sie könnten zwei Schleifen verwenden und sie in einem anderen Array auf umgekehrte Weise speichern ... wie Höhe - ich oder etwas – retinotop

+1

"Hier ist der Code" OK. Und? Funktioniert es? Was tut es? Was ist deine Frage dazu? –

Antwort

1

Ich nehme an, dass die Breite gerade ist, sonst "in neue Zeile reduzieren" -wenn es kompliziert sein wird, dann müssen Sie 2 Schleifen verwenden. Ich habe es nicht getestet, sollte aber so aussehen;

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 
    unsigned int k = height - 1; 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
     unsigned char v = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char u = pData[j+2]; 

     mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;       // b 

     y = pData[j+3]; 
     mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0; 

     if (mod(i, width*3) == 0) //reduce in new line (i am not sure how to reduce it, you should think about here) 
      k = k - 2; 
    } 

    return mycopy; 
} 

Und markieren Sie Ihre Frage als Bildverarbeitungs etc nicht nur als C++