请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

ffmpeg AFrame转Mat崩溃

老师 我从ffmpeg读取到视频数据 转化成cv::Mat mat 但是利用opencv只要imwrite 或者cvtColor 程序就会崩溃 我想可能是视频流格式错误啦?您帮我看看 辛苦了

我这样。。。。
int srcW = yuv420Frame->width;
int srcH = yuv420Frame->height;
SwsContext *swsCtx = sws_getContext(srcW, srcH, (AVPixelFormat)yuv420Frame->format, srcW, srcH, (AVPixelFormat)AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
mat.create(cv::Size(srcW, srcH), CV_8UC4);
AVFrame bgr24Frame = av_frame_alloc();
av_image_fill_arrays(bgr24Frame->data, bgr24Frame->linesize, (uint8_t )mat.data, (AVPixelFormat)AV_PIX_FMT_BGR24, srcW, srcH, 1);
sws_scale(swsCtx,(const uint8_t
const
)yuv420Frame->data, yuv420Frame->linesize, 0, srcH, bgr24Frame->data, bgr24Frame->linesize);
av_frame_free(&bgr24Frame);
sws_freeContext(swsCtx);
try {
cv::imwrite(“test-1147.png”,mat); //《《《----------崩溃
}
catch (cv::Exception& ex)
{
fprintf(stderr, “Exception converting image to PNG format: %sn”, ex.what());
return;
}
或者这样
cv::Mat img1, img2, img3, img4;
img1 = cv::imread(“D:/文档/pic/test-47.bmp”);

 int tongdao = img1.channels();
std::cerr << "图像 channel :"<< tongdao << std::endl;//输出3

**cv::cvtColor(img1, img2, cv::COLOR_BGR2GRAY);//《《------崩溃**

但是我这样就正常
Mat mat(480, 640, CV_8UC4);
try {
imwrite(“alpha.png”, mat, compression_params);//一切正常
}
catch (cv::Exception& ex) {
fprintf(stderr, “Exception converting image to PNG format: %sn”, ex.what());
return 1;
}
万分感激

正在回答 回答被采纳积分+3

1回答

李超 2023-01-20 19:01:08

我理解你的意思,但我没有这样混用过,所以没有这方面的经验可以提供。我分析,问题应该是无法直接将AVFrame 中的数据填充到opencv 中的Mat中。不知你有没有看Mat 的数据结构,按说它里边应该不是指存储了图像数据,应该外层还有自己的私有结构,你要按照它的结构一点一点地把数据填充好,这样才行

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号