OpenCV VideoWriter输出0KB视频:多分辨率处理场景异常排查
核心原因
你推测的图像宽高尺寸不匹配完全正确——4K视频降采样0.5倍后,box_img的实际尺寸和你初始化VideoWriter时指定的参数不一致,导致写入失败生成0KB无效文件;而拼接后的res尺寸刚好和Writer的初始化参数匹配,所以能正常输出。1080p视频没有降采样操作,box_img尺寸和Writer参数一致,因此无异常。
具体排查与修复步骤
同步VideoWriter的尺寸参数与降采样后图像
4K视频降采样后宽高会减半(比如原3840×2160→1920×1080),你必须确保VideoWriter初始化时的宽高是降采样后box_img的实际尺寸,而非原视频尺寸。
错误示例:# 用原4K尺寸初始化Writer,和降采样后的box_img尺寸不匹配 out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 25, (3840, 2160))正确做法:
# 先获取降采样后box_img的实际宽高(注意OpenCV中shape是(高, 宽, 通道)) h, w = box_img.shape[:2] # 初始化Writer时传入(宽, 高) out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 25, (w, h))确认降采样操作的准确性
检查你的降采样代码,确保输出尺寸符合预期。比如使用cv2.resize时,明确缩放比例:# 0.5倍降采样,用INTER_AREA算法更适合缩小图像 downsampled_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)处理后可以打印
downsampled_frame.shape确认宽高是否正确。写入前验证尺寸匹配性
在调用out.write(box_img)前,添加检查代码快速定位问题:writer_w = out.get(cv2.CAP_PROP_FRAME_WIDTH) writer_h = out.get(cv2.CAP_PROP_FRAME_HEIGHT) img_w, img_h = box_img.shape[1], box_img.shape[0] if (img_w, img_h) != (writer_w, writer_h): print(f"尺寸不匹配:图像({img_w},{img_h}) vs Writer({writer_w},{writer_h})")检查通道数一致性
额外确认box_img的通道数和Writer匹配:如果Writer按彩色(3通道)初始化,但box_img是灰度图(单通道),也会导致写入失败。可以用box_img.shape[2]查看通道数,若为单通道,初始化Writer时要传入isColor=False参数。
总结
OpenCV的VideoWriter对写入图像的尺寸、通道数要求严格,必须完全匹配初始化参数。4K降采样后图像尺寸变化,若未同步更新Writer参数,就会出现写入失败;而拼接后的res刚好符合Writer参数,所以正常输出。1080p视频无尺寸变化,因此没有问题。
内容的提问来源于stack exchange,提问作者Marios Constantinou

