160 lines
7.5 KiB
Python
160 lines
7.5 KiB
Python
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||
|
import cv2
|
||
|
import sys
|
||
|
from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
|
||
|
|
||
|
class Ui_MainWindow(object):
|
||
|
def setupUi(self, MainWindow):
|
||
|
MainWindow.setObjectName("MainWindow")
|
||
|
MainWindow.resize(1090, 675)
|
||
|
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||
|
self.centralwidget.setObjectName("centralwidget")
|
||
|
self.btn1 = QtWidgets.QPushButton(self.centralwidget)
|
||
|
self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
|
||
|
self.btn1.setObjectName("btn1")
|
||
|
self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
|
||
|
self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
|
||
|
self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||
|
self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
|
||
|
self.AuftragsdetailsTable.setColumnCount(5)
|
||
|
self.AuftragsdetailsTable.setRowCount(1)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
font = QtGui.QFont()
|
||
|
font.setPointSize(8)
|
||
|
item.setFont(font)
|
||
|
self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
font.setPointSize(8)
|
||
|
item.setFont(font)
|
||
|
self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
font.setPointSize(8)
|
||
|
item.setFont(font)
|
||
|
self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
font.setPointSize(8)
|
||
|
item.setFont(font)
|
||
|
self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
font.setPointSize(8)
|
||
|
item.setFont(font)
|
||
|
self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
|
||
|
item = QtWidgets.QTableWidgetItem()
|
||
|
self.AuftragsdetailsTable.setItem(0, 0, item)
|
||
|
self.label = QtWidgets.QLabel(self.centralwidget)
|
||
|
self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
|
||
|
self.label.setObjectName("label")
|
||
|
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
|
||
|
self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
|
||
|
self.textEdit.setObjectName("textEdit")
|
||
|
self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
|
||
|
self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
|
||
|
self.bauteilTypBtn.setObjectName("bauteilTypBtn")
|
||
|
self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
|
||
|
self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
|
||
|
self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
|
||
|
self.label_3 = QtWidgets.QLabel(self.centralwidget)
|
||
|
self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
|
||
|
self.label_3.setObjectName("label_3")
|
||
|
self.label_4 = QtWidgets.QLabel(self.centralwidget)
|
||
|
self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
|
||
|
self.label_4.setObjectName("label_4")
|
||
|
self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
|
||
|
self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
|
||
|
self.textEdit_3.setObjectName("textEdit_3")
|
||
|
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||
|
self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
|
||
|
self.checkBox.setChecked(False)
|
||
|
self.checkBox.setObjectName("checkBox")
|
||
|
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
|
||
|
self.graphicsView.setGeometry(QtCore.QRect(1100, 20, int(640*1.2), int(480*1.2))) # position and size of camera frame
|
||
|
self.graphicsView.setObjectName("graphicsView")
|
||
|
MainWindow.setCentralWidget(self.centralwidget)
|
||
|
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
||
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
|
||
|
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)
|
||
|
|
||
|
def retranslateUi(self, MainWindow):
|
||
|
_translate = QtCore.QCoreApplication.translate
|
||
|
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
|
||
|
self.btn1.setText(_translate("MainWindow", "load Auftrag"))
|
||
|
self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
|
||
|
self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
|
||
|
self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
|
||
|
self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
|
||
|
self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
|
||
|
|
||
|
class CameraStreamApp(QtWidgets.QMainWindow):
|
||
|
def __init__(self, ui):
|
||
|
super().__init__()
|
||
|
self.ui = ui
|
||
|
self.yolo_stream = None # Initialize YOLOv8CameraStream as None
|
||
|
self.timer = QtCore.QTimer(self)
|
||
|
self.timer.timeout.connect(self.update_frame)
|
||
|
self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
|
||
|
self.scene = QtWidgets.QGraphicsScene(self)
|
||
|
self.ui.graphicsView.setScene(self.scene)
|
||
|
|
||
|
def start_camera(self):
|
||
|
# Start the YOLOv8 camera stream (only if not already started)
|
||
|
if self.yolo_stream is None:
|
||
|
self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
|
||
|
# self.yolo_stream.start() # Start the YOLOv8 stream
|
||
|
self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
|
||
|
|
||
|
def update_frame(self):
|
||
|
# Update the frame from YOLOv8 stream
|
||
|
if self.yolo_stream:
|
||
|
ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
|
||
|
|
||
|
if ret:
|
||
|
# new part including processing via yolo model
|
||
|
processed_frame = self.yolo_stream.process_frame(frame)
|
||
|
|
||
|
# Convert the frame from BGR (OpenCV format) to RGB
|
||
|
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
||
|
frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
|
||
|
|
||
|
# Convert the frame to QImage
|
||
|
h, w, ch = frame.shape
|
||
|
bytes_per_line = ch * w
|
||
|
qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
|
||
|
|
||
|
# Add the QImage to a QPixmap
|
||
|
pixmap = QtGui.QPixmap.fromImage(qt_image)
|
||
|
|
||
|
# Get the size of the graphicsView and scale the pixmap to fit
|
||
|
view_size = self.ui.graphicsView.size()
|
||
|
scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
|
||
|
|
||
|
# Update the scene with the scaled pixmap
|
||
|
self.scene.clear()
|
||
|
self.scene.addPixmap(scaled_pixmap)
|
||
|
|
||
|
def closeEvent(self, event):
|
||
|
# Release the camera when the application is closed
|
||
|
if self.yolo_stream is not None:
|
||
|
self.yolo_stream.cap.release()
|
||
|
event.accept()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
app = QtWidgets.QApplication(sys.argv)
|
||
|
MainWindow = QtWidgets.QMainWindow()
|
||
|
ui = Ui_MainWindow()
|
||
|
ui.setupUi(MainWindow)
|
||
|
|
||
|
# Initialize the CameraStreamApp with the UI
|
||
|
camera_app = CameraStreamApp(ui)
|
||
|
|
||
|
MainWindow.show()
|
||
|
sys.exit(app.exec_())
|