Как справиться с преобразованием RGB в YUV
В формуле говорится:
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;
Что делать, если, например, переменная U становится отрицательной?
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
Предположим, что максимальные значения для R и G (единицы) и B = 0
Итак, я заинтересован в реализации этой функции convetion в OpenCV,
Итак, как бороться с отрицательными значениями?
Использование плавающего изображения? в любом случае, пожалуйста, объясните мне, может быть, я что-то не понимаю..
Ответы
Ответ 1
Вы можете преобразовать RGB ↔ YUV в OpenCV с помощью cvtColor с помощью code
CV_YCrCb2RGB
для YUV- > RGB и CV_RGBYCrCb
для RGB- > YUV.
void cvCvtColor(const CvArr* src, CvArr* dst, int code)
Преобразует изображение из одного цветового пространства к другому.
Ответ 2
Y, U и V разрешены как отрицательные, если они представлены десятичными знаками, в соответствии с цветовой плоскостью YUV.
![YUV Color space]()
Ответ 3
для планарных форматов OpenCV не подходит для работы. Вместо этого вам лучше использовать ffmpeg. например
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);
}
преобразует изображение YUV420 в RGB32