我是靠谱客的博主 单薄书本,最近开发中收集的这篇文章主要介绍FFmpeg中数据与OpenCV中Mat数据的转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

做的一个程序,在Qt中用FFmpeg接收解码RTSP流,后期需要对解码得到的数据进行处理,因此需要把FFmpeg得到的数据转换成OpenCV中的Mat类型存储下来。
FFmpeg通过sws_scale函数将原来视频格式转换为YUV格式,保存着AVPicture结构体中,而AVPicture结构体中的data数据就是我们需要存储的视频数据了。下面的代码,是在循环读取RTSP视频流之前,进行的设置:

//相关数据的定义
AVPicture pAVPicture;
Mat pCvMat;
int pSize;
uint8_t *out_bufferRGB=NULL;
//代码实现部分
pSize=avpicture_get_size(AV_PIX_FMT_BGR24,pAVCodecContext->width,pAVCodecContext->height);
out_bufferRGB=(uint8_t *)av_malloc(pSize);
//avpicture_fill函数的作用:pAVPicture和out_bufferRGB是已经申请到的一段内存
//该函数执行完,pAVPicture中的数据按照AV_PIX_FMT_BGR24的格式自动关联到out_bufferRGB中
//之后读取数据经过处理,自动保存到pAVPicture,也自动关联到了out_bufferRGB用于缓存。
avpicture_fill(&pAVPicture,out_bufferRGB,AV_PIX_FMT_BGR24,videoWidth,videoHeight);
//opencv中用于创建一个mat类型变量。
pCvMat.create(cv::Size(videoWidth,videoHeight),CV_8UC3);

在FFmpeg的sws_scale接口函数实现YUV格式的数据到BGR数据的转换后,数据保存在pAVPicture中,由于有了上述的avpicture_fill函数进行关联,从而使得数据自动缓存到out_bufferRGB中,从out_bufferRGB复制拷贝到Mat就得到一副BGR图像用于OpenCV使用。

sws_scale(pSwsContext,(const uint8_t* const *)pAVFrame->data,
            pAVFrame->linesize,0,videoHeight,
            pAVPicture.data,pAVPicture.linesize);
memcpy(pCvMat.data,out_bufferRGB,pSize);

至此,转换完毕,如果用于imshow显示,还需要进行转换成RGB格式,才能正常显示,不然颜色会异常

最后

以上就是单薄书本为你收集整理的FFmpeg中数据与OpenCV中Mat数据的转换的全部内容,希望文章能够帮你解决FFmpeg中数据与OpenCV中Mat数据的转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部