【python调用本机摄像头/本地视频-预览-保存】cv2读取视频或摄像头,并保存帧图像或视频

本文介绍了如何使用OpenCV库从摄像头捕捉视频,并将其保存为连续的图片,同时提供了两种方法:单个视频逐帧转换和批量处理多个视频。通过这两个函数,可以方便地对视频数据进行预处理和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.捕获摄像头数据并保存

import cv2

def videocapture():
    cap = cv2.VideoCapture(0)  # 生成读取摄像头对象      0表示默认连接摄像头
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 视频的编码
    # 定义视频对象输出
    writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
    while cap.isOpened():
        ret, frame = cap.read()  # 读取摄像头画面
        cv2.imshow('video', frame)  # 显示画面
        key = cv2.waitKey(24)
        writer.write(frame)  # 视频保存
        # 按Q退出
        if key == ord('q'):
            break
    cap.release()  # 释放摄像头
    cv2.destroyAllWindows()  # 释放所有显示图像窗口


if __name__ == '__main__':
    videocapture()

2.1 video2image 将视频文件转换为图片,默认间隔按照帧率存储

2.2 video2image_multi # 读取文件夹所有视频,每个视频按帧保存图像

import numpy as np
import cv2
import os

def video2image(video_dir, save_dir):
    cap = cv2.VideoCapture(video_dir)  # 生成读取视频对象
    n = 1  # 计数
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 视频的编码
    # 定义视频输出
    # writer = cv2.VideoWriter("video_02_result.mp4", fourcc, fps, (width, height))
    i = 0
    timeF = int(fps)  # 视频帧计数间隔频率
    while cap.isOpened():
        ret, frame = cap.read()  # 按帧读取视频
        # 到视频结尾时终止
        if ret is False:
            break
        # 每隔timeF帧进行存储操作
        if (n % timeF == 0):
            i += 1
            print('保存第 %s 张图像' % i)
            save_image_dir = os.path.join(save_dir, '%s.jpg' % i)
            print('save_image_dir: ', save_image_dir)
            cv2.imwrite(save_image_dir, frame)  # 保存视频帧图像
        n = n + 1
        cv2.waitKey(1)  # 延时1ms
    cap.release()  # 释放视频对象


# 读取文件夹所有视频,每个视频按帧保存图像
def video2image_multi(video_path, save_path):
    video_list = os.listdir(video_path)

    for i in range(len(video_list)):
        video_dir = os.path.join(video_path, video_list[i])
        cap = cv2.VideoCapture(video_dir)
        fps = cap.get(cv2.CAP_PROP_FPS)  # 视频的帧率
        save_num = 0
        n = 1  # 计数
        timeF = int(fps)  # 视频帧计数间隔频率
        while cap.isOpened():
            ret, frame = cap.read()
            if ret is False:
                break
            # 每隔timeF帧进行存储操作
            if (n % timeF == 0):
                save_num += 1
                save_image_dir = os.path.join(save_path, '%s_%s.jpg' % (i, save_num))
                cv2.imwrite(save_image_dir, frame)
            n = n + 1
            cv2.waitKey(1)
        cap.release()
        print('读取第 %s 个视频完成 !!!' % i)


if __name__ == '__main__':
    video2image(r'D:\zhouz\my_video\test_fall.avi', r'D:\zhouz\video2image')

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值