DEEP.I - Lab

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

Python/Python

[Python] OpenCV 실시간으로 영상의 Frame Rate (FPS) 확인하기

Jongwon Kim 2020. 10. 23. 12:20
반응형

연속된 이미지나 비디오 파일을 다룰때 영상 처리 알고리즘이 추가되면 연산으로 인해 프레임 드롭이 발생할 수 있습니다. 예를 들어, 모든 화면을 3D 렌더링으로 표현하는 게임의 경우 연산량이 많아지는 구간이나, 높은 수준의 그래픽으로 프레임 저하가 발생하게 되죠. 실시간 영상을 입력받는 딥러닝 알고리즘의 경우, 성능도 중요하지만 REAL-TIME으로 구현이 가능하냐도 중요한 이슈가 되고 있습니다. 일반적으로 초당 6프레임 이상의 연산이 가능할때 실시간 (REAL-TIME) SYSTEM으로 정의합니다. 이번 포스팅에서는 실시간으로 측정되는 영상+알고리즘의 FPS를 확인해보도록 하겠습니다. 

 

 

그림 1. 실시간 객체 탐지 알고리즘의 선두자 YOLO

 

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

 

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

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

deep-eye.tistory.com

 

 

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 정도로 실시간 영상처리가 되는것을 확인할 수 있었습니다.

 

 

그림 2. 배경제거 알고리즘 + 영상 출력

 

 

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

 

FPS.zip
9.17MB

 

 

 

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

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

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

# site : www.deep-i.net

반응형