簡體   English   中英

FFmpeg中的RGB到YUV轉換錯誤

[英]Error in RGB to YUV conversion in FFmpeg

我正在嘗試將RGB圖像轉換為YUV。 我正在使用openCV加載圖像。

我正在調用該函數,如下所示:

//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的倍數的圖像時,它的工作正常。

任何人都可以告訴代碼中是什么問題。

檢查IplImage :: alignIplImage :: widthStep並使用它們來設置AVFrame :: linesize 例如,對於RGB幀,您可以設置:

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

dst數組的布局可以是您想要的任何布局,這取決於您之后的使用方式。

我們需要執行以下操作:

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

但是我認為sws_scale()輸出數據不會被填充以使其成為4的倍數。因此,當您再次將此數據(目標)復制到IplImage時,這將在顯示,保存等方面造成問題。

因此,我們需要如下設置widthStep=width

IplImage* yuvImage = cvCreateImageHeader(cvGetSize(im), 8, 1);
yuvImage->widthStep = yuvImage->width;
yuvImage->imageData = dest;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM