2025-02-14 14:22:23 +08:00
|
|
|
from PyQt5.QtWidgets import QFrame, QGraphicsDropShadowEffect, QWidget, QGridLayout, QLabel
|
|
|
|
from PyQt5.QtCore import Qt, QSize, QRect
|
|
|
|
from PyQt5.QtGui import QColor, QPixmap, QImage
|
|
|
|
|
|
|
|
from components.image_framework import MSG_LOCATION_RECORD, MSG_DETECTION_RECORD, get_msg_info
|
|
|
|
from core.context import AppContext
|
|
|
|
from widget.message_box import MessageBox
|
|
|
|
from widget.task_result_embed import TaskResultEmbedFrame
|
|
|
|
from widget.task_result_legend import TaskResultLegendFrame
|
|
|
|
from widget.task_result_tools import TaskResultToolsFrame
|
|
|
|
import json
|
|
|
|
import math
|
|
|
|
import cv2
|
|
|
|
|
|
|
|
class TaskResultFrame(QFrame):
|
|
|
|
def __init__(self, task, parent=None):
|
|
|
|
super(TaskResultFrame, self).__init__(parent)
|
|
|
|
self.task = task
|
|
|
|
|
|
|
|
self.setWindowModality(Qt.WindowModal)
|
|
|
|
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
|
|
self.setWindowTitle("")
|
|
|
|
|
|
|
|
self.effect_shadow = QGraphicsDropShadowEffect(self)
|
|
|
|
self.effect_shadow.setOffset(0, 0) # 偏移
|
|
|
|
self.effect_shadow.setBlurRadius(10) # 阴影半径
|
|
|
|
self.effect_shadow.setColor(QColor(85,89,119)) # 阴影颜色
|
|
|
|
self.setGraphicsEffect(self.effect_shadow)
|
|
|
|
|
|
|
|
self.result_embed_frame = None
|
|
|
|
self.result_big_widget = None
|
|
|
|
self.result_big_label = None
|
|
|
|
self.result_small_widget = None
|
|
|
|
self.result_small_label = None
|
|
|
|
self.result_tools_frame = None
|
|
|
|
|
|
|
|
self.init_ui()
|
|
|
|
|
|
|
|
self.setGeometry(5, 5, AppContext.get_main_window().geometry().width() - 10, AppContext.get_main_window().geometry().height() - 10)
|
|
|
|
|
|
|
|
AppContext.get_edge_context().get_component('image-framework').signals.on_image_detect_result.connect(
|
|
|
|
lambda data: self.image_result(data))
|
|
|
|
|
|
|
|
def showEvent(self, e):
|
|
|
|
big_width = self.result_big_widget.geometry().width()
|
|
|
|
big_height = self.result_big_widget.geometry().height()
|
|
|
|
self.result_big_label.setFixedWidth(1920 * (big_height - 20) / 1080)
|
|
|
|
self.result_big_label.setFixedHeight(big_height - 20)
|
|
|
|
self.result_big_label.move((big_width - 1920 * (big_height - 20) / 1080) / 2, 10)
|
|
|
|
|
|
|
|
small_width = self.result_small_widget.geometry().width()
|
|
|
|
small_height = self.result_small_widget.geometry().height()
|
|
|
|
self.result_small_label.setFixedWidth(930 * (small_height - 20) / 700)
|
|
|
|
self.result_small_label.setFixedHeight(small_height - 20)
|
|
|
|
self.result_small_label.move((small_width - 930 * (small_height - 20) / 700) / 2, 10)
|
|
|
|
|
|
|
|
AppContext.get_edge_context().get_component('image-framework').start_location()
|
|
|
|
|
|
|
|
def image_result(self, msg):
|
|
|
|
qt_image = None
|
|
|
|
if msg.im2D is not None:
|
|
|
|
rgb_frame = cv2.cvtColor(msg.im2D, cv2.COLOR_BGR2RGB)
|
|
|
|
height, width, channels = rgb_frame.shape
|
|
|
|
bytes_per_line = channels * width
|
|
|
|
qt_image = QImage(rgb_frame.data, width, height, bytes_per_line, QImage.Format_RGB888)
|
|
|
|
|
|
|
|
if msg.msg_type == MSG_LOCATION_RECORD:
|
|
|
|
if qt_image is None:
|
|
|
|
return
|
|
|
|
try:
|
|
|
|
big_pixmap = QPixmap.fromImage(qt_image)
|
|
|
|
# sc = big_pixmap.height() / self.result_big_label.geometry().height()
|
|
|
|
# self.view_label.setFixedWidth(view_pixmap.width() / sc)
|
|
|
|
self.result_big_label.setPixmap(big_pixmap)
|
|
|
|
# self.view_label.setGeometry((self.view_widget.width() - self.view_label.width()) / 2, 0, self.view_label.width(), self.view_label.height())
|
|
|
|
except Exception as e:
|
2025-02-16 13:06:15 +08:00
|
|
|
print("广角摄像头有错误!")
|
|
|
|
|
2025-02-14 14:22:23 +08:00
|
|
|
elif msg.msg_type == MSG_DETECTION_RECORD:
|
|
|
|
# 显示日志
|
|
|
|
# self.log_text.appendPlainText(get_msg_info(msg.record.code).decode('utf-8'))
|
|
|
|
if msg.record.code < 0:
|
|
|
|
self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red"))
|
|
|
|
self.result_tools_frame.set_default()
|
|
|
|
MessageBox("错误信息", "error", get_msg_info(msg.record.code).decode('utf-8'), AppContext.get_main_window()).show()
|
|
|
|
|
|
|
|
# self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("red"))
|
|
|
|
# QMessageBox.warning(self, '错误信息', get_msg_info(msg.record.code).decode('utf-8'))
|
|
|
|
# self.set_button_default()
|
|
|
|
AppContext.get_edge_context().get_component('image-framework').start_location()
|
|
|
|
elif msg.record.code == 1008:
|
|
|
|
self.result_tools_frame.start_adjust_button.setEnabled(False)
|
|
|
|
self.result_tools_frame.start_check_button.setEnabled(True)
|
|
|
|
self.result_tools_frame.stop_check_button.setEnabled(True)
|
|
|
|
self.result_tools_frame.stop_task_button.setEnabled(False)
|
|
|
|
elif msg.record.code == 1012:
|
|
|
|
# self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green"))
|
|
|
|
# QMessageBox.warning(self, '成功信息', "检测结束")
|
|
|
|
# self.set_button_default()
|
|
|
|
|
|
|
|
self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("green"))
|
|
|
|
self.result_tools_frame.set_default()
|
|
|
|
MessageBox("成功信息", "success", "检测结束", AppContext.get_main_window()).show()
|
|
|
|
AppContext.get_edge_context().get_component('image-framework').start_location()
|
|
|
|
else:
|
|
|
|
self.result_tools_frame.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white"))
|
|
|
|
# self.insert_text(get_msg_info(msg.record.code).decode('utf-8'), QColor("white"))
|
|
|
|
if qt_image is None:
|
|
|
|
return
|
|
|
|
try:
|
|
|
|
small_pixmap = QPixmap.fromImage(qt_image)
|
|
|
|
self.result_small_label.setPixmap(small_pixmap)
|
|
|
|
# view_pixmap = QPixmap.fromImage(qt_image)
|
|
|
|
# self.picture_label.setPixmap(view_pixmap)
|
|
|
|
except Exception as e:
|
2025-02-16 13:06:15 +08:00
|
|
|
print("结果图片有错误!")
|
2025-02-14 14:22:23 +08:00
|
|
|
else:
|
2025-02-16 13:06:15 +08:00
|
|
|
print("任务结果错误!")
|
2025-02-14 14:22:23 +08:00
|
|
|
|
|
|
|
def init_ui(self):
|
|
|
|
layout = QGridLayout()
|
|
|
|
layout.setRowStretch(0,15)
|
|
|
|
layout.setRowStretch(1,1)
|
|
|
|
layout.setRowStretch(2,15)
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
# bim
|
|
|
|
self.result_embed_frame = TaskResultEmbedFrame(self.task)
|
|
|
|
layout.addWidget(self.result_embed_frame, 0, 0)
|
|
|
|
|
|
|
|
# legend
|
|
|
|
layout.addWidget(TaskResultLegendFrame(), 1, 0)
|
|
|
|
|
|
|
|
# result
|
|
|
|
result_widget = QWidget()
|
|
|
|
result_widget_layout = QGridLayout()
|
|
|
|
result_widget_layout.setContentsMargins(0,0,0,0)
|
|
|
|
result_widget_layout.setColumnStretch(0, 5)
|
|
|
|
result_widget_layout.setColumnStretch(1, 4)
|
|
|
|
result_widget_layout.setColumnStretch(2, 1)
|
|
|
|
result_widget.setLayout(result_widget_layout)
|
|
|
|
layout.addWidget(result_widget, 2, 0)
|
|
|
|
|
|
|
|
# result
|
|
|
|
# 摄像头1
|
|
|
|
self.result_big_widget = QWidget()
|
|
|
|
self.result_big_widget.setStyleSheet("background-color: rgba(255, 255, 255, 0.1);")
|
|
|
|
self.result_big_label = QLabel(self.result_big_widget)
|
|
|
|
self.result_big_label.setText("广角摄像头")
|
|
|
|
self.result_big_label.setAlignment(Qt.AlignCenter)
|
|
|
|
self.result_big_label.setStyleSheet("background: #222222;")
|
|
|
|
self.result_big_label.setVisible(True)
|
|
|
|
|
|
|
|
# 摄像头2
|
|
|
|
self.result_small_widget = QWidget()
|
|
|
|
self.result_small_widget.setStyleSheet("background-color: rgba(255, 255, 255, 0.1);")
|
|
|
|
self.result_small_label = QLabel(self.result_small_widget)
|
|
|
|
self.result_small_label.setText("高清摄像头")
|
|
|
|
self.result_small_label.setAlignment(Qt.AlignCenter)
|
|
|
|
self.result_small_label.setStyleSheet("background: #222222;")
|
|
|
|
self.result_small_label.setVisible(True)
|
|
|
|
|
|
|
|
# 按钮
|
|
|
|
self.result_tools_frame = TaskResultToolsFrame(self)
|
|
|
|
self.result_tools_frame.set_default()
|
|
|
|
|
|
|
|
# 布局
|
|
|
|
result_widget_layout.addWidget(self.result_big_widget, 0, 0)
|
|
|
|
result_widget_layout.addWidget(self.result_small_widget, 0, 1)
|
|
|
|
result_widget_layout.addWidget(self.result_tools_frame, 0, 2)
|
|
|
|
|