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
Sie scheinen vergessen zu haben, eine Frage zu stellen. –
Sie könnten zwei Schleifen verwenden und sie in einem anderen Array auf umgekehrte Weise speichern ... wie Höhe - ich oder etwas – retinotop
"Hier ist der Code" OK. Und? Funktioniert es? Was tut es? Was ist deine Frage dazu? –