You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV保存裁剪人脸视频生成空MP4文件的问题求助

解决OpenCV保存裁剪人脸为MP4时生成空文件的问题

问题根源

  1. 帧尺寸不匹配:初始化VideoWriter时指定了尺寸(112,112),但检测到的人脸裁剪后尺寸是(w,h),和目标尺寸不一致,OpenCV的VideoWriter会忽略尺寸不匹配的帧,最终导致文件为空。
  2. 未检查视频读取状态:没有判断cam.read()返回的ret值,当视频读取完毕或失败时,frame无效,后续操作会静默失败。
  3. 无循环终止条件:while(True)没有退出逻辑,视频读完后会持续处理无效帧。
  4. 资源释放不完整: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:40:26