diff --git a/python/finsTcp/finsTcp.py b/python/finsTcp/finsTcp.py new file mode 100644 index 0000000..e69de29 diff --git a/src/Core/back/backStruct.h b/src/Core/back/backStruct.h index 9f43d14..712bd31 100644 --- a/src/Core/back/backStruct.h +++ b/src/Core/back/backStruct.h @@ -41,9 +41,10 @@ static void createDirectoryIfNotExists(const std::string& path) { std::filesystem::create_directories(path); //std::cout << "已创建文件夹: " << path << std::endl; } - else {/* - std::cout << "文件夹已存在: " << path << std::endl;*/ - } +} +static void createDirectoryIfNotExists(const QString& path) { + QDir dir; + dir.mkpath(path); } #pragma once \ No newline at end of file diff --git a/src/Core/back/detData.h b/src/Core/back/detData.h index 3a720b6..cb9d519 100644 --- a/src/Core/back/detData.h +++ b/src/Core/back/detData.h @@ -45,7 +45,6 @@ public: QString uuid = getUuid();//根据时间和随机数生成的值,唯一 std::string SNcode;//SN条码 std::string cameraKeyName;//相机名 - std::map resultData;//结果数据 triggerManager* triggerPtr = nullptr;//触发器指针 一般为plc模块指针 #pragma endregion #pragma region 存图相关 diff --git a/src/Core/back/imgSaveThreadManager.h b/src/Core/back/imgSaveThreadManager.h index 67b1bc2..facc3b9 100644 --- a/src/Core/back/imgSaveThreadManager.h +++ b/src/Core/back/imgSaveThreadManager.h @@ -3,6 +3,7 @@ #include #include #include +#define saveImgEnable 1 enum imgSaveThreadType { oriImg, @@ -48,7 +49,9 @@ public: while (!localQueue.isEmpty()) { auto data = std::move(localQueue.dequeue()); qDebug() << "saving img " << QString::fromStdString(data.first); +#if saveImgEnable cv::imwrite(data.first, data.second); +#endif // 不需要手动 release(), cv::Mat 会自动析构 } } @@ -96,31 +99,31 @@ class imgSaveThreadManager { public: imgSaveThreadManager(std::string pathIn) { - path = pathIn; + path = QString::fromStdString(pathIn); } ~imgSaveThreadManager() {}; - void setPath(std::string pathIn){ + void setPath(QString pathIn){ path = pathIn; } imgSaveThread saveThread; - std::string genDirName(std::shared_ptr data, imgSaveThreadType type) { + QString genDirName(std::shared_ptr data, imgSaveThreadType type) { //sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data->SNcode);//查找之前的数据 //获取关键数据 - std::string imgSaveDirStr = path;//所有图片的路径 sample "D://CCD" - std::string imgTypeDirStr;//二级目录,图片类型决定 sample "Result" - std::string dateDirStr;//三级目录,日期决定 sample"2024-6-8" - std::string hourDirStr;//四级目录,小时段决定 sample "14H" - std::string okNgStr;//五级目录,OK/NG决定 sample "OK" - std::string detailNameStr;//六级目录 主要是SN,如没有sn则可能是相机名称 + QString imgSaveDirStr = path;//所有图片的路径 sample "D://CCD" + QString imgTypeDirStr;//二级目录,图片类型决定 sample "Result" + QString dateDirStr;//三级目录,日期决定 sample"2024-6-8" + QString hourDirStr;//四级目录,小时段决定 sample "14H" + QString okNgStr;//五级目录,OK/NG决定 sample "OK" + QString detailNameStr;//六级目录 主要是SN,如没有sn则可能是相机名称 #pragma region 赋值 //imgTypeDirStr switch (type) { case oriImg: - imgTypeDirStr = "Ori"; + imgTypeDirStr = "原图"; break; case resImg: - imgTypeDirStr = "Result"; + imgTypeDirStr = "结果图"; break; default: imgTypeDirStr = "error"; @@ -128,20 +131,24 @@ public: { QDateTime currentDateTime = QDateTime::currentDateTime(); - dateDirStr = currentDateTime.toString("yyyy-MM-dd").toStdString(); - hourDirStr = std::to_string(currentDateTime.time().hour()) + "H//"; + dateDirStr = currentDateTime.toString("yyyy-MM-dd"); + hourDirStr = QString::number(currentDateTime.time().hour()) + "H//"; } - if(data->aiDetOK == true && data->halconOK == true) - okNgStr = "OK"; - else + if(data->aiDetOK == false && data->halconOK == false) okNgStr = "NG"; + else if (data->aiDetOK == false) + okNgStr = "aiNG"; + else if (data->halconOK == false) + okNgStr = "halconNG"; + else + okNgStr = "OK"; //detailNameStr if ((data->SNcode).length() != 0) - detailNameStr = data->SNcode; + detailNameStr = QString::fromStdString(data->SNcode); else - detailNameStr = data->cameraKeyName; + detailNameStr = QString::fromStdString(data->cameraKeyName); #pragma endregion - return std::string(imgSaveDirStr + "/" + + return QString(imgSaveDirStr + "/" + imgTypeDirStr + "/" + dateDirStr + "/" + hourDirStr + "/" + @@ -184,33 +191,34 @@ public: void saveOri(std::shared_ptr data) { - std::string fileSavePath = genDirName(data, oriImg);//获取文件夹名 + QString fileSavePath = genDirName(data, oriImg);//获取文件夹名 createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建 std::vectorfileNames = genFileNames(data, oriImg); + for (int index = 0; index < fileNames.size(); index++) - saveThread.addData(fileSavePath+fileNames[index], data->oriImgs[index]); + saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + fileNames[index], data->oriImgs[index]); int queueSize = saveThread.queueSize(); if (queueSize > 10) qDebug() << "queueSize " << queueSize; } void saveRes(std::shared_ptr data) { - std::string fileSavePath = genDirName(data, resImg);//获取文件夹名 + QString fileSavePath = genDirName(data, resImg);//获取文件夹名 createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建 //结果图保存 std::vectorresFileNames = genFileNames(data, resImg); for (int index = 0; index < resFileNames.size(); index++) - saveThread.addData(fileSavePath + resFileNames[index], data->resultImgs[index], imgSaveThread::priority); + saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + resFileNames[index], data->resultImgs[index], imgSaveThread::priority); //seg std::vectorsegFileNames = genFileNames(data, segImg); for (int index = 0; index < segFileNames.size(); index++) - saveThread.addData(fileSavePath + segFileNames[index], data->segOriginImgs[index]); + saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + segFileNames[index], data->segOriginImgs[index]); //cls std::vectorclsFileNames = genFileNames(data, clsImg); for (int index = 0; index < clsFileNames.size(); index++) - saveThread.addData(fileSavePath + clsFileNames[index], data->clsOriginImgs[index].second); + saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + clsFileNames[index], data->clsOriginImgs[index].second); //额外储存NG文件夹 //std::string additionalSaveNgImgPath = genDirName(data, additionalSaveNgImg); @@ -235,7 +243,7 @@ public: //} } private: - std::string path = ""; + QString path = ""; }; diff --git a/src/Core/handleAi/handleAiModel.cpp b/src/Core/handleAi/handleAiModel.cpp index 0494170..fc5fa46 100644 --- a/src/Core/handleAi/handleAiModel.cpp +++ b/src/Core/handleAi/handleAiModel.cpp @@ -36,6 +36,9 @@ void handleAiModelManager::handleAiModelManager::run() init = true; status = InitOK; } + else { + status = InitOK; + } diff --git a/src/Core/handleAi/handleAiModel.h b/src/Core/handleAi/handleAiModel.h index 113c5d0..dad64e3 100644 --- a/src/Core/handleAi/handleAiModel.h +++ b/src/Core/handleAi/handleAiModel.h @@ -9,7 +9,7 @@ //#include #include #include -const bool enableHandleAiModel = true; // 是否启用HandleAI模型 +const bool enableHandleAiModel = false; // 是否启用HandleAI模型 class handleAiModelSeg { public: diff --git a/src/core/back/detCallbackChain.hpp b/src/core/back/detCallbackChain.hpp index 09b8592..47b39e3 100644 --- a/src/core/back/detCallbackChain.hpp +++ b/src/core/back/detCallbackChain.hpp @@ -6,25 +6,31 @@ #include #include #include +#include +#include -template +using namespace std::placeholders; +template class detCallbackChain { public: enum class State { Idle, algoEvaluate, resultHandle, Finished }; - using resultHandleCallback = std::function)>; - using processAlgoCallback = std::function, handleAiModelsTemplate*)>; - detCallbackChain(imgSaveThreadManager* imgSaveThreadManager = nullptr, - handleAiModelsTemplate* _handleAiModelsIn = nullptr) - : _imgSaveThreadManager(imgSaveThreadManager), _handleAiModels(_handleAiModelsIn) { + using resultHandleCallback = std::function, resultTemplate)>; + using processAlgoCallback = std::function, handleAiModelsTemplate*)>; + detCallbackChain(ServiceManager* _ServiceManagerIn, handleAiModelsTemplate* _handleAiModelsTemplateIn) + : _imgSaveThreadManager(_ServiceManagerIn->_imgSaveThreadManager), + _handleAiModels(_handleAiModelsTemplateIn), + _triggerManager(_ServiceManagerIn->_triggerManager){ + int threadCount = 2 * QThread::idealThreadCount(); QThreadPool::globalInstance()->setMaxThreadCount(threadCount); } - void ansyncProcess(std::shared_ptr data) { + void ansyncProcess(std::shared_ptr data, QByteArray afterTakeImgCmd = "") { #pragma region 方法1 较慢 - QFuture future = QtConcurrent::run([this, data]() { - process(data); + QFuture future = QtConcurrent::run([this, data, afterTakeImgCmd]() { + process(data, afterTakeImgCmd); }); + //std::cout << "now runing" << std::to_string(QThreadPool::globalInstance()->activeThreadCount()) << std::endl; #pragma endregion #pragma region 方法2 较慢 安全 //QThread* thread = new QThread; @@ -51,29 +57,30 @@ public: // }); #pragma endregion } - void process(std::shared_ptr data) { + void process(std::shared_ptr data, QByteArray afterTakeImgCmd = "") { while (data->oriImgs.size() < data->imgAmountMin) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + if(afterTakeImgCmd != "") + _triggerManager->writeShort(afterTakeImgCmd); //发送拍照完成指令 //等待图片满足要求后,储存原图,异步执行算法函数 - algoEvaluate(data, _handleAiModels); + auto resultData = algoEvaluate(data, _handleAiModels); //执行完毕后异步获取储存使用结果 - resultHandle(data); + resultHandle(data, resultData); // 确保线程安全退出 qDebug() << "Processing finished for data with UUID:" << data->uuid; QThread::currentThread()->quit(); } - bool algoEvaluate(std::shared_ptr data, handleAiModelsTemplate* model) { - + resultTemplate algoEvaluate(std::shared_ptr data, handleAiModelsTemplate* model) { + resultTemplate result; try { std::chrono::steady_clock::time_point algoStartTime = std::chrono::steady_clock::now(); - bool result = _processAlgoCallback(data, model); + result = _processAlgoCallback(data, model); std::chrono::steady_clock::time_point algoEndTime = std::chrono::steady_clock::now(); data->algoTime = std::chrono::duration_cast(algoEndTime - algoStartTime).count(); - return result; } catch (HDevEngineCpp::HDevEngineException& ex) { std::cout << "HDevEngineException: " << ex.Message() << std::endl; @@ -94,17 +101,17 @@ public: std::cout << "Caught exception: " << e.what() << std::endl; qDebug() << "Caught exception: " << e.what(); } - return false; + return result; } - void resultHandle(std::shared_ptr data){ + void resultHandle(std::shared_ptr data, resultTemplate& resultdata){ std::shared_ptr dataPtr = data; detDataManager* dManager = data->dManager; data->dManager->deleteDetData(data->uuid); try { detectionResultHandle(data); for (auto func : resultHandleCallbacks) - func(data); + func(data, resultdata); } catch (const std::exception& e) { @@ -125,12 +132,11 @@ public: qDebug() << totalCtStr; //std::cout << totalCtStr.toStdString() << std::endl; // 将耗时数据保存入数据库或日志 - // data->sqlVec.push_back({ "SN", data->SNcode }); - // data->sqlVec.push_back({ "totalCt", std::to_string(totalCt.count()) + "ms" }); - + data->sqlVec.push_back({ "SN", data->SNcode }); + data->sqlVec.push_back({ "totalCt", std::to_string(data->algoTime) + "ms" }); // 异步保存检测图像 - std::async(std::launch::async, &imgSaveThreadManager::saveOri, _imgSaveThreadManager, data); - std::async(std::launch::async, &imgSaveThreadManager::saveRes, _imgSaveThreadManager, data); + std::thread([this,data] {_imgSaveThreadManager->saveOri(data); }).detach(); + std::thread([this,data] {_imgSaveThreadManager->saveRes(data); }).detach(); } #pragma region 注册回调函数 @@ -146,9 +152,11 @@ public: private: imgSaveThreadManager* _imgSaveThreadManager = nullptr; handleAiModelsTemplate* _handleAiModels = nullptr; - + triggerManager* _triggerManager = nullptr; std::vector< resultHandleCallback>resultHandleCallbacks; processAlgoCallback _processAlgoCallback; - //std::vector> futures; // 用于存储异步处理的结果 + + + ServiceManager* _serviceManager; }; #pragma once \ No newline at end of file diff --git a/src/core/back/serviceManager.h b/src/core/back/serviceManager.h index da284d0..4d69c45 100644 --- a/src/core/back/serviceManager.h +++ b/src/core/back/serviceManager.h @@ -1,14 +1,14 @@ -#include +#include #include #include #include class ServiceManager { public: - detDataManager* _detDataManager = nullptr;// ¼ì²âÊý¾ݹÜÀíÆ÷ ÐèҪ³õʼ»¯ - imgSaveThreadManager* _imgSaveThreadManager = nullptr;// ±£´æͼÏñÏ߳Ì ÐèҪ³õʼ»¯ - triggerManager* _triggerManager = nullptr;// ´¥·¢¹ÜÀíÆ÷ - handleAiModelManager* _handleAiModelManager = nullptr;// ģÐ͹ÜÀíÆ÷ + detDataManager* _detDataManager = nullptr;// 检测数据管理器 需要初始化 + imgSaveThreadManager* _imgSaveThreadManager = nullptr;// 保存图像线程 需要初始化 + triggerManager* _triggerManager = nullptr;// 触发管理器 + handleAiModelManager* _handleAiModelManager = nullptr;// 模型管理器 detThreadManager* _threadManager = nullptr; cameraManager* _cameraManager = nullptr; }; diff --git a/src/launcher.zip b/src/launcher.zip new file mode 100644 index 0000000..9b16a73 Binary files /dev/null and b/src/launcher.zip differ diff --git a/src/launcher/GUI/JsonEditorDialog.h b/src/launcher/GUI/JsonEditorDialog.h index b5aa0d1..1abfe6f 100644 --- a/src/launcher/GUI/JsonEditorDialog.h +++ b/src/launcher/GUI/JsonEditorDialog.h @@ -6,12 +6,23 @@ #include #include #include - -class JsonEditorDialog : public QDialog { +#include +#include +#include +#include +#include +class JsonEditor : public QDialog { Q_OBJECT public: - JsonEditorDialog(const nlohmann::json& json, QWidget* parent = nullptr) - : QDialog(parent), m_json(json), m_originalJson(json) + virtual nlohmann::json getJson() { return nlohmann::json(); }; +}; + +class JsonEditorGeneral : public JsonEditor { + Q_OBJECT +public: + JsonEditorGeneral(const nlohmann::json& json, QWidget* parent = nullptr) + : //QDialog(parent), + m_json(json), m_originalJson(json) { setWindowTitle("JSON 编辑器"); resize(600, 400); @@ -31,11 +42,11 @@ public: mainLayout->addWidget(m_textEdit); mainLayout->addLayout(btnLayout); - connect(m_btnOk, &QPushButton::clicked, this, &JsonEditorDialog::onAccept); + connect(m_btnOk, &QPushButton::clicked, this, &JsonEditorGeneral::onAccept); connect(m_btnCancel, &QPushButton::clicked, this, &QDialog::reject); } - nlohmann::json getJson() const { return m_json; } + nlohmann::json getJson() { return m_json; } private slots: void onAccept() { @@ -133,3 +144,146 @@ private: QPushButton* m_btnOk; QPushButton* m_btnCancel; }; + +class JsonParamTableEditor : public JsonEditor { + Q_OBJECT +public: + JsonParamTableEditor(const nlohmann::json& json, QWidget* parent = nullptr) + : m_json(json), m_originalJson(json) + { + setWindowTitle("JSON 表格编辑器"); + resize(600, 400); + setWindowFlags(Qt::FramelessWindowHint); + this->setObjectName("JsonParamTableEditor"); + this->setStyleSheet(QString("QDialog#JsonParamTableEditor {background-color: rgb(%1);border: 2px solid #000000;border-radius: 6px;}").arg(sColor_Blue)); + // ------------------- + // 表格 + m_tableWidget = new QTableWidget(this); + m_tableWidget->setColumnCount(2); + m_tableWidget->setHorizontalHeaderLabels({ "", "数值" }); + m_tableWidget->horizontalHeader()->setStretchLastSection(true); + m_tableWidget->verticalHeader()->hide(); // 不显示序号 + + int row = 0; + for (auto& [key, value] : m_json.items()) { + m_tableWidget->insertRow(row); + + QTableWidgetItem* keyItem = new QTableWidgetItem(QString::fromStdString(key)); + keyItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + m_tableWidget->setItem(row, 0, keyItem); + + QTableWidgetItem* valueItem = new QTableWidgetItem(QString::fromStdString(value.dump())); + m_tableWidget->setItem(row, 1, valueItem); + + row++; + } + + // ------------------- + // 底部按钮 + m_btnOk = new fancyButtonText(70,22,"保存", ""); + m_btnCancel = new fancyButtonText(70, 22, "取消", ""); + + QHBoxLayout* btnLayout = new QHBoxLayout; + btnLayout->addStretch(); + btnLayout->addWidget(m_btnOk); + btnLayout->addWidget(m_btnCancel); + + // ------------------- + // 主布局 + QVBoxLayout* mainLayout = new QVBoxLayout(this); + mainLayout->addWidget(m_tableWidget); + mainLayout->addLayout(btnLayout); + + // ------------------- + // 信号槽 + connect(m_btnOk, &QPushButton::clicked, this, &JsonParamTableEditor::onAccept); + connect(m_btnCancel, &QPushButton::clicked, this, &QDialog::reject); + + + m_tableWidget->setStyleSheet(QString(R"( + QTableWidget { + background-color: rgb(%1); + font-family: "Microsoft YaHei"; + font-size: 12pt; + color: #ffffff; + } + QHeaderView::section { + background-color: #0078d7; + padding: 4px; + font-weight: bold; + } + )").arg(sColor_Blue).arg(sColor_GoldWithBlack)); + } + + nlohmann::json getJson() const { return m_json; } + +private slots: + void onAccept() { + nlohmann::json newJson = m_originalJson; + + for (int row = 0; row < m_tableWidget->rowCount(); ++row) { + QString key = m_tableWidget->item(row, 0)->text(); + QString valStr = m_tableWidget->item(row, 1)->text(); + + try { + auto& oldVal = m_originalJson.at(key.toStdString()); + nlohmann::json parsed = nlohmann::json::parse(valStr.toStdString()); + + if (!typeCompatible(oldVal, parsed)) { + QMessageBox::warning(this, "类型错误", + QString("键 \"%1\" 的类型与原始不符,期望类型: %2") + .arg(key) + .arg(QString::fromStdString(typeName(oldVal)))); + return; + } + + newJson[key.toStdString()] = parsed; + } + catch (std::exception& e) { + QMessageBox::warning(this, "解析错误", + QString("键 \"%1\" 的值无法解析为 JSON: %2") + .arg(key) + .arg(e.what())); + return; + } + } + + m_json = newJson; + accept(); + } + +private: + bool typeCompatible(const nlohmann::json& old_val, const nlohmann::json& new_val) { + return old_val.type() == new_val.type(); + } + + std::string typeName(const nlohmann::json& val) { + switch (val.type()) { + case nlohmann::json::value_t::string: return "string"; + case nlohmann::json::value_t::number_integer: return "integer"; + case nlohmann::json::value_t::number_unsigned: return "unsigned integer"; + case nlohmann::json::value_t::number_float: return "float"; + case nlohmann::json::value_t::boolean: return "boolean"; + case nlohmann::json::value_t::array: return "array"; + case nlohmann::json::value_t::object: return "object"; + case nlohmann::json::value_t::null: return "null"; + default: return "unknown"; + } + } + +private: + nlohmann::json m_json; + nlohmann::json m_originalJson; + + QTableWidget* m_tableWidget; + fancyButtonText* m_btnOk; + fancyButtonText* m_btnCancel; +}; + +class JsonEditorSelector { +public: + static JsonEditor* selector(const nlohmann::json& json, QWidget* parent = nullptr) { + return new JsonParamTableEditor(json, parent); + } +}; +#pragma once \ No newline at end of file diff --git a/src/launcher/GUI/front/pages/displayPageWidget.h b/src/launcher/GUI/front/pages/displayPageWidget.h index 1464297..83059f8 100644 --- a/src/launcher/GUI/front/pages/displayPageWidget.h +++ b/src/launcher/GUI/front/pages/displayPageWidget.h @@ -9,6 +9,7 @@ #include #include #include +#include class displayWidget :public QWidget { Q_OBJECT @@ -22,7 +23,7 @@ public: historyShowListWidget* historyImgs = new historyShowListWidget(); //uiModuleLocationMap* _uiModuleLocationMap = new uiModuleLocationMap(); LogWindow* log = new LogWindow(); - displayWidget(appConfig* config) + displayWidget(appConfig* config) :m_config(config) { this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); this->setMaximumSize(9999, 9999); @@ -68,16 +69,30 @@ public: QPalette palette; palette.setColor(QPalette::WindowText, Qt::white); QFont font("微软雅黑", 24, QFont::Bold); - QVBoxLayout* hLayout = new QVBoxLayout(leftWidget); - hLayout->setContentsMargins(0, 0, 0, 0); + QVBoxLayout* vLayout = new QVBoxLayout(leftWidget); + vLayout->setContentsMargins(0, 0, 0, 0); Title = new QLabel(u8"主界面"); Title->setFont(font); Title->setPalette(palette); Title->setAlignment(Qt::AlignLeft); - hLayout->addWidget(Title); - hLayout->addWidget(&_ImageWidgetManager); + fancyButtonText* btn = new fancyButtonText(200, 50, u8"修改检测参数", ""); + connect(btn, &QPushButton::clicked, [=]() { + JsonEditor* dlg = JsonEditorSelector::selector(m_config->settingJson["backend"]["missionSettings"], this); + dlg->setAttribute(Qt::WA_DeleteOnClose); + connect(dlg, &QDialog::accepted, this, [this, dlg]() { + m_config->settingJson["backend"]["missionSettings"] = dlg->getJson(); + }); + dlg->show(); }); + + QHBoxLayout* titleLayout = new QHBoxLayout(this); + + titleLayout->addWidget(Title); + titleLayout->addWidget(btn); + vLayout->addLayout(titleLayout); + + vLayout->addWidget(&_ImageWidgetManager); _ImageWidgetManager.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); for (auto& vData : config->viewDatas) { @@ -111,7 +126,8 @@ private slots: emit historyClickSignal(path); emit changeStackWidget(3); } - +private: + appConfig* m_config; signals: void historyClickSignal(QString); void changeStackWidget(int); diff --git a/src/launcher/GUI/front/pages/summary_data_page.h b/src/launcher/GUI/front/pages/summary_data_page.h index 2268e9e..867a065 100644 --- a/src/launcher/GUI/front/pages/summary_data_page.h +++ b/src/launcher/GUI/front/pages/summary_data_page.h @@ -67,7 +67,7 @@ public: m_plot->xAxis->setLabelColor(Qt::white); // "时间" / "数值" 文字 m_plot->yAxis->setLabelColor(Qt::white); - m_plot->yAxis->setRange(m_limitLow - 2, m_limitHigh + 2); + // 鼠标追踪用的 tracer m_tracer = new QCPItemTracer(m_plot); @@ -89,6 +89,15 @@ public: // 绑定鼠标移动事件 connect(m_plot, &QCustomPlot::mouseMove, this, &WaveFormWidget::onMouseMoveInPlot); + if (title.contains("对齐度")) { + auto fixedTicker = QSharedPointer(new QCPAxisTickerFixed); + fixedTicker->setTickStep(0.1); + fixedTicker->setScaleStrategy(QCPAxisTickerFixed::ssNone); // 不自动放大 + m_plot->yAxis->setTicker(fixedTicker); + m_plot->yAxis->setRange(-0.2,0.8); + } + else + m_plot->yAxis->setRange(qMax(0.0, m_limitLow - (m_limitHigh - m_limitLow)), m_limitHigh + 2); addLimitLines(m_limitHigh, m_limitLow); @@ -103,14 +112,14 @@ public: m_xOverLimit.append(m_timeCounter); m_yOverLimit.append(value); - auto* textItem = new QCPItemText(m_plot); - textItem->setPositionAlignment(Qt::AlignLeft | Qt::AlignBottom); - textItem->position->setType(QCPItemPosition::ptPlotCoords); - textItem->position->setCoords(m_timeCounter, value); - textItem->setText(QString::number(value, 'f', 2)); - textItem->setColor(Qt::yellow); - textItem->setFont(QFont("微软雅黑", 8,QFont::Bold)); - m_textItems.append(textItem); + //auto* textItem = new QCPItemText(m_plot); + //textItem->setPositionAlignment(Qt::AlignLeft | Qt::AlignBottom); + //textItem->position->setType(QCPItemPosition::ptPlotCoords); + //textItem->position->setCoords(m_timeCounter, value); + //textItem->setText(QString::number(value, 'f', 2)); + //textItem->setColor(Qt::yellow); + //textItem->setFont(QFont("微软雅黑", 8,QFont::Bold)); + //m_textItems.append(textItem); } ++m_timeCounter; @@ -154,7 +163,7 @@ protected: private slots: void editJsonParameters() { - JsonEditorDialog* dlg = new JsonEditorDialog(m_json, this); + JsonEditor* dlg = JsonEditorSelector::selector(m_json, this); dlg->setAttribute(Qt::WA_DeleteOnClose); connect(dlg, &QDialog::accepted, this, [this, dlg]() { m_json = dlg->getJson(); @@ -204,7 +213,7 @@ private: addLimitLines(m_limitHigh, m_limitLow); // 更新坐标范围 - m_plot->yAxis->setRange(m_limitLow - 2, m_limitHigh + 2); + //m_plot->yAxis->setRange(m_limitLow - (m_limitHigh - m_limitLow), m_limitHigh + (m_limitHigh - m_limitLow)); // 清空超限数据 m_xOverLimit.clear(); @@ -295,16 +304,6 @@ public: m_layout->addWidget(m_title); - fancyButtonText* btn = new fancyButtonText(200, 50, u8"修改检测参数",""); - connect(btn, &QPushButton::clicked, [=]() { - JsonEditorDialog* dlg = new JsonEditorDialog(m_config->settingJson["backend"]["missionSettings"], this); - dlg->setAttribute(Qt::WA_DeleteOnClose); - connect(dlg, &QDialog::accepted, this, [this, dlg]() { - m_config->settingJson["backend"]["missionSettings"] = dlg->getJson(); - }); - dlg->show(); }); - m_layout->addWidget(btn); - m_mainWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_layout->addWidget(m_mainWidget); parsingJson(json); diff --git a/src/launcher/appConfig/appConfig.cpp b/src/launcher/appConfig/appConfig.cpp index 89f13b5..47d3a5d 100644 --- a/src/launcher/appConfig/appConfig.cpp +++ b/src/launcher/appConfig/appConfig.cpp @@ -6,16 +6,16 @@ void appConfig::parsingSettingJson() { fs::path appWorkPath = fs::current_path(); originJson = readJsonFromPath(appWorkPath.string() + "/config/setting.json"); - jsonVersion = originJson["main"]["jsonVersion"]; + jsonVersion = originJson["jsonVersion"]; if(jsonVersion != "1.0.1"){ std::cout << "Json version mismatch, please update the config file." << std::endl; std::cout << "Json版本不匹配,请检查json配置文件" << std::endl; exit(1); } - objectSelect = originJson["main"]["objectSelect"]; - loginPassWord = originJson["main"]["loginPassWord"]; + objectSelect = originJson["objectSelect"]; + loginPassWord = originJson["loginPassWord"]; - settingJson = originJson[objectSelect]; + settingJson = readJsonFromPath(appWorkPath.string() + "/config/" + objectSelect +".json"); softwareTile = settingJson["softwareTile"]; imgSavePath = settingJson["backend"]["imgSaveBasePath"]; //viewer diff --git a/src/launcher/appConfig/appConfig.h b/src/launcher/appConfig/appConfig.h index 52b1d44..8298d2e 100644 --- a/src/launcher/appConfig/appConfig.h +++ b/src/launcher/appConfig/appConfig.h @@ -14,6 +14,7 @@ public: void saveSettingJson() { originJson[objectSelect] = settingJson; saveJsonFromPath("./config/setting.json", originJson); + saveJsonFromPath("./config/"+ objectSelect +".json", settingJson); } nlohmann::json settingJson; std::string softwareTile;//软件标题 diff --git a/src/launcher/logger/spdLogSupport.hpp b/src/launcher/logger/spdLogSupport.hpp index 1808882..a59e139 100644 --- a/src/launcher/logger/spdLogSupport.hpp +++ b/src/launcher/logger/spdLogSupport.hpp @@ -17,7 +17,7 @@ public: file_name, file_path + "/" + file_name + ".log", 0, 0); // 日志按天保存 logger_->set_level(spdlog::level::debug); // 设置日志级别为 Debug spdlog::flush_every(std::chrono::seconds(1));//每秒写入一次 - logger_->set_pattern("[%Y-%m-%d %H:%M:%S] [Thread %t] [%l] %v"); + logger_->set_pattern("[%Y-%m-%d %H:%M:%S %e] [Thread %t] [%l] %v"); } catch (const std::exception& ex) { std::cout << "Log initialization failed: " << ex.what() << std::endl; diff --git a/src/mission/952_15_H_25D/952_15_H_25D.h b/src/mission/952_15_H_25D/952_15_H_25D.h index aa5c6fd..8812f87 100644 --- a/src/mission/952_15_H_25D/952_15_H_25D.h +++ b/src/mission/952_15_H_25D/952_15_H_25D.h @@ -7,16 +7,16 @@ #include -struct M952_15_H_summaryData +struct M952_15_H_algoResult { - QString LT_Distance = "-1"; - QString RT_Distance = "-1"; - QString LD_Distance = "-1"; - QString RD_Distance = "-1"; - QString L_Duiqidu = "-1"; - QString R_Duiqidu = "-1"; + double LT_Distance = -1; + double RT_Distance = -1; + double LD_Distance = -1; + double RD_Distance = -1; + double L_Duiqidu = -1; + double R_Duiqidu = -1; - bool aiResultIsNG = true; + bool aiResultIsOK = false; }; class handleAIModels { public: @@ -51,7 +51,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr data,cv::Mat for (int i = 0; i < contours.size(); i++) { cv::Rect rect = cv::boundingRect(contours[i]); if (rect.width < _handleAiModels->handleAI_WIDTH && rect.height < _handleAiModels->handleAI_HEIGHT) continue; // 过滤掉小轮廓 - auto clsImgs = cutImg2ClsVec(rect, img); + auto clsImgs = cutImg2ClsVec(rect, img,cv::Size(256,256)); bool clsIsNg = false; for (auto& clsImg : clsImgs) { int clsResult = _handleAiModels->CLS_25D->Evaluate(clsImg); @@ -63,7 +63,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr data,cv::Mat cv::Scalar color = cv::Scalar(0, 255, 0); if (clsIsNg == true) { color = cv::Scalar(0, 0, 255); - isOK = true; + isOK = false; cv::Mat imgTmp; cv::cvtColor(img(rect), imgTmp, cv::COLOR_GRAY2BGR); QMutexLocker locker(&paintMutex); @@ -84,7 +84,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr data,cv::Mat return isOK; } -static bool _952_15_H_Algo(std::shared_ptr data, handleAIModels* _handleAIModels) +static M952_15_H_algoResult _952_15_H_Algo(std::shared_ptr data, handleAIModels* _handleAIModels) { qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; HDevEngineCpp::HDevProcedure proc("Cal_LouBai_Distance"); @@ -94,13 +94,13 @@ static bool _952_15_H_Algo(std::shared_ptr data, handleAIModels* _hand if (data->oriImgs.size() != 3) { qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; + return M952_15_H_algoResult(); } if (data->oriImgs[0].rows == 100) { cv::Mat Paint; data->oriImgs[0].copyTo(Paint); cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return true; + return M952_15_H_algoResult(); } cv::Mat Paint; @@ -117,7 +117,7 @@ static bool _952_15_H_Algo(std::shared_ptr data, handleAIModels* _hand else src2.copyTo(Paint); - std::future future = std::async(std::launch::async, _952_15_H_25D_ALGO_HuaShangAI, data, data->oriImgs[2], _handleAIModels, std::ref(Paint), std::ref(paintMutex)); + //std::future future = std::async(std::launch::async, _952_15_H_25D_ALGO_HuaShangAI, data, data->oriImgs[2], _handleAIModels, std::ref(Paint), std::ref(paintMutex)); HTuple out_Distance, out_ResultRows, out_ResultCols, out_Flag, out_LinePonit; { HObject in_Image1 = MatToHObject(src1); @@ -179,37 +179,37 @@ static bool _952_15_H_Algo(std::shared_ptr data, handleAIModels* _hand textPainter.putText(Paint, "留白算法NG", cv::Point(0, 200), cv::Scalar(0, 0, 255)); data->halconOK = false; } + M952_15_H_algoResult resultData; + resultData.LT_Distance = LT_Distance; + resultData.RT_Distance = RT_Distance; + resultData.LD_Distance = LD_Distance; + resultData.RD_Distance = RD_Distance; + resultData.L_Duiqidu = L_Duiqidu; + resultData.R_Duiqidu = R_Duiqidu; - data->resultData.insert(std::make_pair("LT_Distance", LT_Distance)); - data->resultData.insert(std::make_pair("RT_Distance", RT_Distance)); - data->resultData.insert(std::make_pair("LD_Distance", LD_Distance)); - data->resultData.insert(std::make_pair("RD_Distance", RD_Distance)); - data->resultData.insert(std::make_pair("L_Duiqidu", L_Duiqidu)); - data->resultData.insert(std::make_pair("R_Duiqidu", R_Duiqidu)); - - bool futureResult = future.get(); + /*bool futureResult = future.get(); if (futureResult) { - textPainter.putText(Paint, "模型检测结果: NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + textPainter.putText(Paint, "模型检测结果: OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); } else { - textPainter.putText(Paint, "模型检测结果: OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "模型检测结果: NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); } - data->resultData.insert(std::make_pair("aiResultIsNG", futureResult)); + resultData.aiResultIsOK = futureResult;*/ cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); // 缩小结果图 data->resultImgs.push_back(Paint); - data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG + //data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG finish = clock(); qDebug() << "[Debug]2D useTime:" << finish - start << "ms"; - return true; + return resultData; } #pragma endregion class M952_15_H : public mission { public: - summaryData _summaryData; - std::shared_ptr< detCallbackChain> algo_liubai; + summaryData _summaryData; + detCallbackChain* algo_liubai; handleAIModels _handleAIModels; void parseJson(nlohmann::json& json) { _handleAIModels.liubai_Enforcement_OK = json.value("留白检测结果强制OK", true); @@ -264,7 +264,7 @@ public: _25DCamera_2 = _serviceManager->_cameraManager->getCamera("25D-2"); if (_25DCamera_2 == nullptr) { std::cout << "camera ->> 25D-2 not found" << std::endl; - return false; + return false; } #pragma endregion #pragma region 注册触发器回调 @@ -275,11 +275,9 @@ public: _serviceManager->_triggerManager->registerCallback(9800, 1, [this](QByteArray& byteArray) {sumRequest2(byteArray); }, "25D-2结果获取触发"); #pragma endregion #pragma region 处理算法回调链 - algo_liubai = std::make_shared>(_serviceManager->_imgSaveThreadManager, &_handleAIModels); + algo_liubai = new detCallbackChain (_serviceManager,&_handleAIModels); algo_liubai->registerProcessAlgoCallback(_952_15_H_Algo); - algo_liubai->registerResultHandleCallback(([this](std::shared_ptr data) { - HouDuan12ResultHandle(data); - })); + algo_liubai->registerResultHandleCallback(std::bind(&M952_15_H::HouDuan12ResultHandle, this, _1, _2)); #pragma endregion return true; @@ -288,7 +286,7 @@ public: bool houduan1SecondTime = false; void HouDuan1(QByteArray& byteArray){ int snPos = 9300; - _serviceManager->_triggerManager->writeShort({ "D9200_0","D9201_1","D9202_1" }); + _serviceManager->_triggerManager->writeShort({ "D9200_0","D9201_1" }); std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); std::shared_ptr data = _serviceManager->_detDataManager->createDetData( "2.5D-H-1",sn, 3, _25DCamera_1->config.oriSaveFormat);//创建数据包 @@ -303,7 +301,7 @@ public: else data->resultImgShowSet.push_back(new showImgPack("后段1-2", "结果图")); houduan1SecondTime = !houduan1SecondTime; - algo_liubai->ansyncProcess(data);//处理算法 + algo_liubai->ansyncProcess(data, "D9202_1");//处理算法 qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; } @@ -311,7 +309,7 @@ public: bool houduan2SecondTime = false; void HouDuan2(QByteArray& byteArray){ int snPos = 9700; - _serviceManager->_triggerManager->writeShort({"D9600_0","D9601_1","D9602_1"}); + _serviceManager->_triggerManager->writeShort({"D9600_0","D9601_1"}); std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); std::shared_ptr data = _serviceManager->_detDataManager->createDetData( @@ -324,11 +322,11 @@ public: else data->resultImgShowSet.push_back(new showImgPack("后段2-2", "结果图")); houduan2SecondTime = !houduan2SecondTime; - algo_liubai->ansyncProcess(data);//处理算法 + algo_liubai->ansyncProcess(data, "D9602_1");//处理算法 qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; } - void HouDuan12ResultHandle(std::shared_ptr data){ + void HouDuan12ResultHandle(std::shared_ptr data, M952_15_H_algoResult resultData){ //发送图片 if (data->resultImgs.size() > 0){ for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){ @@ -340,43 +338,33 @@ public: } } //结果数据保存 - if (data->resultData.size() > 0){ - std::string sn = data->SNcode; - try { - M952_15_H_summaryData* dataPtr = _summaryData.get(sn); - dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); - dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); - dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); - dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); - dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); - dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); - dataPtr->aiResultIsNG = data->resultData["aiResultIsNG"].toBool(); - if (data->cameraKeyName == "2.5D-H-1") { - emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); - emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); - emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); - emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); - emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - } - else{ - emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); - emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); - emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); - emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); - emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - - } + std::string sn = data->SNcode; + try { + M952_15_H_algoResult* dataPtr = _summaryData.get(sn); + *dataPtr = resultData; + if (data->cameraKeyName == "2.5D-H-1") { + emit bridge->summaryData_addData("后段1-左上留白", resultData.LT_Distance); + emit bridge->summaryData_addData("后段1-右上留白", resultData.RT_Distance); + emit bridge->summaryData_addData("后段1-左下留白", resultData.LD_Distance); + emit bridge->summaryData_addData("后段1-右下留白", resultData.RD_Distance); + emit bridge->summaryData_addData("后段1-左对齐度", resultData.L_Duiqidu); + emit bridge->summaryData_addData("后段1-右对齐度", resultData.R_Duiqidu); } - catch (...) { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); - } - } - else { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + else{ + emit bridge->summaryData_addData("后段2-左上留白", resultData.LT_Distance); + emit bridge->summaryData_addData("后段2-右上留白", resultData.RT_Distance); + emit bridge->summaryData_addData("后段2-左下留白", resultData.LD_Distance); + emit bridge->summaryData_addData("后段2-右下留白", resultData.RD_Distance); + emit bridge->summaryData_addData("后段2-左对齐度", resultData.L_Duiqidu); + emit bridge->summaryData_addData("后段2-右对齐度", resultData.R_Duiqidu); + + } + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } qDebug() << "SN:" << QString::fromStdString(data->SNcode) << "检测结束 结果获取完成" ; } @@ -387,39 +375,41 @@ public: int snPos = 9500; std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); - M952_15_H_summaryData* dataPtr = _summaryData.get(sn); - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9410_"+ dataPtr->RT_Distance);//右上留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9412_" + dataPtr->RD_Distance);//右下留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9414_" + dataPtr->R_Duiqidu);//右对其度 + M952_15_H_algoResult* dataPtr = _summaryData.get(sn); + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9410_"+ QString::number(dataPtr->RT_Distance));//右上留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9412_" + QString::number(dataPtr->RD_Distance));//右下留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9414_" + QString::number(dataPtr->R_Duiqidu));//右对其度 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9436_" + dataPtr->LT_Distance);//左上留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9438_" + dataPtr->LD_Distance);//左下留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9440_" + dataPtr->L_Duiqidu);//左对其度 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9436_" + QString::number(dataPtr->LT_Distance));//左上留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9438_" + QString::number(dataPtr->LD_Distance));//左下留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9440_" + QString::number(dataPtr->L_Duiqidu));//左对其度 int result = 1; //留白检测结果 - if (_handleAIModels.liubai_Enforcement_OK == false)if (dataPtr->RT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->RD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->LT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->LD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || + if (_handleAIModels.liubai_Enforcement_OK == false) + if (dataPtr->RT_Distance> _handleAIModels.liubai_MaxThreshold || + dataPtr->RD_Distance > _handleAIModels.liubai_MaxThreshold || + dataPtr->LT_Distance > _handleAIModels.liubai_MaxThreshold || + dataPtr->LD_Distance > _handleAIModels.liubai_MaxThreshold || - dataPtr->RT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->RD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->LT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->LD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold) { + dataPtr->RT_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->RD_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->LT_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->LD_Distance < _handleAIModels.liubai_MinThreshold) { result = 2; qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " 留白检测结果NG"; } //对齐度检测结果 - if (_handleAIModels.duiqidu_Enforcement_OK == false)if (dataPtr->R_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold || - dataPtr->L_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold || - dataPtr->R_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold || - dataPtr->L_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold) { + if (_handleAIModels.duiqidu_Enforcement_OK == false) + if (dataPtr->R_Duiqidu > _handleAIModels.duiqidu_MaxThreshold || + dataPtr->L_Duiqidu > _handleAIModels.duiqidu_MaxThreshold || + dataPtr->R_Duiqidu < _handleAIModels.duiqidu_MinThreshold || + dataPtr->L_Duiqidu < _handleAIModels.duiqidu_MinThreshold) { result = 2; qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " 对齐度检测结果NG"; } //AI模型检测结果 - if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsNG == true) { + if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsOK == false) { result = 2; qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " AI模型检测结果NG"; } @@ -441,39 +431,41 @@ public: _serviceManager->_triggerManager->sendFinsMsg("write_short_D9800_0"); int snPos = 9900; std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); - M952_15_H_summaryData* dataPtr = _summaryData.get(sn); - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9810_" + dataPtr->RT_Distance);//右上留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9812_" + dataPtr->RD_Distance);//右下留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9814_" + dataPtr->R_Duiqidu);//右对其度 + M952_15_H_algoResult* dataPtr = _summaryData.get(sn); + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9810_" + QString::number(dataPtr->RT_Distance));//右上留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9812_" + QString::number(dataPtr->RD_Distance));//右下留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9814_" + QString::number(dataPtr->R_Duiqidu));//右对其度 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9836_" + dataPtr->LT_Distance);//左上留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9838_" + dataPtr->LD_Distance);//左下留白 - _serviceManager->_triggerManager->sendFinsMsg("write_float_D9840_" + dataPtr->L_Duiqidu);//左对其度 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9836_" + QString::number(dataPtr->LT_Distance));//左上留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9838_" + QString::number(dataPtr->LD_Distance));//左下留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D9840_" + QString::number(dataPtr->L_Duiqidu));//左对其度 int result = 1; //留白检测结果 - if(_handleAIModels.liubai_Enforcement_OK == false)if (dataPtr->RT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->RD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->LT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || - dataPtr->LD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold || + if(_handleAIModels.liubai_Enforcement_OK == false) + if (dataPtr->RT_Distance > _handleAIModels.liubai_MaxThreshold || + dataPtr->RD_Distance> _handleAIModels.liubai_MaxThreshold || + dataPtr->LT_Distance > _handleAIModels.liubai_MaxThreshold || + dataPtr->LD_Distance > _handleAIModels.liubai_MaxThreshold || - dataPtr->RT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->RD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->LT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold || - dataPtr->LD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ) { + dataPtr->RT_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->RD_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->LT_Distance < _handleAIModels.liubai_MinThreshold || + dataPtr->LD_Distance < _handleAIModels.liubai_MinThreshold ) { result = 2; qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " 留白检测结果NG"; } //对齐度检测结果 - if (_handleAIModels.duiqidu_Enforcement_OK == false)if( dataPtr->R_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold || - dataPtr->L_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold || - dataPtr->R_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold || - dataPtr->L_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold) { + if (_handleAIModels.duiqidu_Enforcement_OK == false) + if( dataPtr->R_Duiqidu > _handleAIModels.duiqidu_MaxThreshold || + dataPtr->L_Duiqidu > _handleAIModels.duiqidu_MaxThreshold || + dataPtr->R_Duiqidu < _handleAIModels.duiqidu_MinThreshold || + dataPtr->L_Duiqidu < _handleAIModels.duiqidu_MinThreshold) { result = 2; qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " 对齐度检测结果NG"; } //AI模型检测结果 - if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsNG == true) { + if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsOK == true) { result = 2; qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " AI模型检测结果NG"; } diff --git a/src/mission/952_15_Q_25D/952_15_Q_25D.h b/src/mission/952_15_Q_25D/952_15_Q_25D.h index 6a62641..f5d9515 100644 --- a/src/mission/952_15_Q_25D/952_15_Q_25D.h +++ b/src/mission/952_15_Q_25D/952_15_Q_25D.h @@ -64,7 +64,7 @@ static bool _952_15_Q_25D_ALGO_HuaShangAI(cv::Mat& img, handleAIModels* _handleA return isNg; } -static bool _952_15_Q_25D_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { +static M952_15_Q_summaryData _952_15_Q_25D_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { //获取模型 qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; @@ -72,7 +72,7 @@ static bool _952_15_Q_25D_ALGO(std::shared_ptr data, handleAIModels* _ if (data->oriImgs.size() != 3) { qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; + return M952_15_Q_summaryData(); } cv::Mat Paint; @@ -88,7 +88,7 @@ static bool _952_15_Q_25D_ALGO(std::shared_ptr data, handleAIModels* _ } data->resultImgs.push_back(Paint); data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG - return true; + return M952_15_Q_summaryData(); } #pragma endregion @@ -96,7 +96,7 @@ class M952_15_Q : public mission { public: handleAIModels _handleAIModels; summaryData _summaryData; - std::shared_ptr< detCallbackChain> algo_25D; + std::shared_ptr< detCallbackChain> algo_25D; bool init(ServiceManager* _serviceManagerIN, nlohmann::json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { @@ -123,11 +123,9 @@ public: _serviceManager->_triggerManager->registerCallback(8090, 1, [this](QByteArray& byteArray) {sumRequest2(byteArray); }, "25D-2结果获取触发"); #pragma endregion #pragma region 处理算法回调链 - algo_25D = std::make_shared>(_serviceManager->_imgSaveThreadManager, &_handleAIModels); + algo_25D = std::make_shared>(_serviceManager, &_handleAIModels); algo_25D->registerProcessAlgoCallback(_952_15_Q_25D_ALGO); - algo_25D->registerResultHandleCallback(([this](std::shared_ptr data) { - qianduan12ResultHandle(data); - })); + algo_25D->registerResultHandleCallback(std::bind(&M952_15_Q::qianduan12ResultHandle, this, _1, _2)); #pragma endregion _handleAIModels.SEG_25D = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_25D"); @@ -175,7 +173,7 @@ public: qianduan2SecondTime = !qianduan2SecondTime; } - void qianduan12ResultHandle(std::shared_ptr data){ + void qianduan12ResultHandle(std::shared_ptr data, M952_15_Q_summaryData resultData) { //发送图片 if (data->resultImgs.size() > 0){ for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){ @@ -187,43 +185,35 @@ public: } } //结果数据保存 - if (data->resultData.size() > 0){ - std::string sn = data->SNcode; - try { - M952_15_Q_summaryData* dataPtr = _summaryData.get(sn); - dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); - dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); - dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); - dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); - dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); - dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); - if (data->cameraKeyName == "2.5D-Q-1") { - emit bridge->summaryData_addData("前段1-左上留白", data->resultData["LT_Distance"].toDouble()); - emit bridge->summaryData_addData("前段1-右上留白", data->resultData["RT_Distance"].toDouble()); - emit bridge->summaryData_addData("前段1-左下留白", data->resultData["LD_Distance"].toDouble()); - emit bridge->summaryData_addData("前段1-右下留白", data->resultData["RD_Distance"].toDouble()); - emit bridge->summaryData_addData("前段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - emit bridge->summaryData_addData("前段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - } - else{ - emit bridge->summaryData_addData("前段2-左上留白", data->resultData["LT_Distance"].toDouble()); - emit bridge->summaryData_addData("前段2-右上留白", data->resultData["RT_Distance"].toDouble()); - emit bridge->summaryData_addData("前段2-左下留白", data->resultData["LD_Distance"].toDouble()); - emit bridge->summaryData_addData("前段2-右下留白", data->resultData["RD_Distance"].toDouble()); - emit bridge->summaryData_addData("前段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - emit bridge->summaryData_addData("前段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - - } + std::string sn = data->SNcode; + try { + M952_15_Q_summaryData* dataPtr = _summaryData.get(sn); + *dataPtr = resultData; + if (data->cameraKeyName == "2.5D-Q-1") { + emit bridge->summaryData_addData("前段1-左上留白", resultData.LT_Distance.toDouble()); + emit bridge->summaryData_addData("前段1-右上留白", resultData.RT_Distance.toDouble()); + emit bridge->summaryData_addData("前段1-左下留白", resultData.LD_Distance.toDouble()); + emit bridge->summaryData_addData("前段1-右下留白", resultData.RD_Distance.toDouble()); + emit bridge->summaryData_addData("前段1-左对齐度", resultData.L_Duiqidu.toDouble()); + emit bridge->summaryData_addData("前段1-右对齐度", resultData.R_Duiqidu.toDouble()); } - catch (...) { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("前段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); - } - } - else { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("前段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + else{ + emit bridge->summaryData_addData("前段2-左上留白", resultData.LT_Distance.toDouble()); + emit bridge->summaryData_addData("前段2-右上留白", resultData.RT_Distance.toDouble()); + emit bridge->summaryData_addData("前段2-左下留白", resultData.LD_Distance.toDouble()); + emit bridge->summaryData_addData("前段2-右下留白", resultData.RD_Distance.toDouble()); + emit bridge->summaryData_addData("前段2-左对齐度", resultData.L_Duiqidu.toDouble()); + emit bridge->summaryData_addData("前段2-右对齐度", resultData.R_Duiqidu.toDouble()); + + } + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("前段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; } diff --git a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D.h b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D.h index ca46ba9..098fae1 100644 --- a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D.h +++ b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D.h @@ -95,7 +95,7 @@ static bool _952_15_Q_2D_P_ALGO_ZangWuAI(cv::Mat& img, handleAIModels* _handleAi return isNg; } -static bool _952_15_Q_2D_P_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { +static _952_15_Q_2D3D_1_summaryData _952_15_Q_2D_P_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { //获取模型 qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; @@ -103,7 +103,7 @@ static bool _952_15_Q_2D_P_ALGO(std::shared_ptr data, handleAIModels* if (data->oriImgs.size() != 3) { qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; + return _952_15_Q_2D3D_1_summaryData(); } cv::Mat Paint; @@ -128,9 +128,38 @@ static bool _952_15_Q_2D_P_ALGO(std::shared_ptr data, handleAIModels* } data->resultImgs.push_back(Paint); data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG - return true; + return _952_15_Q_2D3D_1_summaryData(); } +static _952_15_Q_2D3D_1_summaryData _952_15_Q_2D_N_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return _952_15_Q_2D3D_1_summaryData(); + } + cv::Mat Paint; + cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR); + putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return _952_15_Q_2D3D_1_summaryData(); +} +static _952_15_Q_2D3D_1_summaryData _952_15_Q_3D_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 2) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return _952_15_Q_2D3D_1_summaryData(); + } + cv::Mat Paint; + cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR); + putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return _952_15_Q_2D3D_1_summaryData(); +} #pragma endregion class _952_15_Q_2D3D_1 : public mission { @@ -158,7 +187,9 @@ public: int summary_triggerPos; #pragma endregion handleAIModels _handleAIModels; - std::shared_ptr< detCallbackChain> algo_2D_P; + std::shared_ptr< detCallbackChain> algo_2D_P; + std::shared_ptr< detCallbackChain> algo_2D_N; + std::shared_ptr< detCallbackChain> algo_3D; summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData; bool init(ServiceManager* _serviceManagerIN, nlohmann::json& _missionJson, @@ -194,9 +225,21 @@ public: _serviceManager->_triggerManager->registerCallback(summary_triggerPos, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "结果获取触发"); #pragma endregion #pragma region 处理算法回调链 - algo_2D_P = std::make_shared>(_serviceManager->_imgSaveThreadManager, &_handleAIModels); + algo_2D_P = std::make_shared>(_serviceManager, &_handleAIModels); algo_2D_P->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO); - algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr data) { + algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr data, _952_15_Q_2D3D_1_summaryData sumdata) { + Qian_2D_P_ResultHandle(data); + })); + + algo_2D_N = std::make_shared>(_serviceManager, &_handleAIModels); + algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO); + algo_2D_N->registerResultHandleCallback(([this](std::shared_ptr data, _952_15_Q_2D3D_1_summaryData sumdata) { + Qian_2D_P_ResultHandle(data); + })); + + algo_3D = std::make_shared>(_serviceManager, &_handleAIModels); + algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO); + algo_3D->registerResultHandleCallback(([this](std::shared_ptr data, _952_15_Q_2D3D_1_summaryData sumdata) { Qian_2D_P_ResultHandle(data); })); #pragma endregion @@ -271,43 +314,40 @@ public: } } //结果数据保存 - if (data->resultData.size() > 0) { - std::string sn = data->SNcode; - try { - _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); - // dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); - //dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); - // dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); - // dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); - // dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); - // dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); - // if (data->cameraKeyName == "2.5D-H-1") { - // emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - // emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - // } - // else{ - // emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - // emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - // - // } + std::string sn = data->SNcode; + try { + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + // dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); + //dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); + // dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); + // dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); + // dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); + // dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); + + // if (data->cameraKeyName == "2.5D-H-1") { + // emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + // emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + // } + // else{ + // emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + // emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + // + // } - } - catch (...) { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); - } } - else { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; } //8020 1 @@ -320,6 +360,7 @@ public: _serviceManager->_detDataManager->createDetData( "Qian_2D_N", sn, 1, _2DCamera_N->config.oriSaveFormat); _2DCamera_N->captureImage(data); + algo_2D_N->ansyncProcess(data); //处理算法 qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; data->resultImgShowSet.push_back(new showImgPack(_2D_N_viewName + QString::number(Qian_2D_N_SecondTime + 1), "结果图")); @@ -336,6 +377,7 @@ public: _serviceManager->_detDataManager->createDetData( "Qian_3D", sn, 2,_3DCamera_1->config.oriSaveFormat); _3DCamera_1->captureImage(data); + algo_3D->ansyncProcess(data); //处理算法 qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; data->resultImgShowSet.push_back(new showImgPack(_3D_P_viewName + QString::number(Qian_3D_1_SecondTime + 1), "结果图")); @@ -355,43 +397,41 @@ public: } } //结果数据保存 - if (data->resultData.size() > 0){ - std::string sn = data->SNcode; - try { - _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); - // dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); - //dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); - // dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); - // dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); - // dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); - // dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); - // if (data->cameraKeyName == "2.5D-H-1") { - // emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - // emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - // } - // else{ - // emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); - // emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); - // emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); - // - // } + std::string sn = data->SNcode; + try { + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); +// dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); + //dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); +// dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); +// dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); +// dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); +// dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); + +// if (data->cameraKeyName == "2.5D-H-1") { +// emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); +// emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); +// } +// else{ +// emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); +// emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); +// emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); +// +// } - } - catch (...) { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); - } - } - else { - qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; } diff --git a/src/src.zip b/src/src.zip new file mode 100644 index 0000000..1c43069 Binary files /dev/null and b/src/src.zip differ diff --git a/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp b/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp index 5b64d23..d247ab0 100644 --- a/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp +++ b/subModule/Hd_VirualCamera/Hd_VirualCamera.cpp @@ -69,9 +69,9 @@ bool Hd_VirualCamera::run()// n_mutex->lock(); if (cameraName == "25D-1" || cameraName == "25D-2") { vector mats; - mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count0.bmp", -1)); - mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count1.bmp", -1)); - mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count2.bmp", -1)); + mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count0.bmp", -1)); + mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count1.bmp", -1)); + mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count2.bmp", -1)); queuePic.enqueue(mats); } n_mutex->unlock();