본문 바로가기

Dev/PYTHON 파이썬

[OpenCV] 파이썬으로 동영상 프레임 초단위 저장/캡처하기 (Save Video Frame per Second by Python)

728x90
반응형

오늘은 동영상(mp4) 파일을 OpenCV를 사용하여 초단위로 저장하는 방법을 알아보도록 하겠습니다

 

기본적으로는 프레임 단위로 저장이 가능하나

본 예제에서는 다루고자 하는 동영상이 1초에 몇 프레임(fps)으로 구성되어있는지 알아내어

해당 정보를 사용해 초 단위로 저장해보도록 하겠습니다

 

#라이브러리 호출
import cv2
import os

print(cv2.__version__)

필요한 라이브러리를 호출합니다

본 예제에서는 파이썬에서 OpenCV를 다루기 위한 cv2 라이브러리와

디렉토리 접근 및 생성 등을 위한 os 라이브러리면 충분합니다

 

filepath = './dataset/video1_trim.mp4'
video = cv2.VideoCapture(filepath) #'' 사이에 사용할 비디오 파일의 경로 및 이름을 넣어주도록 함

if not video.isOpened():
    print("Could not Open :", filepath)
    exit(0)

지정된 경로에 저장된 비디오 파일을 불러옵니다

경로는 filepath 변수에 저장하도록 합니다

 

if문을 통해서 파일이 제대로 불러와졌는지 확인해주도록 합니다

만약 제대로 불러와지지 않았다면 프로그램을 종료해주도록 처리합니다 

 

#불러온 비디오 파일의 정보 출력
length = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = video.get(cv2.CAP_PROP_FPS)

print("length :", length)
print("width :", width)
print("height :", height)
print("fps :", fps)

불러온 비디오 파일의 정보를 확인해보겠습니다

본 예제에서는 사실 초당프레임수만 있으면 되지만,

영상의 길이, 너비, 높이 등 다양한 정보를 함께 확인해보도록 하겠습니다

 

#프레임을 저장할 디렉토리를 생성
try:
    if not os.path.exists(filepath[:-4]):
        os.makedirs(filepath[:-4])
except OSError:
    print ('Error: Creating directory. ' +  filepath[:-4])

추출한 프레임들을 저장할 디렉토리를 생성합니다

기존에 디렉토리가 있다면 새로 생성하지 않고, 없을 경우에만 생성하도록 합니다

에러가 발생할 경우를 대비하여 예외처리도 해줍니다

 

count = 0

while(video.isOpened()):
    ret, image = video.read()
    if(int(video.get(1)) % fps == 0): #앞서 불러온 fps 값을 사용하여 1초마다 추출
        cv2.imwrite(filepath[:-4] + "/frame%d.jpg" % count, image)
        print('Saved frame number :', str(int(video.get(1))))
        count += 1
        
video.release()

앞서 저장한 fps 값을 사용하여 1초마다 프레임을 저장하도록 합니다

파일 형식은 jpg를 사용하였으며

이미지 파일이 저장될 때마다 몇번째 프레임에 해당하는지 출력해주도록 합니다

 

모든 작업이 끝나면 비디오를 사용하느라 잡아두었던 메모리를 해제하도록 합니다

 


 

포스트를 마치도록 하겠습니다

내용 중에 문제나 변경사항이 있다면 댓글로 말씀해주세요 :)

 

728x90
반응형