연속된 이미지나 비디오 파일을 다룰때 영상 처리 알고리즘이 추가되면 연산으로 인해 프레임 드롭이 발생할 수 있습니다. 예를 들어, 모든 화면을 3D 렌더링으로 표현하는 게임의 경우 연산량이 많아지는 구간이나, 높은 수준의 그래픽으로 프레임 저하가 발생하게 되죠. 실시간 영상을 입력받는 딥러닝 알고리즘의 경우, 성능도 중요하지만 REAL-TIME으로 구현이 가능하냐도 중요한 이슈가 되고 있습니다. 일반적으로 초당 6프레임 이상의 연산이 가능할때 실시간 (REAL-TIME) SYSTEM으로 정의합니다. 이번 포스팅에서는 실시간으로 측정되는 영상+알고리즘의 FPS를 확인해보도록 하겠습니다.
1. VideoCapture.py (기본 캡처 모듈 불러오기)
import cv2
import timeit
# 영상 정보 불러오기
video = cv2.VideoCapture('KITTI.mp4')
while True:
ret, frame = video.read()
if ret is True:
cv2.imshow('video',frame)
if cv2.waitKey(1) > 0 :
break
2. 시간 측정 함수 추가
while True:
ret, frame = video.read()
if ret is True:
# 알고리즘 시작 시점
start_t = timeit.default_timer()
""" 알고리즘 연산 """
""" 알고리즘 연산 """
# 알고리즘 종료 시점
terminate_t = timeit.default_timer()
FPS = int(1./(terminate_t - start_t ))
cv2.imshow('video',frame)
print(FPS)
if cv2.waitKey(1) > 0 :
break
시작 시점에서 시간을 저장하고 종료 시점에서의 시간차이를 통해 FPS를 구할 수 있습니다. opencv로 영상을 윈도우에 출력하는 함수 이외의 연산 과정이 없기때문에 고성능의 PC에서는 영상이 배속재생되는것처럼 출력됩니다. 저의 경우 8000프레임 이상으로 높아지게 되었습니다. 프레임 제한으로 배속을 막는 방법은 이전 포스팅을 참고하시면 됩니다.
https://deep-eye.tistory.com/10
3. 배경제거 알고리즘 + 영상 출력
# 가우시안 혼합 배경제거 알고리즘
fgbg = cv2.createBackgroundSubtractorMOG2()
def MOG(frame):
fgmask = fgbg.apply(frame)
_,fgmask = cv2.threshold(fgmask, 175, 255, cv2.THRESH_BINARY)
results = cv2.findContours(
fgmask , cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in results[0]:
x,y,w,h = cv2.boundingRect(contour)
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
영상처리 알고리즘이 추가되었을때의 FPS를 비교하기위해 opencv에서 제공하는 가우시안 혼합 배경 제거 알고리즘을 활용하였습니다. 이 함수는 opencv만 설치되어있다면 바로 이용할 수 있습니다. 알고리즘이 추가되었을때 영상의 FPS는 30~ 70 정도로 실시간 영상처리가 되는것을 확인할 수 있었습니다.
4. 최종 코드
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 23 11:35:04 2020
@author: Deep.i inc.
"""
import cv2
import timeit
# 영상 정보 불러오기
video = cv2.VideoCapture('KITTI.mp4')
# 가우시안 혼합 배경제거 알고리즘
fgbg = cv2.createBackgroundSubtractorMOG2()
def MOG(frame):
fgmask = fgbg.apply(frame)
_,fgmask = cv2.threshold(fgmask, 175, 255, cv2.THRESH_BINARY)
results = cv2.findContours(
fgmask , cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in results[0]:
x,y,w,h = cv2.boundingRect(contour)
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
while True:
ret, frame = video.read()
if ret is True:
# 알고리즘 시작 시점
start_t = timeit.default_timer()
""" 알고리즘 연산 """
MOG(frame)
""" 알고리즘 연산 """
# 알고리즘 종료 시점
terminate_t = timeit.default_timer()
cv2.imshow('video',frame)
FPS = int(1./(terminate_t - start_t ))
print(FPS)
if cv2.waitKey(1) > 0 :
break
# 머신러닝 프로젝트 제작, 상담 및 컨설팅 / 머신러닝 접목 졸업작품 컨설팅
# 데이터 가공, 수집, 라벨링 작업 / C, 파이썬 프로그램 제작
# email : deepi.contact.us@gmail.com
# site : www.deep-i.net
'Python > Python' 카테고리의 다른 글
[Python] PyTicToc 파이썬에서 경과 시간 간편하게 측정하기 (0) | 2020.11.25 |
---|---|
[Python] 파이썬 OpenCV를 이용한 얼굴 인식 (1) | 2020.11.05 |
[Python] configparser를 이용하여 config (설정값 ini 파일) 관리하기 (0) | 2020.11.01 |
[Python] OpenCV를 이용한 영상 재생과 Frame Rate (FPS) 조절 (1) | 2020.07.12 |
[YOLO] Python과 OpenCV를 이용한 실시간 객체 탐지 알고리즘 구현 (20) | 2020.06.26 |