zoukankan      html  css  js  c++  java
  • ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换

    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图像。

        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使用。

    sws_scale(pSwsCtx, video_frame->data,
                            video_frame->linesize, 0, dec_ctx->height,
                            video_frameBGR->data, video_frameBGR->linesize);
    
                        memcpy(img.data, outBuff, frameSize);
  • 相关阅读:
    java并发之hashmap源码
    java并发之hashmap
    java线程池之一:创建线程池的方法
    springAOP之代理模式
    java阻塞队列之LinkedBlockingQueue
    java阻塞队列之ArrayBlockingQueue
    java中的异常
    springboot入门之一:环境搭建(续)
    Unity 游戏框架搭建 2019 (二十三、二十四) 备份与版本号&危险的操作
    Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备
  • 原文地址:https://www.cnblogs.com/riddick/p/7719190.html
Copyright © 2011-2022 走看看