Мне нужно преобразовать RGB в YCbCr для моего последнего проекта, и я пытаюсь сделать это (я программирую в 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;
}
Но у меня это не работает!
Я сравнивал cvCvtColor (из библиотеки OpenCv), и результаты не совпадают:
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!)
Мне действительно нужна помощь с этим, я пытаюсь сделать это в течение долгого времени, и я не мог найти ответа на свои сомнения.
Вы, ребята, думаете, что я неправильно понимаю значения RGB? Я делаю так:
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);
Затем я вызываю свою функцию преобразования следующим образом:
converter_RGB_para_YCbCr(R, G, B);
Моя функция ожидает int R, int G, int B, но я передаю uchar B, uchar G, uchar R. это нормально?