前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换

ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换

作者头像
一棹烟波
发布2018-01-12 16:56:49
2.6K0
发布2018-01-12 16:56:49
举报
文章被收录于专栏:一棹烟波一棹烟波

ffmpeg实现音视频编解码是非常常用的工具,视频解码出来的raw数据是yuv格式,用来进行后续的图像处理一般是RGB格式的。所以需要从yuv到rgb或者bgr的转换,ffmpeg提供了相应的转换API函数:

下面代码中dec_ctx是解码器上下文,AV_PIX_FMT_BGR24是要转换成的图像数据格式,通过avpicture_get_size()函数获取图像的数据占用空间大小,并使用av_malloc()分配一个outBuff。将outbuff挂到video_frameBGR结构体上,并设置好格式转换上下文sws_getContext()。当然也要用OpenCV声明一个Mat 来保存最后的BGR图像。

代码语言:javascript
复制
    struct SwsContext *pSwsCtx;
    AVFrame *video_frameBGR=NULL;
    video_frameBGR = av_frame_alloc();
    uint8_t *outBuff = NULL;
    int frameSize;
    {
        frameSize = avpicture_get_size(AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height);
        outBuff = (uint8_t*)av_malloc(frameSize);
        avpicture_fill((AVPicture *)video_frameBGR, outBuff, AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height);

        //ÉèÖÃͼÏñת»»ÉÏÏÂÎÄ  
        pSwsCtx = sws_getContext(dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
            dec_ctx->width, dec_ctx->height, AV_PIX_FMT_BGR24,
            SWS_BICUBIC, NULL, NULL, NULL);
    }
    cv::Mat img = cv::Mat::zeros(dec_ctx->height, dec_ctx->width, CV_8UC3);

使用ffmpeg的sws_scale()接口函数实现YUV格式的video_frame到BGR格式的video_frameBGR的转换,数据保存在缓冲outBuff中,从outBuff中拷贝到Mat中就得到一副BGR图像供OpenCV使用。

代码语言:javascript
复制
sws_scale(pSwsCtx, video_frame->data,
                        video_frame->linesize, 0, dec_ctx->height,
                        video_frameBGR->data, video_frameBGR->linesize);

                    memcpy(img.data, outBuff, frameSize);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档