⊢ AI 모델 활용

OpenCV, YOLOv8, PyQt5활용 실시간 객체 탐지 서비스 구현

최 수빈 2025. 3. 27. 07:22

 

OpenCV와 YOLOv8을 활용한 실시간 객체 탐지 서비스 구현

 

OpenCV와 최신 YOLOv8 모델, 그리고 PyQt5를 활용하여 실시간 객체 탐지 GUI 프로그램을 만듦

 

 

사용 기술 스택

 

객체 탐지 YOLOv8 (ultralytics 라이브러리)

영상 처리 OpenCV (cv2)

GUI 구성 PyQt5 (QWidget, QLabel, QPushButton, QVBoxLayout)

 

*PyQt5

Python에서 데스크탑 애플리케이션(GUI 앱)을 만들 수 있게 해주는 라이브러리

QWidget 모든 GUI 요소의 기본 (창, 버튼 등)
QLabel 텍스트나 이미지 보여주는 위젯
QPushButton 클릭 가능한 버튼
QVBoxLayout 위에서 아래로 위젯 정렬하는 레이아웃
QTimer 일정 시간마다 반복적으로 이벤트 실행 (ex: 20ms마다 프레임 갱신)
QImage, QPixmap) 이미지를 GUI로 보여줄 때 사용하는 포맷들
  • TKinter보다 복잡한 UI 구현 가능
  • C++ 기반 GUI 프레임워크인 Qt를 Python에서 쓸 수 있도록 한 라이브러리
  • 버튼, 드롭다운, 탭, 이미지뷰터, 입력창 등 모두 가능

 

 

사전 준비

pip install ultralytics opencv-python pyqt5

 

 

코드 구성 개요

 

  1. YOLOv8 모델 로드
    ultralytics.YOLO이용 yolov8x.pt 가중치 로드
    실시간 프레임마다 객체 탐지 수행
  2. PyQt5 기반 UI 구상
    QWidget을 상속한 VideoCaptureWidget 클래스 정의
    Start Webcam, Stop, Webcam 버튼으로 웹캠 제어
    QLabel로 탐지 결과 화면 표시
  3. OpenCV로 웹캠 프레임 처리
    cv2.VideoCapture(0)을 통해 웹캠 캡처
    QTimer로 20ms마다 프레임 갱신
    YOLO 추론 → 바운딩 박스 그리기 → PyQt5 이미지 변환 → 화면 표시

 

from ultralytics import YOLO
import cv2
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap

class VideoCaptureWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.model = YOLO('yolov8x.pt')  # YOLOv8 모델 로드

        # UI 구성
        self.setWindowTitle("실시간 객체 탐지")
        self.image_label = QLabel(self)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.image_label)

        self.start_button = QPushButton("Start Webcam", self)
        self.start_button.clicked.connect(self.start_webcam)
        self.layout.addWidget(self.start_button)

        self.stop_button = QPushButton("Stop Webcam", self)
        self.stop_button.clicked.connect(self.stop_webcam)
        self.layout.addWidget(self.stop_button)

        self.setLayout(self.layout)

        # 웹캠 초기화
        self.capture = None
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_frame)

    def start_webcam(self):
        self.capture = cv2.VideoCapture(0)
        self.timer.start(20)  # 50fps

    def stop_webcam(self):
        self.timer.stop()
        if self.capture:
            self.capture.release()

    def update_frame(self):
        ret, frame = self.capture.read()
        if ret:
            results = self.model(frame)
            result = results[0]
            img_with_boxes = result.plot()

            rgb_image = cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB)
            h, w, ch = rgb_image.shape
            bytes_per_line = ch * w
            qt_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
            self.image_label.setPixmap(QPixmap.fromImage(qt_image))

    def closeEvent(self, event):
        if self.capture:
            self.capture.release()

if __name__ == "__main__":
    app = QApplication([])
    window = VideoCaptureWidget()
    window.show()
    app.exec_()

 

 

구현 흐름

 

모델 준비 → 웹캠에서 프레임 획득 → 객체 탐지 → 바운딩 박스 시각화 → PyQt5로 표시

 

PyQt5 버튼으로 웹캠을 직접 제어 가능

YOLOv8의 탐지 성능을 실시간 GUI 앱으로 체험

 

 

YOLOv8 + OpenCV + PyQt5