본문 바로가기
Python

openCV를 이용한 PySide 영상 출력

by holy season 2023. 8. 16.
반응형

openCV란?

  • 컴퓨터 비전과 이미지 처리 작업을 위한 오픈 소스 라이브러리
  • 다양한 컴퓨터 비전 관련 작업에서 널리 사용되고 있는 강력한 라이브러리
  • C++, Python, Java 등 다양한 프로그래밍 언어에서 사용 가능
  • 영상 처리, 기계 학습, 패턴 인식, 실시간 추적 등 다양한 컴퓨터 비전 작업 지원

파이썬 openCV 설치

파이썬에서 openCV를 설치하려면 pip 명령어를 사용해 설치하면 된다.

pip install opencv-python

PySide GUI 구성

VideoPlayer 생성

ScrollArea 위젯을 사용하여 스크롤을 할 수 있게 구현하였고 QVBoxLayOut을 사용하여 videoWidget을 수직 정렬하도록 구성 하였다.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QScrollArea
from videoWidget import videoWidget

class VideoPlayer(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Video Player')
        self.setGeometry(100, 100, 640, 480)

        self.initUI()

    def initUI(self):
        sources = []
        sources.append(f'rtsp://210.99.70.120:1935/live/cctv001.stream')

        layout = QVBoxLayout()
        scrollArea = QScrollArea()
        for source in sources :
            layout.addWidget(videoWidget(self, source))

        container = QWidget()
        container.setLayout(layout)
        scrollArea.setWidget(container)
        self.setCentralWidget(scrollArea)

        scrollArea.setWidgetResizable(True)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = VideoPlayer()
    player.show()
    sys.exit(app.exec_())

videoWidget 생성

opencv인 cv2를 이용하여 생성자로 받은 source를 cv2.VideoCapture를 이용하여 캡쳐하도록 하였다.

PySide6의 QTimer를 이용하여 30ms 마다 source의 영상을 이미지로 읽고 QLabel에 이미지를 업데이트 하도록 하였다.

from PySide6.QtWidgets import QWidget, QLabel, QVBoxLayout
from PySide6.QtCore import QTimer
from PySide6.QtGui import QImage, QPixmap
import cv2

class videoWidget(QWidget) :
    def __init__(self, parent=None, source=None):
        super().__init__(parent)

        layout = QVBoxLayout()

        self.label = QLabel(self)
        layout.addWidget(self.label)

        self.setLayout(layout)

        self.cap = cv2.VideoCapture(source)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateFrame)
        self.timer.start(30)

    def updateFrame(self):
        ret, frame = self.cap.read()
        if ret:
            rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            h, w, ch = rgb_frame.shape
            bytes_per_line = ch * w
            image = QImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
            pixmap = QPixmap.fromImage(image)
            self.label.setPixmap(pixmap)

실행 결과

충청남도 천안시 서북구 신당동 482-22 세집매 삼거리 cctv 영상이 출력되는 것을 확인할 수 있다.

반응형

'Python' 카테고리의 다른 글

랜덤 문자열 만들기  (0) 2023.08.30
파이썬 로깅 사용하기  (0) 2023.08.26
Pyinstaller ffmpeg 포함 시키기  (0) 2023.08.12
아나콘다(Anaconda)  (0) 2023.08.09
TTS 사용하기  (0) 2023.08.08