Konvertieren von RGB zu YCbCr - C-code

Brauche ich zum konvertieren von RGB zu YCbCr für mein Abschlussprojekt und ich habe versucht, das zu tun diese Art und Weise (ich bin Programmierung in C):

/* Autor: Vinicius Garcia
 * Data : 09.ago.2011
 * 
 * Função que converte um pixel RGB em YCbCr
 * 
 * param : int R valor do pixel no canal red
 * param : int G valor do pixel no canal green
 * param : int B valor do pixel no canal blue
 * return: int* vetor de inteiros com os valores H, S e V calculados - nesta ordem
 */
int* converter_RGB_para_YCbCr(int R, int G, int B){
    int* YCbCr = (int*) malloc(3 * sizeof(int));

    double delta = 128.0; //Constante necessaria para o calculo da conversão de cor
    double Y  = (0.299 * R + 0.587 * G + 0.114 * B);
    double Cb = ((B - Y) * 0.564 + delta);
    double Cr = ((R - Y) * 0.713 + delta);

    YCbCr[0] = (int) Y;
    YCbCr[1] = (int) Cb;
    YCbCr[2] = (int) Cr;
    return YCbCr;
}

Aber es funktioniert nicht für mich!

War ich im Vergleich mit cvCvtColor (aus OpenCv-Bibliothek) und die Ergebnisse nicht übereinstimmen:

            R = 88,  G  = 76,   B = 78
cvCvtColor: Y = 80,  Cb = 127, Cr = 134
myfunction: Y = 382, Cb = 132, Cr = 132 (cr and cr are always equal!)

Ich brauche wirklich Hilfe mit diesem, ich habe versucht, dies für eine lange Zeit und ich konnte keine Antwort für meine Frage.


Tun Sie Jungs denken, ich bin immer die RGB-Werte falsch? Ich mache auf diese Weise:

uchar B = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3);
uchar G = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3 + 1);
uchar R = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3 + 2);

Dann rufe ich meine Funktion zur Umsetzung dieser Weise:

converter_RGB_para_YCbCr(R, G, B);

Meine Funktion erwartet int R, int G, int B, aber ich bin vorbei uchar B, uchar G, uchar R. seine, ok?

Hmm, das ist Seltsam; auch tun Sie es von hand und mit Ihrer Methode, Y = 80 (oder eher gerundet auf 80, wenn umgewandelt in int), Können Sie überprüfen Sie Ihre Methode an der Stelle, wo Sie assign Y,Cb und Cr, um Ihre YCbCr Rückgabewert, und post die Werte hier sind ?
Auch was ist das delta ? Ich habe nicht gesehen, dass mich eingesetzt. Krank post eine Antwort mit der Umstellung wie ich bin mir dessen bewusst,...
Keine Ahnung, wo man Y = 382, es kann nie sein, > 255, vorausgesetzt, dass R, G und B können maximal 255. Ich bekomme Y = 79.816, mit einem "Taschen" - Rechner.
Hier gilt das gleiche Rudy, ich Frage mich, ob es Typ-Konvertierung ?
Ich denke, der Fehler ist in deinem code ausdrucken... (nicht in dem geposteten code).

InformationsquelleAutor Vinicius Garcia | 2011-08-17

Schreibe einen Kommentar