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格式,才能正常显示,不然颜色会异常

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值