본문 바로가기
카테고리 없음

[OpenCV] 실시간 카메라 영상 처리 시 프레임 끊어짐 문제 해결 방법

by ykr0919 2025. 3. 6.

 

 

 

 

Vision AI 기반의 컨베이어 벨트 개체 인식 시스템을 구축하고 딥러닝 모델 최적화를 진행하는 과정에서, 빠르게 움직이는 컨베이어 벨트에서 실시간으로 이미지를 캡처하고 추론하는 문제가 발생함.

 

시스템이 실시간으로 동작해야 하며, 물체가 컨베이어 벨트를 지나갈 때마다 바로바로 인식하여 추론 결과를 제공해야 했음. 그러나 프레임이 지속적으로 끊어지는 현상이 발생하면서, 실시간 추론을 구현하는 데 어려움을 겪었음! 

 

  🤔 문제의 원인

 

OpenCV의 cv2.VideoCapture로 카메라를 인터페이스할 때, 카메라는 초당 30프레임(fps)으로 이미지를 지속적으로 캡처함(카메라의 설정에 따라 달라질 수 있음). 이 이미지는 운영체제의 이미지 저장 버퍼로 전송되며(동기적), 애플리케이션은 이를 받아서 처리함.

 

그러나 애플리케이션은 이 이미지를 처리하는 속도가 카메라의 캡처 속도보다 느리기 때문에, 이미지가 계속 버퍼에 쌓임. 이로 인해 최신 이미지를 가져오는 데 어려움이 발생하고, 애플리케이션은 과거의 이미지를 처리하게 되어 실시간으로 최신 프레임을 처리할 수 없는 문제가 발생함.

 

이로 인해 실시간 데이터를 화면에 표시하는 데 지연이 발생하게 되는 것임!!

 

주요 문제

  • 애플리케이션이 최신 이미지를 실시간으로 가져오는 데 어려움이 있음.
  • 카메라는 빠르게 이미지를 저장하고, 애플리케이션은 이전 프레임을 처리하려 하므로 최신 프레임을 즉시 처리하지 못함.
  • 이로 인해 실시간 영상 처리에서 지연이 발생.

 

🎯 해결책 

 

이 문제를 해결하기 위해, 이미지 캡처와 추론 과정에서 발생하는 지연을 최소화하고 실시간 추론을 가능하게 만드는 방법을 모색함.

 

이를 해결하기 위해, cam.read() 메서드를 루프 내에서 지속적으로 호출하여 버퍼를 비우는 방법(버퍼에 쌓인 이전 프레임들을 넘기고)을 사용.

 

cam.read()를 호출하면 카메라는 최신 이미지를 반환하고, 이전 이미지는 버려지므로 애플리케이션은 최신 이미지를 즉시 처리할 수 있게 됨!! 

 

해결 과정

  1. 버퍼 문제 해결: 카메라는 초당 30프레임을 캡처하지만, 애플리케이션이 이미지를 처리하는 속도가 그에 비해 느리기 때문에 이전 프레임이 계속 쌓여서 최신 이미지를 처리하는 데 어려움이 발생. 이 문제를 해결하기 위해, 이미지를 가져올 때마다 버퍼를 비우는 방식으로 최신 이미지만 처리.
  2. cam.read()를 반복 호출: cam.read() 메서드를 반복적으로 호출하여, 카메라에서 최신 이미지를 읽고 불필요한 이미지를 버려, 실시간으로 최신 프레임을 처리.

 

import cv2

cam = cv2.VideoCapture(0)  # 기본 카메라 사용

while True:
    ret, frame = cam.read()  # 새로운 한 프레임을 읽어옴
    if not ret:
        break

    cv2.imshow("Captured Frame", frame)  # 화면에 프레임을 표시

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cam.release()  # 카메라 해제
cv2.destroyAllWindows()  # 윈도우 창 닫기