相关文章推荐
想发财的炒粉  ·  python ...·  1 年前    · 
叛逆的猴子  ·  在Ubuntu上使用python ...·  2 年前    · 

python代码:视频帧提取

以下是Python代码,可对文件夹内的视频按每秒一帧提取,并将提取的帧保存在新的以pic命名的文件夹中。

代码:
import os
import cv2
def extract_images(video_path, output_folder):
    # 获取视频文件名
    video_name = os.path.splitext(os.path.basename(video_path))[0]
    # 新建文件夹
    output_path = os.path.join(output_folder, video_name)
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    # 打开视频
    cap = cv2.VideoCapture(video_path)
    # 获取帧率
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 设置帧间隔
    frame_interval = int(fps)
    # 逐帧提取并保存
    count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            if count % frame_interval == 0:
                image_name = os.path.join(output_path, f"{video_name}_{count}.jpg")
                cv2.imwrite(image_name, frame)
            count += 1
        else:
            break
    cap.release()
# 测试代码
if __name__ == '__main__':
    video_path = '/path/to/video.mp4'  # 视频文件路径
    output_folder = '/path/to/output_folder'  # 输出文件夹路径
    extract_images(video_path, output_folder)

以下是调整后的代码,可以处理MP4格式的视频:

import os
import cv2
def extract_images(video_path, output_folder):
    # 获取视频文件名
    video_name = os.path.splitext(os.path.basename(video_path))[0]
    # 新建文件夹
    output_path = os.path.join(output_folder, video_name)
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    # 打开视频
    cap = cv2.VideoCapture(video_path)
    # 获取帧率
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 设置帧间隔
    frame_interval = int(fps)
    # 逐帧提取并保存
    count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            if count % frame_?!interval == 0:
                image_name = os.path.join(output_path, f"{video_name}_{count}.jpg")
                cv2.imwrite(image_name, frame)
            count += 1
        else:
            break
    cap.release()
# 测试代码
if __name__ == '__main__':
    video_path = '/path/to/video.mp4'  # 视频文件路径
    output_folder = '/path/to/output_folder'  # 输出文件夹路径
    extract_images(video_path, output_folder)

其中,您只需要将 video_path 和 output_folder 变量改为您的实际路径即可。请注意,本代码仅适用于MP4格式的视频,如果您的视频格式不同,可能需要相应修改代码。


多线程版本

import os
import cv2
import threading
video_path = "D:/PR/教程2/"
pic_path = "D:/PR/教程2/"
filelist = os.listdir(video_path)
lock = threading.Lock()  # 创建锁对象
def video2pic(filename):
    with lock:  # 锁定锁对象,确保每个线程都能够成功创建文件夹
        if not os.path.exists(pic_path + str(filename)):
            os.mkdir(pic_path + str(filename))
    cnt = 0
    dnt = 0
    cap = cv2.VideoCapture(video_path + str(filename))
    while True:
        ret, image = cap.read()
        if image is None:
            break
        w = image.shape[1]
        h = image.shape[0]
        if (cnt % 20) == 0:
            with lock:  # 锁定锁对象,确保每个线程都能够成功保存图像
                cv2.imencode('.jpg', image)[1].tofile(pic_path + str(filename) + '/' + str(dnt) + '.jpg')
                print(pic_path + str(filename) + '/' + str(dnt) + '.jpg')
            dnt = dnt + 1
        cnt = cnt + 1
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break