ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换
2017-10-23 21:56
811 查看
ffmpeg实现音视频编解码是非常常用的工具,视频解码出来的raw数据是yuv格式,用来进行后续的图像处理一般是RGB格式的。所以需要从yuv到rgb或者bgr的转换,ffmpeg提供了相应的转换API函数:
下面代码中dec_ctx是解码器上下文,AV_PIX_FMT_BGR24是要转换成的图像数据格式,通过avpicture_get_size()函数获取图像的数据占用空间大小,并使用av_malloc()分配一个outBuff。将outbuff挂到video_frameBGR结构体上,并设置好格式转换上下文sws_getContext()。当然也要用OpenCV声明一个Mat 来保存最后的BGR图像。
struct SwsContext *pSwsCtx; AVFrame *video_frameBGR=NULL; video_frameBGR = av_frame_alloc(); uint8_t *outBuff = NULL; int frameSize; { frameSize = avpicture_get_size(AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height); outBuff = (uint8_t*)av_malloc(frameSize); avpicture_fill((AVPicture *)video_frameBGR, outBuff, AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height); //ÉèÖÃͼÏñת»»ÉÏÏÂÎÄ pSwsCtx = sws_getContext(dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, dec_ctx->width, dec_ctx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); } cv::Mat img = cv::Mat::zeros(dec_ctx->height, dec_ctx->width, CV_8UC3);
使用ffmpeg的sws_scale()接口函数实现YUV格式的video_frame到BGR格式的video_frameBGR的转换,数据保存在缓冲outBuff中,从outBuff中拷贝到Mat中就得到一副BGR图像供OpenCV使用。
sws_scale(pSwsCtx, video_frame->data, video_frame->linesize, 0, dec_ctx->height, video_frameBGR->data, video_frameBGR->linesize); memcpy(img.data, outBuff, frameSize);
相关文章推荐
- OpenCV 将Mat数据转成Video格式视频
- ffmpeg从AVFrame取出yuv数据到保存到char*中
- MFC显示Mat数据格式(Opencv)图片,保证4字节对齐,图片缩放不错行
- ffmpeg解码数据保存为yuv格式
- opencv的Mat格式数据操作
- ffmpeg获取摄像头数据保存成YUV420P格式
- OpenCV Mat数据存储格式详解
- opencv 读取yuv格式数据文件
- YUV文件转opencv的Mat格式并且显示播放
- ffmpeg从AVFrame取出yuv数据到保存到char*中
- opencv中Mat格式的数据点访问at
- ffmpeg实战教程(一)Mp4,mkv等格式解码为h264和yuv数据
- ffmpeg解码数据转为Mat通过opencv函数显示
- FFmpeg中AVFrame的YUV420编码格式
- FFmpeg中数据与OpenCV中Mat数据的转换
- MFC显示Mat数据格式(Opencv)图片,保证4字节对齐,图片缩放不错行
- 图文详解YUV420数据格式
- 详解YUV420数据格式
- ffmpeg如何转化YUV420p格式为其它视频格式
- FFMPEG的解码后的数据格式