I believe it is all running on the main thread. I switched my code so that a second worker thread gets called when the Save Image button is pressed but now I am struggling to figure out to pass my variables from Worker 1 into Worker 2 so that I can save the image out. This is my code change:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
#
# Author: Colin O'Dowd
#
# Description: Video laryngoscope visualization platform
#
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from types import FrameType
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import cv2
import datetime
import numpy as np
import time
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1920, 1080)
self.cameraViewer = QtWidgets.QWidget(MainWindow)
self.cameraViewer.setObjectName("cameraViewer")
self.cameraFeed = QtWidgets.QLabel(self.cameraViewer)
self.cameraFeed.setGeometry(QtCore.QRect(10, 10, 1280, 960))
self.cameraFeed.setObjectName("cameraFeed")
self.startBTN = QtWidgets.QPushButton(self.cameraViewer)
self.startBTN.setGeometry(QtCore.QRect(1330, 10, 100, 100))
self.startBTN.setObjectName("startBTN")
self.startBTN.clicked.connect(self.StartFeed)
self.stopBTN = QtWidgets.QPushButton(self.cameraViewer)
self.stopBTN.setGeometry(QtCore.QRect(1440, 10, 100, 100))
self.stopBTN.setObjectName("stopBTN")
self.stopBTN.clicked.connect(self.StopFeed)
self.saveImageBTN = QtWidgets.QPushButton(self.cameraViewer)
self.saveImageBTN.setGeometry(QtCore.QRect(1550, 10, 100, 100))
self.saveImageBTN.setObjectName("saveImageBTN")
self.saveImageBTN.clicked.connect(self.SaveImage)
self.startVideoBTN = QtWidgets.QPushButton(self.cameraViewer)
self.startVideoBTN.setGeometry(QtCore.QRect(1660, 10, 100, 100))
self.startVideoBTN.setObjectName("startVideoBTN")
self.startVideoBTN.clicked.connect(self.StartVideo)
self.stopVideoBTN = QtWidgets.QPushButton(self.cameraViewer)
self.stopVideoBTN.setGeometry(QtCore.QRect(1770, 10, 100, 100))
self.stopVideoBTN.setObjectName("stopVideoBTN")
self.stopVideoBTN.clicked.connect(self.StopVideo)
self.brightnessSlider = QtWidgets.QSlider(self.cameraViewer)
self.brightnessSlider.setFocusPolicy(Qt.StrongFocus)
self.brightnessSlider.setTickPosition(QSlider.TicksBothSides)
self.brightnessSlider.setMinimum(-255)
self.brightnessSlider.setMaximum(255)
self.brightnessSlider.setTickInterval(11)
self.brightnessSlider.setSingleStep(1)
self.brightnessSlider.setGeometry(QtCore.QRect(1330, 120, 50, 100))
self.brightnessSlider.setObjectName("brightnessSlider")
self.brightnessSlider.valueChanged.connect(self.BrightnessSliderChange)
self.brightnessLabel = QtWidgets.QLabel(self.cameraViewer)
self.brightnessLabel.setGeometry(QtCore.QRect(1330, 230, 150, 50))
self.brightnessLabel.setText("Brightness: " + str(self.brightnessSlider.value()))
self.brightnessLabel.setObjectName("brightnessLabel")
MainWindow.setCentralWidget(self.cameraViewer)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.Worker1 = Worker1()
self.Worker1.start()
self.Worker1.ImageUpdate.connect(self.ImageUpdateSlot)
def ImageUpdateSlot(self, Image):
self.cameraFeed.setPixmap(QPixmap.fromImage(Image))
def StartFeed(self):
self.Worker1.start()
def StopFeed(self):
self.Worker1.stop()
def SaveImage(self):
self.Worker1.saveImage()
def StartVideo(self):
self.Worker1.startVideo()
def StopVideo(self):
self.Worker1.stopVideo()
def BrightnessSliderChange(self, value):
self.brightnessLabel.setText("Brightness: " + str(value))
self.Worker1.updateBrightness(value)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.startBTN.setText(_translate("MainWindow", "Start Feed"))
self.stopBTN.setText(_translate("MainWindow", "Stop Feed"))
self.saveImageBTN.setText(_translate("MainWindow", "Save Image"))
self.startVideoBTN.setText(_translate("MainWindow", "Start Video"))
self.stopVideoBTN.setText(_translate("MainWindow", "Stop Video"))
class Worker1(QThread):
def __init__(self):
super(Worker1, self).__init__()
self.ThreadActive = None
self.Capture = None
self.frame = None
self.videoCapture = None
self.videoFile = None
self.brightnessValue = 0
self.Worker2 = Worker2()
ImageUpdate = pyqtSignal(QImage)
def run(self):
self.ThreadActive = True
self.Capture = cv2.VideoCapture(0)
while self.ThreadActive:
ret, self.frame = self.Capture.read()
if ret:
#self.FlippedImage = cv2.flip(frame, 1)
Image = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
BrightnessMatrix = np.ones(Image.shape, dtype = "uint8") * abs(self.brightnessValue)
if (self.brightnessValue > 0):
Image = cv2.add(Image, BrightnessMatrix)
elif (self.brightnessValue < 0):
Image = cv2.subtract(Image, BrightnessMatrix)
ConvertToQtFormat = QImage(Image.data, Image.shape[1], Image.shape[0], QImage.Format_RGB888)
Pic = ConvertToQtFormat.scaled(1280, 960, Qt.KeepAspectRatio)
self.ImageUpdate.emit(Pic)
if self.videoCapture:
self.videoFile.write(self.frame)
self.Capture.release()
def stop(self):
self.ThreadActive = False
self.quit()
def saveImage(self):
""" time = datetime.datetime.now()
img_name = "image_{}.png".format(time.strftime("%Hh%Mm%Ss"))
if self.Capture.isOpened():
cv2.imwrite(img_name, self.frame) """
self.Worker2.start(Worker1)
def startVideo(self):
time = datetime.datetime.now()
video_name = "video_{}.avi".format(time.strftime("%Hh%Mm%Ss"))
codec = cv2.VideoWriter_fourcc(*'MJPG')
self.videoFile = cv2.VideoWriter(video_name, codec, 30.0, (640, 480))
self.videoCapture = True
def stopVideo(self):
self.videoCapture = False
time.sleep(0.1)
self.videoFile.release()
def updateBrightness(self, value):
self.brightnessValue = value
class Worker2(QThread):
def __init__(self):
super(Worker2, self).__init__()
self.Capture = Worker1.Capture
self.frame = Worker1.frame
def run(self):
time = datetime.datetime.now()
img_name = "image_{}.png".format(time.strftime("%Hh%Mm%Ss"))
if self.Capture.isOpened():
cv2.imwrite(img_name, self.frame)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())