ffmpeg AFrame转Mat崩溃

来源:1-2 OpenCV导学

落墨成白

2023-01-19

老师 我从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;
}
万分感激

写回答

1回答

李超

2023-01-20

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

0
0

OpenCV三大经典项目实战 一次掌握计算机视觉核心技能

OpenCV入门到进阶:实战三大典型项目

925 学习 · 233 问题

查看课程