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

如何用OpenCV从视频均匀提取指定数量帧并优化代码?

如何用OpenCV均匀提取指定数量的视频帧(优化版)

当然可以实现精准且均匀地提取指定数量的帧,而且不需要两次遍历视频。下面是优化后的方案,核心是直接通过视频属性获取总帧数,计算均匀采样的步长,再直接跳转到目标帧位置读取,避免冗余的逐帧操作。

优化思路

  1. 直接获取总帧数:利用OpenCV的CAP_PROP_FRAME_COUNT属性,无需循环读取就能得到视频总帧数
  2. 计算均匀采样步长:用总帧数除以目标提取帧数,得到每两帧之间的间隔步长
  3. 精准跳转读取:遍历目标提取次数,每次计算对应帧的位置,用cap.set()直接跳转到该帧,读取并保存

优化后代码

import cv2

VIDEO_FILE = "hello.mp4"
DESIRED_FRAMES_TO_SAVE = 60

cap = cv2.VideoCapture(VIDEO_FILE)
# 直接获取视频总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 计算均匀采样的步长
step = total_frames / DESIRED_FRAMES_TO_SAVE

for i in range(DESIRED_FRAMES_TO_SAVE):
    # 计算当前要提取的帧位置,四舍五入保证均匀分布
    frame_pos = int(round(i * step))
    # 跳转到目标帧位置
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_pos)
    # 读取帧
    success, frame = cap.read()
    if success:
        # 保存帧,文件名用提取的索引命名
        name = f'./raw_images/{i}.jpg'
        cv2.imwrite(name, frame)
        print(f"已保存第{i}帧,对应视频帧位置:{frame_pos}")

cap.release()
cv2.destroyAllWindows()

关键细节说明

  • 避免冗余读取:通过cap.set()直接跳转,不需要逐帧遍历所有视频帧,效率更高
  • 均匀性保证:基于总帧数计算的步长能让提取的帧在时间轴上均匀分布,不会出现原代码中近似取整导致的分布不均问题
  • 精准数量控制:循环次数直接等于目标提取帧数,确保刚好保存DESIRED_FRAMES_TO_SAVE帧

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:17:15