Anbei der vollständige Code beider Klassen:
Code: Alles auswählen
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtCore import QDir, Qt, QUrl
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel,QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget)
from PyQt5.QtWidgets import QMainWindow,QWidget, QPushButton, QAction
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets, QtCore, uic
import sys, logging
import roi_editor
class VideoWindow(QMainWindow):
def __init__(self, parent=None):
super(VideoWindow, self).__init__(parent)
self.setWindowTitle("ROI Editor")
self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
videoWidget = QVideoWidget()
self.file_name = None
self.duration = None
# Painting Init
self.pen = QtGui.QPen(QtGui.QColor(0,0,0))
self.pen.setWidth(3)
self.playButton = QPushButton()
self.playButton.setEnabled(False)
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.playButton.clicked.connect(self.play)
self.positionSlider = QSlider(Qt.Horizontal)
self.positionSlider.setRange(0, 0)
self.positionSlider.sliderMoved.connect(self.setPosition)
self.errorLabel = QLabel()
self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
QSizePolicy.Maximum)
# Create new action
openAction = QAction(QIcon('open.png'), '&Open', self)
openAction.setShortcut('Ctrl+O')
openAction.setStatusTip('Open movie')
openAction.triggered.connect(self.openFile)
# Create exit action
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(self.exitCall)
# create ROI action
setRoi = QAction("adjust", self)
setRoi.setShortcut('Ctrl+N')
setRoi.triggered.connect(self.adjust_roi)
# Create menu bar and add action
menuBar = self.menuBar()
fileMenu = menuBar.addMenu('&File')
fileMenu2 = menuBar.addMenu('ROI')
fileMenu2.addAction(setRoi)
# fileMenu.addAction(newAction)
fileMenu.addAction(openAction)
fileMenu.addAction(exitAction)
# Create a widget for window contents
wid = QWidget(self)
self.setCentralWidget(wid)
# Create layouts to place inside widget
controlLayout = QHBoxLayout()
controlLayout.setContentsMargins(0, 0, 0, 0)
controlLayout.addWidget(self.playButton)
controlLayout.addWidget(self.positionSlider)
layout = QVBoxLayout()
layout.addWidget(videoWidget)
layout.addLayout(controlLayout)
layout.addWidget(self.errorLabel)
# Set widget to contain window contents
wid.setLayout(layout)
self.mediaPlayer.setVideoOutput(videoWidget)
self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
self.mediaPlayer.positionChanged.connect(self.positionChanged)
self.mediaPlayer.durationChanged.connect(self.durationChanged)
self.mediaPlayer.error.connect(self.handleError)
def adjust_roi(self):
""" provides ROI coordinates / form (circle/rectancle) """
self.RoiAdjust = roi_editor.RoiAdjusting()
self.RoiAdjust.setGeometry(310, 400, 640, 630)
self.RoiAdjust.show()
def openFile(self):
try:
fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
QDir.homePath())
self.file_name = fileName
if fileName != '':
self.mediaPlayer.setMedia(
QMediaContent(QUrl.fromLocalFile(fileName)))
self.playButton.setEnabled(True)
except Exception as e:
logging.exception("Exception while opening the videofile:")
def exitCall(self):
sys.exit(app.exec_())
def play(self):
try:
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.mediaPlayer.pause()
else:
self.mediaPlayer.play()
except Exception as e:
logging.exception("Exception while playing the videofile:")
def mediaStateChanged(self, state):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.playButton.setIcon(
self.style().standardIcon(QStyle.SP_MediaPause))
else:
self.playButton.setIcon(
self.style().standardIcon(QStyle.SP_MediaPlay))
def positionChanged(self, position):
""" handover the position for creating template """
self.positionSlider.setValue(position)
frame_pos = int(position / 40)
# Handover for creating template at the choosen Videoframe
def durationChanged(self, duration):
self.duration = duration
self.positionSlider.setRange(0, duration)
def setPosition(self, position):
self.mediaPlayer.setPosition(position)
def handleError(self):
self.playButton.setEnabled(False)
self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
def request_data(self):
return self.file_name, self.duration
Code: Alles auswählen
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtCore import QDir, Qt, QUrl
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel,QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget)
from PyQt5.QtWidgets import QMainWindow,QWidget, QPushButton, QAction
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets, QtCore, uic
import sys, logging
import database_sqllite
import cv2
import numpy as np
import mediaplayer
class PaintRoi(QtWidgets.QWidget):
""" a transparent window for adjusting the ROI """
def __init__(self, x_axis, y_axis, circle, rectangle, x_radius, y_radius, red_slider, green_slider, blue_slider, parent=None):
super().__init__(parent)
self.x_axis = int(x_axis)
self.y_axis = int(y_axis)
self.x_radius = int(x_radius)
self.y_radius = int(y_radius)
self.red_slider = int(red_slider)
self.green_slider = int(green_slider)
self.blue_slider = int(blue_slider)
self.circle = circle
self.rectangle = rectangle
self.pen = QtGui.QPen(QtGui.QColor(0,0,0))
self.pen.setWidth(3)
def paintEvent(self, event=None):
""" paints event for adjusting ROI
inputs: x/y axis, choosen form
"""
painter = QtGui.QPainter(self)
painter.setPen(self.pen)
painter.setPen(QColor(self.red_slider, self.green_slider, self.blue_slider))
if self.circle:
painter.drawEllipse(self.x_axis,self.y_axis,self.x_radius,self.y_radius)
else:
painter.drawRect(self.x_axis,self.y_axis,self.x_radius,self.y_radius)
class RoiAdjusting(QtWidgets.QDialog):
""" provides control widgets for Roi Form, Radius, Postion """
def __init__(self,parent=None):
super().__init__(parent)
self.ui = uic.loadUi(r"D:\python_dev\GRAPHIC_ALARMING_MACHINE\GUI\Roi.ui", self)
self.ui.setWindowTitle('Roi adjusting')
self.ui.assetType.addItems(["Cornerbug", "CutIn Vertical", "CutIn Horizontal", "Multipurpose"])
self.ui.setRoi.clicked.connect(self.handover_roi)
self.ui.delRoi.clicked.connect(self.del_roi)
self.ui.save_config.clicked.connect(self.handover_config)
self.ui.delRoi.setStyleSheet("background-color: red")
self.ui.setRoi.setStyleSheet("background-color: green")
self.ui.save_config.setStyleSheet("background-color: green")
self.ui.save_template.clicked.connect(self.clicked_save_template)
self.createLogging()
def handover_roi(self):
self.x_axis = str(self.ui.slider_xaxis.value())
self.y_axis = str(self.ui.slider_yaxis.value())
self.x_radius = str(self.ui.slider_radius_x.value())
self.y_radius = str(self.ui.slider_radius_y.value())
self.slider_red = str(self.ui.red.value())
self.slider_green = str(self.ui.green.value())
self.slider_blue = str(self.ui.blue.value())
self.circle = self.ui.circleCheck.isChecked()
self.rectangle = self.ui.rectangleCheck.isChecked()
temp_x = float(self.ui.slider_xaxis.value()*2.3880)
temp_x = round(temp_x)
temp_y = float(self.ui.slider_yaxis.value()*2.3946)
temp_y = round(temp_y)
temp_x_radius = float(self.ui.slider_radius_x.value()*2.3880)
temp_x_radius = round(temp_x_radius)
temp_y_radius = float(self.ui.slider_radius_y.value()*2.3946)
temp_y_radius = round(temp_y_radius)
# Setting labels with values
self.ui.label_xasis.setText(str(temp_x) + "/ 1920")
self.ui.label_yasis.setText(str(temp_y) + "/ 1080")
self.ui.label_radius_x.setText(str(temp_x_radius) + "/ 1920")
self.ui.label_radius_y.setText(str(temp_y_radius) + "/ 1080")
self.ui.label_red.setText(self.slider_red)
self.ui.label_green.setText(self.slider_green)
self.ui.label_blue.setText(self.slider_blue)
# Transparent Frame for shape adjusting
self.Roi_painting = PaintRoi(self.x_axis, self.y_axis, self.circle, self.rectangle, self.x_radius, self.y_radius, self.slider_red, self.slider_green, self.slider_blue)
self.Roi_painting.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.Roi_painting.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.Roi_painting.setGeometry(1028, 430, 804, 451) # same geometry as videoPreview Mask (1028, 430, 804, )
self.Roi_painting.show()
def del_roi(self):
self.Roi_painting.close()
def clicked_save_template(self):
init_videoplayer = mediaplayer.VideoWindow()
a, b = init_videoplayer.request_data()
print(a)
print(b)
def handover_config(self):
""" handover to Server SQL Database """
# Config Name
configname = self.ui.config_name.text()
# ROI Coordinates
x_axis = float(self.ui.slider_xaxis.value()*2.3880)
x_axis = round(x_axis)
x_axis = int(x_axis /2)
y_axis = float(self.ui.slider_yaxis.value()*2.3946)
y_axis = round(y_axis)
y_axis = int(y_axis/2)
x_radius = float(self.ui.slider_radius_x.value()*2.3880)
x_radius = round(x_radius)
x_radius = int(x_radius / 2)
y_radius = float(self.ui.slider_radius_y.value()*2.3946)
y_radius = round(y_radius)
y_radius = int(y_radius / 2)
videopath = self.ui.videopath_destination.text()
videopath.translate({ord('\n'): None})
check_intervall = self.ui.checkintervall.value()
xentaurix_delay_temp = self.ui.xentaurix_delaytime.time()
xentaurix_delay = xentaurix_delay_temp.toString()
delay_muxing = self.ui.muxing_delaytime.value()
roi_threshold = self.ui.roi_threshold.value()
# Roi Asset Type
self.roi_type = self.ui.assetType.currentText()
# Template
configlist = [configname, self.roi_type, x_axis, y_axis, x_radius, y_radius, check_intervall, roi_threshold, videopath, xentaurix_delay, delay_muxing ]
logbox = self.ui.status_saving
if self.ui.config_name:
instance = database_sqllite.DatabasePerformance()
instance.writing_process_channelconfig(configlist, logbox) # configlist to database
else:
logging.exception("Could not create instance of the class createDatabaseChannelConfig")
def createLogging(self):
logging.basicConfig(
filename= r"D:\python_dev\GRAPHIC_ALARMING_MACHINE\LOGFILES\roi_editor.log",
level= logging.DEBUG,
style= "{",
format= "{asctime} [{levelname:8}] {message}",
datefmt="%d.%m.%Y %H:%M:%S")