DEEP.I - Lab

오프라인 공간의 지능화를 꿈꾸는 딥아이 연구실입니다.

Python/Python

[Python] OpenCV를 이용한 영상 재생과 Frame Rate (FPS) 조절

Jongwon Kim 2020. 7. 12. 13:13
반응형

연속된 이미지나 비디오 파일을 다룰때 재생되는 프레임의 속도를 조절해야하는 Task가 발생하게 됩니다. 특히, 실시간으로 이미지 프로세싱을 하게 될 경우, 모든 프레임에 알고리즘을 적용하게 되면 연산으로 인해 재생이 지연되는 상황이 발생하게 됩니다. 

 

Frame Per Second (FPS)

 

1초 동안 10개의 프레임(이미지)이 재생되는 영상이 있다고 가정해보겠습니다. 단일 프레임 연산이 1초가 걸리는 딥러닝 알고리즘을 적용하게되면, 영상은 1초이지만 10초의 시간동안 영상이 재생되게 됩니다. 물론 모든 프레임에 대해 알고리즘이 적용되면 좋겠지만 실시간이 요구되는 상황에서는 지연이 발생하게 되죠. 이러한 지연을 방지하기 위해 time 함수를 이용하여 알고리즘에 적용되는 FPS를 지정해보겠습니다.

 

1.  VideoCapture.py (기본 캡처 모듈 불러오기)

 

import cv2
import time

video = cv2.VideoCapture(0)			# WebCam의 경우 0 또는 1
						# 비디오 파일의 경우 '경로/파일명.확장자'

while True:
	
    ret, frame = video.read()
     

 

openCV를 통해 비디오 모듈을 불러옵니다. 노트북의 경우 0 또는 1으로 WebCam으로 포트가 열리게 되며 특정 동영상 파일을 로드할 경우, 경로와 파일명을 ' ' 에 넣어 불러와주시면 됩니다. 연속되는 모든 영상을 불러오기 위해 while문으로 무한루프를 만드신 후, read() 함수를 통해 프레임을 읽어줍니다.

 

ret = 프레임 읽기을 성공하면 True 값 반환

frame = 배열 형식의 영상 프레임 (가로 X 세로 X 3) 값 반환

 

 

2.  VideoCapture.py (비디오 재생)

 

while True:

    ret, frame = video.read()
    
    if ret in True :
    
        cv2.imshow('Video',frame)
        
        if cv2.waitKey(1) > 0:
            
            break

 

ret가 ture 값을 가질 경우에만 영상을 출력합니다. cv2.imshow() 함수로 영상을 지정해주며 waitKey()는 키보드 입력을 기다리는 함수이지만 우리는 영상을 연속적으로 재생할 것이기에 입력 대기 시간을 1ms로 지정하여 입력 관계없이 1ms 마다 새롭게 갱신합니다.

 

3.  VideoCapture.py (비디오 FPS 지정)

 

prev_time = 0
FPS = 10

while True:

    ret, frame = video.read()
    
    current_time = time.time() - prev_time

    if (ret is True) and (current_time > 1./ FPS) :
    	
        prev_time = time.time()
        
        cv2.imshow('VideoCapture', frame)
    	
        if cv2.waitKey(1) > 0 :
            
            break

 

current_time = time.time() - prev_time

경과 시간 = 현재 시간 - 이전 프레임 재생 시간 

 

지정된 FPS값과 prev_time을 0으로 초기화합니다. 이후, 현재 시간과 이전 프레임 재생 루프에서 저장된 시간 값을 비교하여 경과된 시간값을 받아옵니다. 마지막으로 if문에서 지정된 FPS값과 비교하여 FPS값 이상의 시간이 경과 되었을 때 새로운 프레임을 출력하게 됩니다. 

 

 

 

 

# 머신러닝 프로젝트 제작, 상담 및 컨설팅  / 머신러닝 접목 졸업작품 컨설팅

# 데이터 가공, 수집, 라벨링 작업 / C, 파이썬 프로그램 제작

# email : deepi.contact.us@gmail.com

# site : www.deep-i.net

반응형