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

循环迭代覆盖前序结果:OpenCV提取视频帧时文件重复覆盖问题

问题分析与修复方案

核心错误

  1. 嵌套循环逻辑错误:外层循环遍历每个视频文件并读取对应帧后,内层循环又遍历所有文件名,把当前帧写入所有输出文件。这会导致每处理一个视频,就用当前帧覆盖所有输出文件,最终所有文件都存储最后一个视频的帧。
  2. 变量名笔误:定义的变量是dir_lust_full,但循环里调用的是dir_list_full,这会触发NameError(属于潜在运行错误)。

修复后的代码

import cv2

frame_no = 2

dir_list = ['a', 'b']
# 修正变量名笔误
dir_list_full = ['C:/User/video/a.mp4','c:/User/video/b.mp4']

# 用zip将视频路径与对应文件名一一配对遍历
for video_path, filename_suffix in zip(dir_list_full, dir_list):
    cap = cv2.VideoCapture(video_path)
    # 注意:OpenCV帧索引从0开始,提取第2帧需设置为1(原代码set(1,2)实际读取第3帧)
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no - 1)  
    ret, frame = cap.read()
    if ret:
        save_path = f'C:/User/Frames/frame_{filename_suffix}.png'
        isWritten = cv2.imwrite(save_path, frame)
        if not isWritten:
            print(f'保存{save_path}失败')
    else:
        print(f'读取{video_path}的第{frame_no}帧失败')
    cap.release()  # 释放摄像头资源,避免内存泄漏

print('帧提取与保存完成')

额外说明

  • OpenCV的帧索引从0开始,若你需要的是视频里的第2帧,必须设置cap.set(cv2.CAP_PROP_POS_FRAMES, 1),原代码的cap.set(1,frame_no)实际读取的是第3帧,需根据需求调整。
  • 每次处理完视频后调用cap.release(),避免长时间运行导致内存占用过高。
  • 添加了读取和保存的错误判断,方便快速定位问题。

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:05:23