ffmpeg AVFrame 转 cv::Mat

Posted lcyw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg AVFrame 转 cv::Mat相关的知识,希望对你有一定的参考价值。

//AVFrame 转 cv::mat  
cv::Mat frame_to_mat(const AVFrame * frame) 
    int width = frame->width;
    int height = frame->height;

    cv::Mat image(height, width, CV_8UC3);
    int cvLinesizes[1];
    cvLinesizes[0] = image.step1();
    if( NULL == _swsContext) 
        _swsContext = sws_getContext(width, height,
            (AVPixelFormat)frame->format, width, height,
            AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
    

    sws_scale(_swsContext, frame->data, 
        frame->linesize, 0, height, &image.data, cvLinesizes);
    
    return image;

上面函数传入的参数frame中的图像格式,可以是YUV, RGB ,等等,,
经过sws_scale()转换之后,写入cv::Mat 数据区。

还有一种方式 是直接将AVFrame 中的RGB数据赋值给cv::Mat

cv::Mat img;
img = cv::Mat(height, width, CV_8UC3);
img.data =  _rgb_frame->data[0];

以上是关于ffmpeg AVFrame 转 cv::Mat的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg解码到opencv Mat中

4.FFMPEG-AVFrame

FFmpeg5.0源码阅读——AVFrame

OpenCV 3.0中IplImage* 转cv::Mat

如何从 NSImage/UIImage 获取 AVFrame(ffmpeg)

ffmpeg 音频转码