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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM