sws_scale YUV --> RGB 扭曲图像

Posted

技术标签:

【中文标题】sws_scale YUV --> RGB 扭曲图像【英文标题】:sws_scale YUV --> RGB distorted image 【发布时间】:2012-01-19 15:23:12 【问题描述】:

我想将YUV420P 图像(从H.264 流接收)转换为RGB,同时使用sws_scale 调整其大小。 原始图像的大小为480 × 800。只需转换相同的尺寸就可以了。 但是当我尝试改变尺寸时,我得到一个扭曲的图像,具有以下模式:

更改为 481 × 800 会产生扭曲的黑白图像,看起来像是在中间被剪掉了 482 × 800 会更加失真 483 × 800 变形但有颜色 484 × 800 没问题(缩放正确)。

现在遵循这种模式 - 只有当差值除以 4 时,缩放才能正常工作。

这是我解码和转换图像的方式的示例代码。所有方法都显示“成功”。

int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;

AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);

AVFrame *avFrameRGB = avcodec_alloc_frame();

AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size of raw data
avPacket.data = raw_data; // raw data before decoding to YUV

int frame_decoded = 0;
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket);
int size = dstX * dstY * 3;

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY);
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize);

// draws the resulting frame with windows BitBlt
DrawBitmap(hdc, dstX, dstY, rgb_frame, size);

sws_freeContext(img_convert_ctx); 

【问题讨论】:

欢迎在ffmpeg.org/trac/ffmpeg/newticket发布错误 在 sws_getContext() 函数中,您将格式标识符 PIX_FMT_BGR24 作为参数传递,而不是像在 avpicture_fill 中那样传递 PIX_FMT_RGB24 你有没有让这个工作? 【参考方案1】:

制作位图图片时,图片的宽度必须是4的倍数。

所以你必须改变宽度,比如 480、484、488、492 ...

这里是更改为 4 的倍数的方法

#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)

void main()

    BITMAPFILEHEADER bmFileHeader;
    BITMAPINFOHEADER bmInfoHeader;

    // load image
    // ...

    // when you use the method, put parameter like this.
    int tempWidth = WIDTHBYTES(width * bmInfoHeader.biBitCount);

希望你能解决问题。

【讨论】:

不,它不一定是 4 的倍数。代码 sn-p 离整个事情更远,因为它演示了如何对齐宽度,它与问题无关。跨度>

以上是关于sws_scale YUV --> RGB 扭曲图像的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg sws_scale 上的分段错误

将 AVFrame 转换为 RGB32 时在 sws_scale 处崩溃

如何将 rgb 图像数组从 sws_scale 转换为 DIB(在内存位图中)

4.图像处理库libswscale的sws_getContext(),sws_scale(),avdevice_register_all(),gdigrab简记

2021-08-16 灰度图rgb<>yuv

如何把摄像头采集的rgb图像转成yuv格式,并进行H264硬编码?