python opencv 持续点选开始帧,结束帧,切割视频成几个小段

复制代码
import os

import cv2
import time



def on_mouse(event,x,y, flag, para):
    global status_value, start_frame, end_frame, times
    if event == cv2.EVENT_LBUTTONDOWN:  # 鼠标左键点击
        times += 1

        status_value = not status_value
        if status_value:
            start_frame = frame_number
            # print(f"Start frame: {start_frame}")
        else:
            split_flag = 'd' + str(int(times/2))
            # print('split_flag: ', split_flag)
            end_frame = frame_number
            # print(f"End frame: {end_frame}")
            extract_and_save_video(split_flag,para[0], para[1])


def extract_and_save_video(split_flag, folder, video_name):
    now_time = time.time()
    print('now_time:', now_time)
    out = cv2.VideoWriter('{}_{}_{}.avi'.format(video_name, folder, split_flag), cv2.VideoWriter.fourcc(*'XVID'), fps, size)
    print('start frame: {}'.format(start_frame))
    print('end frame: {}'.format(end_frame))
    for i in range(start_frame, end_frame + 1):
        cap.set(cv2.CAP_PROP_POS_FRAMES, i)
        ret, frame = cap.read()
        if ret:
            out.write(frame)
    out.release()
    print('video saved *********************')
    cv2.waitKey(5000)


videos_folder = 'E:\\河南深丛信息科技\\datasets\\record_night'

action_folders = os.listdir(videos_folder)[:2]
for folder in action_folders:
    video_folder = os.path.join(videos_folder, folder)
    video_files = os.listdir(video_folder)
    for video_file in video_files:
        video_name = video_file.split('.mkv')[0]
        video_file_path = os.path.join(video_folder, video_file)
        print('video file path:', video_file_path)
        cap = cv2.VideoCapture(video_file_path)
        fps = cap.get(cv2.CAP_PROP_FPS)
        print('fps: {}'.format(fps))
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        print("frame_count:", frame_count)

        status_value = 0
        # 初始化变量
        start_frame = None
        end_frame = None
        frame_number = 0
        times = 0
        event = 0

        size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
                int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

        while True:
            ret, frame = cap.read()
            if not ret:
                break

            frame_number += 1

            cv2.imshow('Video', frame)

            cv2.setMouseCallback('Video', on_mouse, [folder, video_name])

            if frame_number == 1:
                cv2.waitKey(3000)

            if cv2.waitKey(50) & 0xFF == ord('q'):
                break

        cap.release()
        cv2.destroyAllWindows()
        print(video_file + '  is done......\n')
        cv2.waitKey(3000)
相关推荐
zzzzzz31013 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐13 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵2 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学