概述
做的一个程序,在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数据的转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复