This commit is contained in:
njdaoyehu 2024-11-25 16:35:23 +08:00
parent 12fb34fb77
commit 995b8f5390
3 changed files with 121 additions and 92 deletions

View File

@ -32,8 +32,10 @@ class _SubRoiData_(Structure):
('H', c_float * 9), ('H', c_float * 9),
] ]
SubRoiData = _SubRoiData_ SubRoiData = _SubRoiData_
class _CallbackInfo_(Structure): class _CallbackInfo_(Structure):
_fields_ = [ _fields_ = [
('code', c_int), ('code', c_int),
@ -47,6 +49,7 @@ class _CallbackInfo_(Structure):
('subRois', SubRoiData * 16), ('subRois', SubRoiData * 16),
] ]
CallbackInfo = _CallbackInfo_ CallbackInfo = _CallbackInfo_
# 回调函数类型定义 # 回调函数类型定义
CallbackType = CFUNCTYPE(None, POINTER(CallbackInfo)) CallbackType = CFUNCTYPE(None, POINTER(CallbackInfo))
@ -56,6 +59,7 @@ MSG_ONLY_RECORD = -1
MSG_LOCATION_RECORD = 0 MSG_LOCATION_RECORD = 0
MSG_DETECTION_RECORD = 1 MSG_DETECTION_RECORD = 1
class Msg: class Msg:
def __init__(self, msg_type, record, im2D): def __init__(self, msg_type, record, im2D):
self.msg_type = msg_type # 0刷新广角图片 1刷新高清 -1不刷新图片纯消息 self.msg_type = msg_type # 0刷新广角图片 1刷新高清 -1不刷新图片纯消息
@ -139,6 +143,7 @@ RUNNING_MODE_LOCATION = 0 # 广角相机运行模式
RUNNING_MODE_DETECTION = 1 # 高清检测运行模式 RUNNING_MODE_DETECTION = 1 # 高清检测运行模式
g_running_mode = RUNNING_MODE_NONE # 默认是广角相机运行模式 g_running_mode = RUNNING_MODE_NONE # 默认是广角相机运行模式
#################################################################################### ####################################################################################
# 内部接口定义 # 内部接口定义
#################################################################################### ####################################################################################
@ -151,9 +156,12 @@ def _get_msg_info(code) -> str:
return value.encode("utf-8") return value.encode("utf-8")
return "未知错误".encode("utf-8") return "未知错误".encode("utf-8")
get_msg_info = _get_msg_info
# 加工检测图像 # 加工检测图像
def _update_location_image(frame): def _update_location_image(frame):
global needHandle, recordCache, ckinfoCache global needHandle, recordCache, ckinfoCache
def switch(choice): def switch(choice):
if ckinfoCache.code == 1006: # TO_CLIENT_NOTIFY_DETECTION_END: 1006 if ckinfoCache.code == 1006: # TO_CLIENT_NOTIFY_DETECTION_END: 1006
for i in range(recordCache.roi_size): for i in range(recordCache.roi_size):
@ -164,6 +172,7 @@ def _update_location_image(frame):
else: else:
print("default Case") print("default Case")
# 在回调函数中将 record 数据拷贝出来 # 在回调函数中将 record 数据拷贝出来
def _copy_record(record): def _copy_record(record):
new_record = CallbackInfo() new_record = CallbackInfo()
@ -217,7 +226,8 @@ class ImageFramework(EdgeComponent):
# 加载C++库 # 加载C++库
current_file_dir = os.path.dirname(os.path.abspath(__file__)) current_file_dir = os.path.dirname(os.path.abspath(__file__))
(arch, suffix) = get_system_and_library_suffix() (arch, suffix) = get_system_and_library_suffix()
self.image_framework_sdk = CDLL(os.path.join(current_file_dir, f'../vendors/image-framework/{arch}/image_framework.{suffix}')) self.image_framework_sdk = CDLL(
os.path.join(current_file_dir, f'../vendors/image-framework/{arch}/image_framework.{suffix}'))
# 设置回调函数 # 设置回调函数
self.init_callback() self.init_callback()
except Exception as e: except Exception as e:
@ -257,6 +267,7 @@ class ImageFramework(EdgeComponent):
ret = self.image_framework_sdk.LibapiGetHQImage( ret = self.image_framework_sdk.LibapiGetHQImage(
buffer_pointer, frame.shape[1], frame.shape[0], 3, c_char_p(b"PythonProcessing")) buffer_pointer, frame.shape[1], frame.shape[0], 3, c_char_p(b"PythonProcessing"))
if ret != SYS_OK: if ret != SYS_OK:
print("ret != SYS_OK:" + str(ret))
record = CallbackInfo(code=ret, errorInfo=_get_msg_info(ret), bGetData=False) record = CallbackInfo(code=ret, errorInfo=_get_msg_info(ret), bGetData=False)
msg = Msg(MSG_DETECTION_RECORD, record, None) msg = Msg(MSG_DETECTION_RECORD, record, None)
g_msg_cache.append(msg) g_msg_cache.append(msg)
@ -322,6 +333,7 @@ class ImageFramework(EdgeComponent):
record.code = -10001 record.code = -10001
record.errorInfo = _get_msg_info(-10001) record.errorInfo = _get_msg_info(-10001)
return record return record
ret = self.image_framework_sdk.LibapiStartDetection() ret = self.image_framework_sdk.LibapiStartDetection()
if ret != SYS_OK: if ret != SYS_OK:
record = CallbackInfo() record = CallbackInfo()
@ -353,12 +365,12 @@ class ImageFramework(EdgeComponent):
record.code = -10002 record.code = -10002
record.errorInfo = _get_msg_info(-10002) record.errorInfo = _get_msg_info(-10002)
return record return record
ret = self.image_framework_sdk.LibapiStopDetection() ret = self.image_framework_sdk.LibapStopDetection()
if ret != SYS_OK: if ret != SYS_OK:
record.code = ret record.code = ret
record.errorInfo = _get_msg_info(ret) record.errorInfo = _get_msg_info(ret)
return record return record
g_running_mode = RUNNING_MODE_NONE # 切换为无模式 g_running_mode = RUNNING_MODE_LOCATION # 切换为无模式
return record return record
# 广角相机运行定位处理线程 # 广角相机运行定位处理线程
@ -371,7 +383,13 @@ class ImageFramework(EdgeComponent):
# 如果当前不是定位模式,不处理任何事务 # 如果当前不是定位模式,不处理任何事务
if g_running_mode != RUNNING_MODE_LOCATION: if g_running_mode != RUNNING_MODE_LOCATION:
time.sleep(0.5) time.sleep(0.5)
g_frame_cache = []
continue continue
# 上一帧还未处理完毕
if len(g_frame_cache) > 0:
continue
# 获取一帧图像 # 获取一帧图像
_, frame = capture.read() _, frame = capture.read()
# 如果图像为空,等待一秒,上报消息 # 如果图像为空,等待一秒,上报消息
@ -380,6 +398,8 @@ class ImageFramework(EdgeComponent):
self.logger.error("[ERROR] 广角相机未捕获到图像") self.logger.error("[ERROR] 广角相机未捕获到图像")
continue continue
print("location run")
if self.times % 3 == 0: if self.times % 3 == 0:
src_frame_ptr = c_char_p(frame.data.tobytes()) src_frame_ptr = c_char_p(frame.data.tobytes())
ret = self.image_framework_sdk.LibapiCameraSendMsgWithImage( ret = self.image_framework_sdk.LibapiCameraSendMsgWithImage(

View File

@ -285,3 +285,10 @@ QMessageBox QPushButton:pressed {
QMessageBox QDialogButtonBox#qt_msgbox_buttonbox { /* buttonBox */ QMessageBox QDialogButtonBox#qt_msgbox_buttonbox { /* buttonBox */
button-layout: 0; /* 设置QPushButton布局好像没啥作用 */ button-layout: 0; /* 设置QPushButton布局好像没啥作用 */
} }
QPlainTextEdit#logText {
border: none;
background-color: #222222;
font-size: 14px;
color: #bbbbbb;
}

View File

@ -1,10 +1,10 @@
import cv2 import cv2
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtGui import QPixmap, QImage, QTextCursor
from PyQt5.QtWidgets import QDialog, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QScrollArea, QPushButton, \ from PyQt5.QtWidgets import QDialog, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QScrollArea, QPushButton, \
QSpacerItem, QSizePolicy, QLabel, QMessageBox QSpacerItem, QSizePolicy, QLabel, QMessageBox, QPlainTextEdit
from components.image_framework import MSG_LOCATION_RECORD, MSG_DETECTION_RECORD from components.image_framework import MSG_LOCATION_RECORD, MSG_DETECTION_RECORD, get_msg_info
from core.context import AppContext from core.context import AppContext
from widget.embed_item import EmbedItem from widget.embed_item import EmbedItem
@ -29,6 +29,7 @@ class TaskRunDialog(QDialog):
self.view_widget = None self.view_widget = None
self.view_label = None self.view_label = None
self.picture_label = None self.picture_label = None
self.log_text = None
self.start_adjust_button = None self.start_adjust_button = None
self.start_check_button = None self.start_check_button = None
@ -62,6 +63,9 @@ class TaskRunDialog(QDialog):
except Exception as e: except Exception as e:
dd = 0 dd = 0
elif msg.msg_type == MSG_DETECTION_RECORD: 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: if msg.record.code < 0:
QMessageBox.warning(self, '错误信息', msg.record.errorInfo.decode('utf-8')) QMessageBox.warning(self, '错误信息', msg.record.errorInfo.decode('utf-8'))
self.set_button_default() self.set_button_default()
@ -173,37 +177,30 @@ class TaskRunDialog(QDialog):
self.picture_label = QLabel() self.picture_label = QLabel()
self.picture_label.setObjectName("pictureWidget") self.picture_label.setObjectName("pictureWidget")
self.picture_label.setFixedWidth(450) self.picture_label.setFixedWidth(930 * 450 / 700)
self.picture_label.setFixedHeight(450) self.picture_label.setFixedHeight(450)
self.picture_label.setScaledContents(True) self.picture_label.setScaledContents(True)
# picture_pixmap = QPixmap("assets/img2.png") self.picture_label.setStyleSheet("background: #222222;")
# self.picture_label.setPixmap(picture_pixmap)
self.view_widget = QWidget() self.view_widget = QWidget()
self.view_widget.setObjectName("viewWidget") self.view_widget.setObjectName("viewWidget")
self.view_widget.setFixedWidth(1920 * 450 / 1080)
self.view_widget.setFixedHeight(450) self.view_widget.setFixedHeight(450)
self.view_label = QLabel(self.view_widget) self.view_label = QLabel(self.view_widget)
self.view_label.setObjectName("viewLabel") self.view_label.setObjectName("viewLabel")
self.view_label.setFixedHeight(450) self.view_label.setFixedHeight(450)
self.view_label.setScaledContents(True) self.view_label.setScaledContents(True)
# view_pixmap = QPixmap("assets/img1.jpg") self.view_label.setStyleSheet("background: #222222;")
# sc = view_pixmap.height() / 450
# self.view_label.setFixedWidth(view_pixmap.width() / sc)
# self.view_label.setPixmap(view_pixmap)
# self.view_label.setGeometry((view_widget.width() - self.view_label.width() / 2), 0, self.view_label.width(), self.view_label.height())
view_check_widget = QWidget(self.view_widget) view_check_widget = QWidget(self.view_widget)
view_check_widget.setObjectName("viewCheckWidget") view_check_widget.setObjectName("viewCheckWidget")
view_check_widget.setGeometry(self.view_label.geometry().x() + 145, 170, 240, 240) view_check_widget.setGeometry(self.view_label.geometry().x() + 145, 170, 240, 240)
# view_widget = QWidget() self.log_text = QPlainTextEdit()
# view_widget.setObjectName("viewWidget") self.log_text.setObjectName("logText")
# view_widget.setFixedWidth(1000) self.log_text.setFixedHeight(450)
# view_widget.setFixedHeight(450) self.log_text.setReadOnly(True)
# picture_widget = QWidget()
# picture_widget.setObjectName("pictureWidget")
# picture_widget.setFixedHeight(450)
tool_widget = QWidget() tool_widget = QWidget()
tool_widget.setObjectName("toolWidget") tool_widget.setObjectName("toolWidget")
@ -258,6 +255,8 @@ class TaskRunDialog(QDialog):
content_layout.setSpacing(0) content_layout.setSpacing(0)
content_layout.addWidget(self.view_widget) content_layout.addWidget(self.view_widget)
content_layout.addSpacing(20) content_layout.addSpacing(20)
content_layout.addWidget(self.log_text)
content_layout.addSpacing(20)
content_layout.addWidget(self.picture_label) content_layout.addWidget(self.picture_label)
content_layout.addSpacing(20) content_layout.addSpacing(20)
content_layout.addWidget(tool_widget) content_layout.addWidget(tool_widget)
@ -293,6 +292,9 @@ class TaskRunDialog(QDialog):
self.stop_check_button.setEnabled(False) self.stop_check_button.setEnabled(False)
self.stop_task_button.setEnabled(False) self.stop_task_button.setEnabled(False)
self.log_text.setPlainText("")
self.picture_label.setPixmap(QPixmap(""))
result = AppContext.get_edge_context().get_component('image-framework').start_adjust() result = AppContext.get_edge_context().get_component('image-framework').start_adjust()
if result.code < 0: if result.code < 0:
self.set_button_default() self.set_button_default()
@ -316,8 +318,8 @@ class TaskRunDialog(QDialog):
self.stop_task_button.setEnabled(False) self.stop_task_button.setEnabled(False)
result = AppContext.get_edge_context().get_component('image-framework').stop_check() result = AppContext.get_edge_context().get_component('image-framework').stop_check()
if result.code < 0: if result.code < 0:
self.set_button_default()
QMessageBox.warning(self, '检测停止失败', result.errorInfo) QMessageBox.warning(self, '检测停止失败', result.errorInfo)
self.set_button_default()
def stop_task(self): def stop_task(self):
AppContext.get_edge_context().get_component('image-framework').stop_all() AppContext.get_edge_context().get_component('image-framework').stop_all()