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)
Python可以使用OpenCV库将视频切割图片并保存,以下为几种不同的实现方法。 ### 方法一 此方法通过`cv2.VideoCapture`打开视频文件,逐读取视频,每隔3保存一张图片。代码如下: ```python import cv2 cap = cv2.VideoCapture(r'D:\Algorithm\kuangshan_test\video_analysis-python_yolo-local_test_1111\inputs\截取倒地.mp4') flag = 0 i = 0 while(cap.isOpened()): i += 1 ret, frame = cap.read() flag += 1 name = str(flag) if ret: if i % 3 == 0: # 每隔3保存一张图片 print('保存功+1') cv2.imwrite(r'e:\Users\\' + name + '.jpg', frame) if cv2.waitKey(25) & 0xFF == ord('q'): break else: break cap.release() cv2.destroyAllWindows() ``` ### 方法二 定义函数分别处理不同类型(如avi和mp4)的视频,按照每25读取并保存一张图片。代码思路如下: ```python # 定义读取mp4类型的视频,25读取一张图片 def read_mp4_video(video_path): cap = cv2.VideoCapture(video_path) frame_count = 0 save_count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: frame_count += 1 if frame_count % 25 == 0: save_count += 1 cv2.imwrite(f'output_mp4_{save_count}.jpg', frame) else: break cap.release() # 定义读取avi类型的视频,25读取一张图片 def read_avi_video(video_path): cap = cv2.VideoCapture(video_path) frame_count = 0 save_count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: frame_count += 1 if frame_count % 25 == 0: save_count += 1 cv2.imwrite(f'output_avi_{save_count}.jpg', frame) else: break cap.release() # 示例调用 # read_mp4_video('your_mp4_video.mp4') # read_avi_video('your_avi_video.avi') ``` ### 方法三 定义一个类`VideoSplit`,将视频文件分为图片文件并保存在指定文件夹。代码如下: ```python class VideoSplit: def __init__(self, source_path, result_path): self.source_path = source_path self.result_path = result_path def split_video(self): cap = cv2.VideoCapture(self.source_path) frame_count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: frame_count += 1 cv2.imwrite(f'{self.result_path}/frame_{frame_count}.jpg', frame) else: break cap.release() if __name__ == "__main__": source_path = r'C:\Users\Htu\Desktop\video' result_path = r'C:\Users\Htu\Desktop\result' tst = VideoSplit(source_path, result_path) tst.split_video() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值