【发布时间】:2011-08-17 00:46:07
【问题描述】:
我需要为我的最终项目将 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。这样可以吗?
【问题讨论】:
-
嗯,这是奇数;即使是手动操作并使用您的方法,Y = 80(或者在转换为 int 时舍入为 80)您能否在将 Y、Cb 和 Cr 分配给 YCbCr 返回值时检查您的方法,并发布什么价值观在这里?
-
还有这个增量是什么?我没见过自己用过的。据我所知,我会发布转换的答案...
-
不知道你从哪里得到 Y = 382,它永远不会 > 255,假设 R、G 和 B 可以最大为 255。我得到 Y = 79.816,使用“袖珍”计算器。
-
Rudy这里也一样,不知道是不是类型转换?
-
我认为错误出在您的打印代码中...(不在发布的代码中)。