프로그래밍/Python

[Python] OpenCV를 활용한 카메라 영상 출력 - 2(FPS 표시)

채윤아빠 2022. 1. 5. 22:26
728x90
반응형

Python에서 OpenCV를 활용하여 카메라 영상을 출력할 때, FPS(Frame per second) 정보를 함께 출력하는 방법에 대하여 알아 보겠습니다.

먼저 전체 예제 코드는 다음과 같습니다.

import cv2
import time

CAMERA_ID = 0

capture = cv2.VideoCapture(CAMERA_ID)
if capture.isOpened() == False: # 카메라 정상상태 확인
    print(f'Can\'t open the Camera({CAMERA_ID})')
    exit()

capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)

prev_time = 0
total_frames = 0
start_time = time.time()
while cv2.waitKey(1) < 0:
    curr_time = time.time()

    ret, frame = capture.read()
    total_frames = total_frames + 1

    term = curr_time - prev_time
    fps = 1 / term
    prev_time = curr_time
    fps_string = f'term = {term:.3f},  FPS = {fps:.2f}'
    print(fps_string)

    cv2.putText(frame, fps_string, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255))
    cv2.imshow("VideoFrame", frame)

end_time = time.time()
fps = total_frames / (start_time - end_time)
print(f'total_frames = {total_frames},  avg FPS = {fps:.2f}')

capture.release()
cv2.destroyAllWindows()

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

term = 0.033,  FPS = 30.11
term = 0.033,  FPS = 30.66
term = 0.047,  FPS = 21.17
term = 0.035,  FPS = 28.34
term = 0.029,  FPS = 34.12
total_frames = 141,  avg FPS = -25.73

제가 갖고 있는 카메라가 30프레임을 지원하는 카메라인데, 각 프레임별 FPS도 얼추 비슷하게 나옵니다.
각 프레임을 처리하는데 약 0.33초가 걸리고 있습니다.


이전 글의 카메라 영상을 출력하는 예제에서 FPS 정보를 출력하기 위하여 코드가 조금 복잡해졌지만, 하나씩 분석해 보면 간단합니다.

카메라로부터 영상을 받기 위하여, 카메라 객체를 생성하는 코드가 다음과 같습니다.

CAMERA_ID = 0

capture = cv2.VideoCapture(CAMERA_ID)
if capture.isOpened() == False: # 카메라 정상상태 확인
    print(f'Can\'t open the Camera({CAMERA_ID})')
    exit()

카메라가 여러개라면 CAMERA_ID에 0이 아닌 숫자로 다른 카메라를 지정할 수 있습니다.
"capture.isOpened()"의 값을 확인하여 카메라가 영상을 읽어들일 수 있는 상태인지 확인하고, 만약 영상을 읽을 수 있는 상태가 아니라면 프로그램을 종료하도록 예외처리 했습니다.

prev_time = 0
total_frames = 0
start_time = time.time()

전체 프레임 평균을 구하기 위하여 시작 시각을 저장해 둡니다.

    curr_time = time.time()

현재 시각을 저장해 둡니다.

    ret, frame = capture.read()
    total_frames = total_frames + 1

    term = curr_time - prev_time
    fps = 1 / term
    prev_time = curr_time
    fps_string = f'term = {term:.3f},  FPS = {fps:.2f}'
    print(fps_string)

카메라로부터 영상 1프레임을 가져오고, 전체 프레임 수를 1 증가 시킵니다.
1 프레임을 가져오는데 걸린 시간을 계산하고, 이를 통하여 FPS를 계산합니다.
그리고 영상에 출력할 FPS 정보 문자열을 f-string 문자열 방식으로 구성합니다.

    cv2.putText(frame, fps_string, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255))
    cv2.imshow("VideoFrame", frame)

FPS 정보 문자열을 영상 프레임에 출력 합니다.(putText() 함수)
그리고, 해당 영상 프레임을 윈도우 창에 표시합니다.

end_time = time.time()
fps = total_frames / (start_time - end_time)
print(f'total_frames = {total_frames},  avg FPS = {fps:.2f}')

마지막으로 최종 시각을 가져와 전체 프레임에 대한 평균 FPS를 계산하고, 콘솔에 출력합니다.

capture.release()
cv2.destroyAllWindows()

사용을 마친 카메라 객체를 반환하고, 모든 윈도우 창을 닫습니다.

다음에는 카메라로부터 가져온 영상을 파일로 저장하는 방법에 대하여 알아보도록 하겠습니다.

참고자료