OpenCV C++ 视频转PNG序列出现段错误 转格式后报错帧位置变动
C++ OpenCV VideoCapture 逐帧存图段错误解决思路
- 第一步先定位段错误触发位置
在cap >> frame;和imwrite两行之间加调试打印,比如cout << "read frame " << count << " done" << endl;,运行后看最后输出的内容,即可确认崩溃发生在解码阶段还是写文件阶段。 - 若崩溃发生在解码阶段(
cap >> frame时出错)
这是C++ OpenCV和Python OpenCV使用的视频解码后端不一致导致的,Python版运行正常说明FFmpeg后端对该视频的解码没有问题,你可以强制C++的VideoCapture使用FFmpeg后端,初始化代码改为:
也可以分别打印两个版本OpenCV的后端返回值对比:C++用VideoCapture cap(input_path, CAP_FFMPEG);cap.get(CAP_PROP_BACKEND),Python用cv2.VideoCapture(路径).get(cv2.CAP_PROP_BACKEND),确认二者后端差异。 - 若崩溃发生在
imwrite写文件阶段
先跳过写文件逻辑,只循环读取所有帧,若不再崩溃说明是写PNG的逻辑有问题:- 先打印出问题帧的Mat属性:
cout << frame.cols << " " << frame.rows << " " << frame.type() << endl;,确认该帧尺寸、格式是否和其他正常帧一致,部分损坏的帧不会被判定为empty(),但写入时会触发异常 - 给imwrite传入PNG压缩参数,部分版本OpenCV默认高压缩等级存在bug,修改写法:
vector<int> png_params = {IMWRITE_PNG_COMPRESSION, 3}; imwrite(output_path+"frame"+to_string(count)+".png", frame, png_params); - 先打印出问题帧的Mat属性:
- 临时规避方案
如果不需要自己实现解码逻辑,直接调用ffmpeg命令完成转序列需求,稳定性更高:system("ffmpeg -i ./movie_type_files/vert_beach_short.mp4 -q:v 2 ./tmp_png/frame%d.png");
内容的提问来源于stack exchange,提问作者WhisperingShiba
相关产品推荐
相关产品推荐

