Python中OpenCV无法读取MATLAB生成的未压缩AVI视频
解决OpenCV读取MATLAB生成的未压缩彩色AVI时的段错误问题
问题现象
- 使用OpenCV的
cap.read()读取MATLAB VideoWriter生成的未压缩彩色AVI文件时,程序直接触发zsh: segmentation fault python3 t.py崩溃 cap.isOpened()返回True,视频FPS、宽高元数据可正常获取,但cap.get(cv2.CAP_PROP_FOURCC)返回0.0- 同方式生成的灰度AVI可正常读取;视频能在IINA正常播放,ffmpeg可提取单帧但无法直接转换格式
原因分析
MATLAB生成的未压缩彩色AVI采用的帧存储结构/编码格式,与OpenCV依赖的FFmpeg解码器存在兼容性问题,导致解码时出现非法内存访问,触发段错误。
解决方案
1. 从源头修改MATLAB的AVI生成方式
避免使用未压缩格式,指定OpenCV兼容的编码(如MJPG)生成视频:
% MATLAB代码示例 vidObj = VideoWriter('output.avi', 'Motion JPEG AVI'); open(vidObj); % 写入帧逻辑... close(vidObj);
生成的MJPG编码AVI可直接被OpenCV读取,无崩溃问题。
2. 用ffmpeg预处理现有视频
若无法重新生成视频,可先提取原始帧再重新封装为兼容格式:
# 提取所有帧为图片 ffmpeg -i input.avi -f image2 frame_%04d.png # 重新封装为MJPG编码的AVI(替换30为原视频FPS) ffmpeg -framerate 30 -i frame_%04d.png -c:v mjpeg output_compat.avi
处理后的视频可被OpenCV正常读取。
3. 尝试指定OpenCV读取后端(仅Windows有效)
Windows环境下可强制使用VFW后端读取,绕过FFmpeg的兼容性问题:
import cv2 cap = cv2.VideoCapture('input.avi', cv2.CAP_VFW)
macOS/Linux环境下此方法无效,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者RajaKrishnappa
相关产品推荐
相关产品推荐

