web-dev-qa-db-ja.com

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(1)の最大値とB = 0を想定します。それで、OpenCVにこの変換関数を実装することに興味があります。では、負の値をどのように処理するのでしょうか。フロート画像を使用していますか?とにかく説明してください、何かわからないかもしれません。

17
maximus

OpenCVでRGB <-> YUVを cvtColor で変換するには、YUV-> RGBの場合はcodeCV_YCrCb2RGB、RGB-> YUVの場合はCV_RGBYCrCbを使用します。

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

画像をある色空間から別の色空間に変換します。

13
Jacob

YUVカラープレーン に従って、Y、U、およびVは、小数で表される場合はすべて負にすることができます。

YUV Color space

14
Dolph

平面フォーマットの場合、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に変換します

2
Yaur