2025.4.10

在 OpenCV 中,可以通过 cv2.CAP_PROP_FRAME_COUNT 获取视频的总帧数。以下是具体方法和完整代码示例:


1. 获取视频总帧数的方法

import cv2

# 打开视频文件或摄像头
video_path = "your_video.mp4"  # 替换为你的视频路径
cap = cv2.VideoCapture(video_path)

# 获取总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

print(f"视频总帧数: {total_frames}")

# 释放资源
cap.release()

2. 注意事项

  1. 摄像头输入无法直接获取总帧数
    如果是实时摄像头(如 cv2.VideoCapture(0)),CAP_PROP_FRAME_COUNT 会返回 0,因为摄像头是实时流,没有固定帧数。

  2. 视频格式支持
    某些视频格式(如动态生成的流或部分编码)可能无法正确返回帧数,此时需要逐帧读取计数:

    total_frames = 0
    while True:
        ret, _ = cap.read()
        if not ret:
            break
        total_frames += 1
    print(f"实际解码帧数: {total_frames}")
    
  3. 精度问题
    CAP_PROP_FRAME_COUNT 的值可能因视频编码方式略有误差,建议对关键应用逐帧验证。


3. 完整代码(含异常处理)

import cv2

def get_video_frame_count(video_path):
    cap = None
    try:
        cap = cv2.VideoCapture(video_path)
        if not cap.isOpened():
            raise ValueError("无法打开视频文件")
        
        # 方法1:直接获取元数据中的帧数(可能不准确)
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        
        # 方法2:逐帧计数(准确但较慢)
        # total_frames = 0
        # while True:
        #     ret, _ = cap.read()
        #     if not ret:
        #         break
        #     total_frames += 1
        
        return total_frames
    except Exception as e:
        print(f"错误: {e}")
        return 0
    finally:
        if cap is not None:
            cap.release()

# 使用示例
video_path = "test.mp4"
frame_count = get_video_frame_count(video_path)
print(f"视频总帧数: {frame_count}")

4. 为什么需要两种方法?

  • CAP_PROP_FRAME_COUNT
    快速但依赖视频元数据,某些编码格式(如部分MP4)可能不准确。

  • 逐帧计数
    100% 准确但速度慢,适合对精度要求高的场景(如视频编辑)。


5. 扩展:计算视频时长(秒)

如果还需要视频时长,可以通过帧率和总帧数计算:

fps = cap.get(cv2.CAP_PROP_FPS)
duration_sec = total_frames / fps
print(f"视频时长: {duration_sec:.2f}秒")

通过上述方法,你可以灵活应对不同场景下的帧数统计需求!

posted @ 2025-04-10 23:00  258333  阅读(88)  评论(0)    收藏  举报