您的位置:首页 > 运维架构

FFmpeg中数据与OpenCV中Mat数据的转换

2017-11-24 21:11 941 查看
做的一个程序,在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格式,才能正常显示,不然颜色会异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv ffmpeg