image processing - ycbcr - Cómo lidiar con la conversión de RGB a YUV
y cb cr que es (3)
Para los formatos planares, OpenCV no es la herramienta adecuada para el trabajo. En su lugar, es mejor utilizar ffmpeg. por ejemplo
static void rgbToYuv(byte* src, byte* dst, int width,int height)
{
byte* src_planes[3] = {src,src + width*height, src+ (width*height*3/2)};
int src_stride[3] = {width, width / 2, width / 2};
byte* dest_planes[3] = {dst,NULL,NULL};
int dest_stride[3] = {width*4,0,0};
struct SwsContext *img_convert_ctx = sws_getContext(
width,height,
PIX_FMT_YUV420P,width,height,PIX_FMT_RGB32,SWS_POINT,NULL,NULL,NULL);
sws_scale(img_convert_ctx, src_planes,src_stride,0,height,dest_planes,dest_stride);
sws_freeContext(img_convert_ctx);
}
convertirá una imagen YUV420 a RGB32
La fórmula dice:
Y = 0.299 * R + 0.587 * G + 0.114 * B;
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
V = 0.615 * R - 0.51499 * G - 0.10001 * B;
¿Qué pasa si, por ejemplo, la variable U se vuelve negativa?
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
Suponga los valores máximos para R y G (unidades) y B = 0 Por lo tanto, estoy interesado en implementar esta función de realización en OpenCV. Entonces, ¿cómo lidiar con los valores negativos? ¿Utilizando imagen flotante? De todos modos por favor explícame, puede ser que no entiendo algo ..
Puede convertir RGB <-> YUV en OpenCV con cvtColor utilizando el code
CV_YCrCb2RGB
para YUV-> RGB y CV_RGBYCrCb
para RGB-> YUV.
void cvCvtColor(const CvArr* src, CvArr* dst, int code)
Convierte una imagen de un espacio de color a otro.
Y, U y V pueden ser negativos cuando están representados por decimales, de acuerdo con el plano de color YUV .