파이썬으로 영상을 캡처하는 코드를 GPT에게 부탁해서 만들었다.
동영상 파일이 있는 폴더 주소를 입력하고 원하는 프레임을 입력하며 ( 초당 10회 or 60초 1회)
거기에 맞게 캡처 파일을 하위 폴더로 만들어 준다.



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)
'AI 프로젝트 일기' 카테고리의 다른 글
| GPT로 자동 폴더 생성 프로그램 만들기 (2) | 2024.11.13 |
|---|---|
| 타일러 다이어리 후기 (1) | 2024.11.12 |
| [일정 관리 프로그램 제작 일기 2] 타일러 다이어리 만들기 (1) | 2024.10.31 |
| [일정 관리 프로그램 제작 일기 1] ChatGPT로 일정관리 (0) | 2024.10.29 |






























