파이썬으로 영상을 캡처하는 코드를 GPT에게 부탁해서 만들었다.

 

동영상 파일이 있는 폴더 주소를 입력하고 원하는 프레임을 입력하며 ( 초당 10회 or 60초 1회)

거기에 맞게 캡처 파일을 하위 폴더로 만들어 준다.

 

gpt로 생성한 이미지를 kling을 이용해 i2v로 만든 동영상
캡처폴더 생성결과

import cv2
from pathlib import Path
from PIL import Image
import numpy as np

def capture_frames(video_folder, capture_rate=1):
    """
    동영상의 프레임을 캡처하여 지정된 폴더에 저장합니다. Pillow를 사용하여 한글 경로 저장 문제를 해결합니다.

    Args:
    video_folder (str): 동영상 파일이 있는 폴더 경로
    capture_rate (int): 초당 캡처할 프레임 수
    """
    # 초당 최대 캡처 수 제한
    if capture_rate > 10:
        capture_rate = 10
        print("Warning: 초당 캡처할 횟수는 최대 10으로 제한됩니다.")

    # 경로 설정
    video_folder = Path(video_folder)
    capture_folder = video_folder / 'capture'
    capture_folder.mkdir(exist_ok=True)

    # 폴더 내 파일 목록 가져오기
    video_files = [f for f in video_folder.iterdir() if f.suffix in ['.mp4', '.avi', '.mkv']]

    for video_file in video_files:
        video_path = str(video_file.resolve())
        cap = cv2.VideoCapture(video_path)

        if not cap.isOpened():
            print(f"Cannot open video: {video_path}")
            continue

        fps = int(cap.get(cv2.CAP_PROP_FPS))
        frame_interval = max(1, fps // capture_rate)
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        capture_count = 0
        frame_idx = 0

        while frame_idx < frame_count:
            cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx)
            ret, frame = cap.read()

            if not ret or frame is None:
                print(f"Failed to read frame at index {frame_idx}")
                break

            # 프레임 데이터를 Pillow로 저장
            capture_filename = capture_folder / f"{video_file.stem}_frame_{capture_count:04d}.jpg"
            capture_filename = str(capture_filename)  # Pillow에서 사용할 경로는 문자열이어야 함
            try:
                # OpenCV 프레임 데이터를 Pillow 이미지로 변환
                image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
                image.save(capture_filename)
                print(f"Saved {capture_filename} using Pillow")
            except Exception as e:
                print(f"Failed to save {capture_filename} using Pillow: {e}")

            capture_count += 1
            frame_idx += frame_interval

        cap.release()
        print(f"Frames captured for {video_file} saved in {capture_folder}")

    print("All captures complete.")

# 사용 예시
video_folder_path = r'c:\Users\eligh\Desktop\test\수정영상'  # 한글 포함된 경로
capture_rate = 2  # 초당 1번 캡처하도록 설정
capture_frames(video_folder_path, capture_rate)

위는 짧은 영상용(한글명 경로로 인한 인코딩 오류 수정완료)

 

아래는 긴 영상용

#capture폴더에 바로 저장
import cv2
import os

def capture_frames(video_folder, capture_interval_sec=10):
    """
    지정된 폴더의 동영상에서 일정 시간마다 프레임을 캡처하여 capture 폴더에 직접 저장합니다.

    Args:
    video_folder (str): 동영상 파일이 있는 폴더 경로
    capture_interval_sec (int): 몇 초에 한 번씩 캡처할지 설정 (예: 10초에 한 번이면 10으로 설정)
    """
    # 폴더 내 파일 목록 가져오기
    video_files = [f for f in os.listdir(video_folder) if f.endswith(('.mp4', '.avi', '.mkv'))]
    
    # 캡처 폴더 생성 (모든 캡처 이미지를 저장할 폴더)
    capture_folder = os.path.join(video_folder, 'capture')
    os.makedirs(capture_folder, exist_ok=True)

    for video_file in video_files:
        # 동영상 파일 열기
        video_path = os.path.join(video_folder, video_file)
        cap = cv2.VideoCapture(video_path)

        if not cap.isOpened():
            print(f"Cannot open video {video_file}")
            continue

        # 동영상 정보 가져오기
        fps = int(cap.get(cv2.CAP_PROP_FPS))  # 초당 프레임 수
        frame_interval = int(fps * capture_interval_sec)  # 캡처할 프레임 간격 설정
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        capture_count = 0

        while capture_count * frame_interval < frame_count:
            # 지정된 프레임 위치로 이동
            cap.set(cv2.CAP_PROP_POS_FRAMES, capture_count * frame_interval)
            ret, frame = cap.read()
            if not ret:
                break

            # 캡처 이미지 저장 경로 설정 (동영상 이름과 프레임 번호를 포함하여 저장)
            capture_filename = os.path.join(
                capture_folder, 
                f"{os.path.splitext(video_file)[0]}_frame_{capture_count:04d}.jpg"
            )
            cv2.imwrite(capture_filename, frame)
            capture_count += 1

        cap.release()
        print(f"Frames captured for {video_file} saved in {capture_folder}")

    print("All captures complete.")

# 사용 예시
video_folder_path = r''  # 동영상 폴더 경로 설정
capture_interval_sec = 60  # 60초에 한 번씩 캡처하도록 설정
capture_frames(video_folder_path, capture_interval_sec)

 

 

+ Recent posts