2010-05-25 209 views
16

的公式表示:如何處理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 所以,我很感興趣,在實施本OpenCV的功能convetion最大值和, 那麼,如何處理負值? 使用浮動圖像?無論如何請解釋我,可能是我不明白的東西..

回答

13

您可以將RGB <。

void cvCvtColor(const CvArr* src, CvArr* dst, int code) 

的圖像從一個顏色空間轉換 到另一個。

+0

謝謝!!我搜索了這樣一個功能,我認爲 YCrCb是不同於YUV ... – maximus 2010-05-25 16:39:12

+0

沒問題。請注意,您也可以轉換3聲道圖像。如果你需要合併Y,U和Vcomponents,你可以通過'merge'來完成,它需要一個'vector '對象。 – Jacob 2010-05-25 17:20:22

+3

@maximus - 嚴格來說它是。 YUV用於模擬電視標準YCrCb是數字 - 色彩空間不同。但只是非常輕微 – 2012-01-17 19:34:10

14

根據YUV color plane,Y,U和V都允許爲負值,以小數表示時。使用codeCV_YCrCb2RGB的YUV-> RGB和CV_RGBYCrCb爲RGB-> YUV> YUV OpenCV中與cvtColor -

YUV Color space

2

對於平面格式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

+0

有趣的方法:) – maximus 2013-08-03 22:56:23

+0

主題初學者詢問有關RGB到YUV。 .. – JavaRunner 2017-03-30 21:17:42