使用OpenCV-Python实现背景减除后视频体积过大的优化咨询
解决OpenCV处理后视频体积暴涨的问题
嘿,我来帮你搞定这个视频体积暴增的麻烦!你遇到的问题其实很常见,核心原因和解决方法我给你理清楚:
为什么体积会从14MB涨到2GB?
你在创建cv2.VideoWriter的时候用了-1作为fourcc参数,这会让OpenCV默认使用未压缩的原始视频格式——完全不做压缩处理,每一帧都是原始像素数据,体积自然会爆炸。另外你的代码里还有个小语法错误(cv.Flip是旧版OpenCV的写法,现在应该用cv2.flip),我一起给你修正了。
关键解决方案:指定压缩编码器
要控制输出视频的体积,必须选择合适的压缩编码格式。不同平台支持的编码器略有差异,给你几个靠谱的选项:
- Windows系统:优先选
DIVX或XVID(属于MPEG-4编码,压缩率高,而且几乎所有播放器都能识别) - Linux/Mac系统:可以试试
MJPG或者H264(注意H264需要你的OpenCV编译时包含了对应组件)
修正后的完整可运行代码
import cv2 import numpy as np # 读取输入视频 cap = cv2.VideoCapture("C:\\Users\\212458792\\Music\\Downloads\\BasketVideos\\v1.mp4") # 创建背景减除器(保留阴影检测) fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=True) # 获取原视频的关键参数:宽高、帧率 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) # 用原视频帧率,避免播放速度异常 # 指定编码器(Windows下用DIVX,其他平台可以换成XVID/MJPG) fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 注意!背景减除后的fgmask是单通道灰度图,所以isColor必须设为False bgsubvideo = cv2.VideoWriter( 'C:\\Users\\212458792\\Music\\Downloads\\BasketVideos\\bgsubvideo.avi', fourcc, fps, (frame_width, frame_height), isColor=False ) # 逐帧处理视频 while True: ret, frame = cap.read() if ret == True: fgmask = fgbg.apply(frame) # 修正翻转函数:替换旧版的cv.Flip为cv2.flip fgmask = cv2.flip(fgmask, flipCode=-1) bgsubvideo.write(fgmask) else: # 读取完所有帧就退出循环 break # 别忘了释放资源! cap.release() bgsubvideo.release() cv2.destroyAllWindows()
额外要注意的细节
- 单通道匹配:因为背景减除后的结果是灰度图(单通道),所以创建
VideoWriter时必须设置isColor=False,不然不仅画面会乱,还可能导致编码异常。 - 帧率匹配:别固定写死20.0,用原视频的帧率能保证播放速度和原视频一致。
- 编码器调试:如果某个编码器生成的视频无法播放,换个试试就行——比如把
DIVX换成XVID,或者在Windows下用-1弹出选择框时,手动选带压缩的选项(别选未压缩的)。
内容的提问来源于stack exchange,提问作者a_jelly_fish
相关产品推荐
相关产品推荐

