반응형

 

 

OpenCV에서 캡처한 영상을 pyQt5로 작성된 GUI에서 보여주는 방법을 다룹니다.

깃허브에 있는 코드를 수정하여 사용했습니다.



 

처음 실행하면 버튼 2개만 보입니다.

 




start 버튼을 클릭하면 웹캠 영상이 보입니다.

 




Canny 버튼을 클릭하면 오른쪽에 캐니 영상을 보여줍니다.

 



# 출처 - https://github.com/ddd4117/GUI/blob/master/src/camera_test.py
# 수정 - webnautes

import cv2
import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui


class ShowVideo(QtCore.QObject):

   flag = 0

   camera = cv2.VideoCapture(0)

   ret, image = camera.read()
   height, width = image.shape[:2]

   VideoSignal1 = QtCore.pyqtSignal(QtGui.QImage)
   VideoSignal2 = QtCore.pyqtSignal(QtGui.QImage)

   def __init__(self, parent=None):
       super(ShowVideo, self).__init__(parent)

   @QtCore.pyqtSlot()
   def startVideo(self):
       global image

       run_video = True
       while run_video:
           ret, image = self.camera.read()
           color_swapped_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

           qt_image1 = QtGui.QImage(color_swapped_image.data,
                                   self.width,
                                   self.height,
                                   color_swapped_image.strides[0],
                                   QtGui.QImage.Format_RGB888)
           self.VideoSignal1.emit(qt_image1)


           if self.flag:
               img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
               img_canny = cv2.Canny(img_gray, 50, 100)

               qt_image2 = QtGui.QImage(img_canny.data,
                                        self.width,
                                        self.height,
                                        img_canny.strides[0],
                                        QtGui.QImage.Format_Grayscale8)

               self.VideoSignal2.emit(qt_image2)


           loop = QtCore.QEventLoop()
           QtCore.QTimer.singleShot(25, loop.quit) #25 ms
           loop.exec_()

   @QtCore.pyqtSlot()
   def canny(self):
       self.flag = 1 - self.flag


class ImageViewer(QtWidgets.QWidget):
   def __init__(self, parent=None):
       super(ImageViewer, self).__init__(parent)
       self.image = QtGui.QImage()
       self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent)

   def paintEvent(self, event):
       painter = QtGui.QPainter(self)
       painter.drawImage(0, 0, self.image)
       self.image = QtGui.QImage()

   def initUI(self):
       self.setWindowTitle('Test')

   @QtCore.pyqtSlot(QtGui.QImage)
   def setImage(self, image):
       if image.isNull():
           print("Viewer Dropped frame!")

       self.image = image
       if image.size() != self.size():
           self.setFixedSize(image.size())
       self.update()


if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)


   thread = QtCore.QThread()
   thread.start()
   vid = ShowVideo()
   vid.moveToThread(thread)

   image_viewer1 = ImageViewer()
   image_viewer2 = ImageViewer()

   vid.VideoSignal1.connect(image_viewer1.setImage)
   vid.VideoSignal2.connect(image_viewer2.setImage)

   push_button1 = QtWidgets.QPushButton('Start')
   push_button2 = QtWidgets.QPushButton('Canny')
   push_button1.clicked.connect(vid.startVideo)
   push_button2.clicked.connect(vid.canny)

   vertical_layout = QtWidgets.QVBoxLayout()
   horizontal_layout = QtWidgets.QHBoxLayout()
   horizontal_layout.addWidget(image_viewer1)
   horizontal_layout.addWidget(image_viewer2)
   vertical_layout.addLayout(horizontal_layout)
   vertical_layout.addWidget(push_button1)
   vertical_layout.addWidget(push_button2)

   layout_widget = QtWidgets.QWidget()
   layout_widget.setLayout(vertical_layout)

   main_window = QtWidgets.QMainWindow()
   main_window.setCentralWidget(layout_widget)
   main_window.show()
   sys.exit(app.exec_())




최초 작성  2019. 1. 24

 

 

관련 포스트

 

[OpenCV/OpenCV with Qt] - OpenCV에서 캡처한 webcam 영상을 QT에서 보여주기

 

OpenCV에서 캡처한 webcam 영상을 QT에서 보여주기

OpenCV에서 캡처한 webcam 영상을 QT에서 보여주는 예제 코드입니다.  2021. 8. 24 - 최초작성 실행 화면입니다. 처음 실행시 Open 버튼 클릭 후 Close 버튼 클릭 후 소스 코드입니다. // 원본 - https://gith..

webnautes.tistory.com

 

반응형

진행해본 결과물을 기록 및 공유하는 공간입니다.
잘못된 부분이나 개선점을 알려주시면 반영하겠습니다.


소스코드 복사시 하단에 있는 앵커 광고의 왼쪽 위를 클릭하여 닫은 후 해야 합니다.


문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

TistoryWhaleSkin3.4">