OpenCV保存裁剪人脸视频生成空MP4文件的问题求助
解决OpenCV保存裁剪人脸为MP4时生成空文件的问题
问题根源
- 帧尺寸不匹配:初始化
VideoWriter时指定了尺寸(112,112),但检测到的人脸裁剪后尺寸是(w,h),和目标尺寸不一致,OpenCV的VideoWriter会忽略尺寸不匹配的帧,最终导致文件为空。 - 未检查视频读取状态:没有判断
cam.read()返回的ret值,当视频读取完毕或失败时,frame无效,后续操作会静默失败。 - 无循环终止条件:
while(True)没有退出逻辑,视频读完后会持续处理无效帧。 - 资源释放不完整:
cam.release()被注释且位置错误,可能导致资源未正确释放。
修改后的代码
import cv2 # 打开视频文件 cam = cv2.VideoCapture(r"C:/Users/User/Desktop/aayfryxljh.mp4") # 加载人脸检测器 detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # 初始化视频写入器,指定目标尺寸 target_size = (112, 112) result = cv2.VideoWriter('C:/Users/User/Desktop/new.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, target_size) while True: # 读取帧并检查是否成功 ret, frame = cam.read() if not ret: break # 读取失败或视频结束,退出循环 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cropped = frame[y:y+h, x:x+w] # 将裁剪人脸缩放到目标尺寸,保证和VideoWriter参数一致 cropped_resized = cv2.resize(cropped, target_size) cv2.imshow('frame', cropped_resized) # 写入缩放后的帧 result.write(cropped_resized) # 按q键可提前退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放所有资源 cam.release() result.release() cv2.destroyAllWindows()
关键修改点
- 添加帧有效性检查:通过
if not ret: break避免处理无效帧。 - 统一帧尺寸:用
cv2.resize()将裁剪人脸缩放到(112,112),确保写入帧和VideoWriter初始化尺寸匹配。 - 补充终止逻辑:支持视频读完自动退出,也可按
q键手动终止。 - 修复资源释放:恢复
cam.release()并调整位置,同时添加窗口关闭操作。
内容的提问来源于stack exchange,提问作者Hamza Ali
相关产品推荐
相关产品推荐

