2016-12-06 12 views
0

RGB画像をYUVに変換しようとしています。 openCVを使用してイメージをロードしています。FFmpegでのRGBからYUVへの変換のエラー

次のように私は、関数を呼び出しています:

//I know IplImage is outdated 
IplImage* im = cvLoadImage("1.jpg", 1); 
//.... 
bgr2yuv(im->imageData, dst, im->width, im->height); 

YUV画像にカラー画像を変換する機能を以下に示します。 私はそれを行うためにffmpegを使用しています。

void bgr2yuv(unsigned char *src, unsigned char *dest, int w, int h) 
{ 
    AVFrame *yuvIm = avcodec_alloc_frame(); 
    AVFrame *rgbIm = avcodec_alloc_frame(); 
    avpicture_fill(rgbIm, src, PIX_FMT_BGR24, w, h); 
    avpicture_fill(yuvIm, dest, PIX_FMT_YUV420P, w, h); 
    av_register_all(); 

    struct SwsContext * imgCtx = sws_getCachedContext(imgCtx, 
             w, h,(::PixelFormat)PIX_FMT_BGR24, 
             w, h,(::PixelFormat)PIX_FMT_YUV420P, 
             SWS_BICUBIC, NULL, NULL, NULL); 

    sws_scale(imgCtx, rgbIm->data, rgbIm->linesize,0, h, yuvIm->data, yuvIm->linesize); 
    av_free(yuvIm); 
    av_free(rgbIm); 
} 

変換後に出力が間違っています。 これはIplImageで起こっているパディングによるものだと思っています。 (私の入力画像の幅は4の倍数ではありません)。

正しい出力が得られなかった後でも、linesize変数が更新されました。 幅が4の倍数の画像を使用していてもうまく動作します。

コード内の問題は誰にでも分かります。

答えて

1

IplImage::alignまたはIplImage::widthStepをチェックし、これらを使用してAVFrame::linesizeを設定します。 RGBフレームには、例えば、あなたが設定します:

frame->linesize[0] = img->widthStep; 

dstアレイのレイアウトは、あなたが望むものは何でもすることができ、それはあなたが後でそれを使用している方法によって異なります。 IplImageへこれに再び

rgbIm->linesize[0] = im->widthStep; 

をしかし、私はsws_scale()からの出力データは4 ですから、このデータ(DEST)をコピーしているのが複数の作るために水増しされていないと思う:次のように

0

は、我々は何をする必要があります 次のように

だから我々は widthStep=widthを設定する必要があります。..などの保存、表示に問題を作成します。

IplImage* yuvImage = cvCreateImageHeader(cvGetSize(im), 8, 1); 
yuvImage->widthStep = yuvImage->width; 
yuvImage->imageData = dest; 
関連する問題