From 2d00ce0db11fed4c4de2561172bc273713c4a5ea Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Thu, 13 Nov 2025 01:31:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/service/detCallbackChain.hpp | 2 +- src/launcher/GUI/mainwindow.h | 2 +- .../581_YuHan_hanhou/581_YuHan_hanhou.h | 101 --- .../952/952_15_Q_2D3D/952_15_Q_2D3D.cpp | 8 + src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h | 355 ++++++++++ .../952_15_Q_2D3D/952_15_Q_2D3D.cpp | 8 + .../952_15_Q_2D3D/952_15_Q_2D3D.h | 491 ++++++++++++++ .../952_15_Q_2D3D/CMakeLists.txt | 77 +++ src/mission/952/952_15_Q_2D3D/CMakeLists.txt | 78 +++ src/mission/952/952_15_Q_2D3D/backend.json | 49 ++ .../952/952_15_Q_2D3D/externalData.json | 6 + src/mission/952/952_15_Q_2D3D/setting.json | 623 ++++++++++++++++++ src/mission/952/CMakeLists.txt | 11 + .../{ => DGH}/581-Dgh-CB-1/581-Dgh-CB-1.cpp | 0 .../{ => DGH}/581-Dgh-CB-1/581-Dgh-CB-1.h | 0 .../{ => DGH}/581-Dgh-CB-1/CMakeLists.txt | 0 .../{ => DGH}/581-Dgh-CB-2/581-Dgh-CB-2.cpp | 0 .../{ => DGH}/581-Dgh-CB-2/581-Dgh-CB-2.h | 0 .../{ => DGH}/581-Dgh-CB-2/CMakeLists.txt | 0 .../{ => DGH}/581-Dgh-DB-1/581-Dgh-DB-1.cpp | 0 .../{ => DGH}/581-Dgh-DB-1/581-Dgh-DB-1.h | 0 .../{ => DGH}/581-Dgh-DB-1/CMakeLists.txt | 0 .../{ => DGH}/581-Dgh-DB-2/581-Dgh-DB-2.cpp | 0 .../{ => DGH}/581-Dgh-DB-2/581-Dgh-DB-2.h | 0 .../{ => DGH}/581-Dgh-DB-2/CMakeLists.txt | 0 src/mission/DGH/CMakeLists.txt | 11 + .../581_YuHan_hanhou/581_YuHan_hanhou.cpp | 137 ++-- .../YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h | 156 +++++ .../581_YuHan_hanhou/CMakeLists.txt | 0 .../581_YuHan_hanqian/581_YuHan_hanqian.cpp | 0 .../581_YuHan_hanqian/581_YuHan_hanqian.h | 26 +- .../581_YuHan_hanqian/CMakeLists.txt | 0 src/mission/YuHan/CMakeLists.txt | 11 + .../581_ZhongHan_dibutiejiao.cpp | 0 .../581_ZhongHan_dibutiejiao.h | 0 .../581_ZhongHan_dibutiejiao/CMakeLists.txt | 0 .../581_ZhongHan_hanhou.cpp | 8 +- .../581_ZhongHan_hanhou/581_ZhongHan_hanhou.h | 0 .../581_ZhongHan_hanhou/CMakeLists.txt | 0 .../581_ZhongHan_hanqian.cpp | 0 .../581_ZhongHan_hanqian.h | 6 +- .../581_ZhongHan_hanqian/CMakeLists.txt | 0 .../581_ZhongHan_silie_jixing.cpp | 0 .../581_ZhongHan_silie_jixing.h | 0 .../581_ZhongHan_silie_jixing/CMakeLists.txt | 0 .../581_ZhongHan_tiejiao_dingbu.cpp | 0 .../581_ZhongHan_tiejiao_dingbu.h | 0 .../CMakeLists.txt | 0 src/mission/ZhongHan/CMakeLists.txt | 11 + .../Hd_VirtualCamera/Hd_VirtualCamera.cpp | 2 +- 50 files changed, 1993 insertions(+), 186 deletions(-) delete mode 100644 src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h create mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp create mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h create mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp create mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h create mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt create mode 100644 src/mission/952/952_15_Q_2D3D/CMakeLists.txt create mode 100644 src/mission/952/952_15_Q_2D3D/backend.json create mode 100644 src/mission/952/952_15_Q_2D3D/externalData.json create mode 100644 src/mission/952/952_15_Q_2D3D/setting.json create mode 100644 src/mission/952/CMakeLists.txt rename src/mission/{ => DGH}/581-Dgh-CB-1/581-Dgh-CB-1.cpp (100%) rename src/mission/{ => DGH}/581-Dgh-CB-1/581-Dgh-CB-1.h (100%) rename src/mission/{ => DGH}/581-Dgh-CB-1/CMakeLists.txt (100%) rename src/mission/{ => DGH}/581-Dgh-CB-2/581-Dgh-CB-2.cpp (100%) rename src/mission/{ => DGH}/581-Dgh-CB-2/581-Dgh-CB-2.h (100%) rename src/mission/{ => DGH}/581-Dgh-CB-2/CMakeLists.txt (100%) rename src/mission/{ => DGH}/581-Dgh-DB-1/581-Dgh-DB-1.cpp (100%) rename src/mission/{ => DGH}/581-Dgh-DB-1/581-Dgh-DB-1.h (100%) rename src/mission/{ => DGH}/581-Dgh-DB-1/CMakeLists.txt (100%) rename src/mission/{ => DGH}/581-Dgh-DB-2/581-Dgh-DB-2.cpp (100%) rename src/mission/{ => DGH}/581-Dgh-DB-2/581-Dgh-DB-2.h (100%) rename src/mission/{ => DGH}/581-Dgh-DB-2/CMakeLists.txt (100%) create mode 100644 src/mission/DGH/CMakeLists.txt rename src/mission/{ => YuHan}/581_YuHan_hanhou/581_YuHan_hanhou.cpp (65%) create mode 100644 src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h rename src/mission/{ => YuHan}/581_YuHan_hanhou/CMakeLists.txt (100%) rename src/mission/{ => YuHan}/581_YuHan_hanqian/581_YuHan_hanqian.cpp (100%) rename src/mission/{ => YuHan}/581_YuHan_hanqian/581_YuHan_hanqian.h (93%) rename src/mission/{ => YuHan}/581_YuHan_hanqian/CMakeLists.txt (100%) create mode 100644 src/mission/YuHan/CMakeLists.txt rename src/mission/{ => ZhongHan}/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_dibutiejiao/CMakeLists.txt (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp (97%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanhou/CMakeLists.txt (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h (98%) rename src/mission/{ => ZhongHan}/581_ZhongHan_hanqian/CMakeLists.txt (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_silie_jixing/CMakeLists.txt (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h (100%) rename src/mission/{ => ZhongHan}/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt (100%) create mode 100644 src/mission/ZhongHan/CMakeLists.txt diff --git a/src/core/service/detCallbackChain.hpp b/src/core/service/detCallbackChain.hpp index 4ec2889..12fc504 100644 --- a/src/core/service/detCallbackChain.hpp +++ b/src/core/service/detCallbackChain.hpp @@ -63,7 +63,7 @@ public: bool algoEvaluate(std::shared_ptr data, handleAiModelsTemplate* model, addressTemplate address = addressTemplate()) { std::chrono::steady_clock::time_point algoStartTime = std::chrono::steady_clock::now(); - bool result; + bool result = true; try { result = _processAlgoCallback(data, model, address); } diff --git a/src/launcher/GUI/mainwindow.h b/src/launcher/GUI/mainwindow.h index 45bce6f..6762246 100644 --- a/src/launcher/GUI/mainwindow.h +++ b/src/launcher/GUI/mainwindow.h @@ -89,7 +89,7 @@ public: factoryIconLabel->setFixedSize(topBarHeight, topBarHeight); leftLayout->addWidget(factoryIconLabel); - QString title(TR("AI Detection System")); + QString title(TR("AI Detection System") + " " + QString::fromStdString(config->softwareTile)); QLabel* titleLabel = new QLabel(title); titleLabel->setFont(font); titleLabel->setPalette(palette); diff --git a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h deleted file mode 100644 index 558aeb1..0000000 --- a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class yuHanHanHouParams { -public: - handdleAI::pSegmentation* segHanYinZhuaQu = nullptr; - handdleAI::pSegmentation* segYuHanDingWei = nullptr; - handdleAI::pSegmentation* segHanHou = nullptr; - handdleAI::pClassification* clsHanHou = nullptr; - bool isTong = true; -}; -struct halconResult { - bool result = true; - double jiErWidth = -1; - double jiErHeight = -1; - double hanYin1 = -1; -}; -void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint, - bool& silieResult, bool& fanZheResult, - cv::Point offset, handdleAI::pClassification* clsPtr, std::vector& clsImgs); -halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegmentation* seg_hanYinZhuaQu, cv::Mat& segResult); -bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address); -bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address); - -namespace hanhou45{ - -} -class _581_YuHan_hanhou : public mission { -public: - _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top90_1; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down90_2; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top90_3; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down90_4; - - _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top45_5; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down45_6; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top45_7; - _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down45_8; - std::vector < yuHanHanHouParams> tongDetParams = std::vector < yuHanHanHouParams>(4); - std::vector < yuHanHanHouParams> lvDetParams = std::vector < yuHanHanHouParams>(4); - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - - if (initOnce == false) { - for (auto& params : tongDetParams) { - params.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); - params.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanDingWei-T.BHD", 64, 0); - params.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-T.BHD", 64, 0); - params.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1); - } - - for (auto& params : lvDetParams) { - params.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); - params.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanDingWei-L.BHD", 64, 1); - params.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-L.BHD", 64, 1); - params.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1); - } - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 - if (_serviceManager->_paramSyncManager->get("hanhou","OUT") == "OUT") { - lv_top90_1.init("Camera1", "极耳尺寸-外-铝-相机1(顶部90°)", { { 522, 1,{540},"523","530",820} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); - lv_down90_2.init("Camera2", "极耳尺寸-外-铝-相机2(底部90°)", { { 524, 1,{540},"525","532",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); - tong_top90_3.init("Camera3", "极耳尺寸-外-铜-相机3(顶部90°)", { { 526,1,{540},"527","534",800} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); - tong_down90_4.init("Camera4", "极耳尺寸-外-铜-相机4(底部90°)", { { 528, 1,{540},"529","536",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); - - lv_top45_5.init("Camera5", "底部撕裂-外-铝-相机5(顶部45°)", { { 562,1,{540},"563","570",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); - lv_down45_6.init("Camera6", "底部撕裂-外-铝-相机6(底部45°)", { { 564, 1,{540},"565","572",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); - tong_top45_7.init("Camera7", "底部撕裂-外-铜-相机7(顶部45°)", { { 566, 1,{540},"567","574",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); - tong_down45_8.init("Camera8", "底部撕裂-外-铜-相机8(底部45°)", { { 568, 1,{540},"569","576",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); - } - else { - lv_top90_1.init("Camera1", "极耳尺寸-内-铝-相机1(顶部90°)", { { 602, 1,{580},"603","610",860} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); - lv_down90_2.init("Camera2", "极耳尺寸-内-铝-相机2(底部90°)", { { 604, 1,{580},"605","612",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); - tong_top90_3.init("Camera3", "极耳尺寸-内-铜-相机3(顶部90°)", { { 606,1,{580},"607","614",840} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); - tong_down90_4.init("Camera4", "极耳尺寸-内-铜-相机4(底部90°)", { { 608, 1,{580},"609","616",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); - - lv_top45_5.init("Camera5", "底部撕裂-内-铝-相机5(顶部45°)", { { 642,1,{580},"643","650",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); - lv_down45_6.init("Camera6", "底部撕裂-内-铝-相机6(底部45°)", { { 644, 1,{580},"645","652",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); - tong_top45_7.init("Camera7", "底部撕裂-内-铜-相机7(顶部45°)", { { 646, 1,{580},"647","654",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); - tong_down45_8.init("Camera8", "底部撕裂-内-铜-相机8(底部45°)", { { 648, 1,{580},"649","656",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); - } -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp new file mode 100644 index 0000000..3308a80 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp @@ -0,0 +1,8 @@ +#include <952_15_Q_2D3D.h> + +mission* createMission() { + return new _952_15_Q_2D3D(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h new file mode 100644 index 0000000..0d5ce2c --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h @@ -0,0 +1,355 @@ +#include +#include +#include +#include +#include +#include +#include + +struct _952_15_Q_2D3D_1_summaryData +{ + QString _2D_P_Result = "-1"; + QString _2D_N_Result = "-1"; + QString _3D_1_Result = "-1"; +}; +class _952_address { +public: + int triggerAddr = -1; + int triggerValue = -1; + std::vector snAddr; + QByteArray completeAddr; + QByteArray resultAddr = "-1"; + int valueOffsetAddr = -1; +}; + +class _2dP_detParams { +public: + handdleAI::pSegmentation* SEG_2D_HuaShang_P; + handdleAI::pSegmentation* SEG_2D_ZangWu_P; + handdleAI::pClassification* CLS_2D_HuaShang_P; + handdleAI::pClassification* CLS_2D_ZangWu_P; +}; +class _2dN_detParams { +public: +}; +class _3d_detParams { +public: + +}; +#pragma region 算法 + +#include +#include +#include +#include + +static bool _952_15_Q_2D_P_ALGO_HuaShangAI(std::shared_ptr data, QMutex* mutex, cv::Mat& img, _2dP_detParams* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) { + cv::Mat segImg = ~_handleAiModelManager->SEG_2D_HuaShang_P->Evaluate(img); + std::vector> contours; + cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + bool isNg = false; + + for (int i = 0; i < contours.size(); i++) { + cv::Rect rect = cv::boundingRect(contours[i]); + if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓 + auto clsImgs = cutImg2ClsVec(rect, img); + bool clsIsNg = false; + for (auto& clsImg : clsImgs) { + QMutexLocker locker(mutex); + data->clsOriginImgs.push_back(std::make_pair("划伤", clsImg)); + int clsResult = _handleAiModelManager->CLS_2D_HuaShang_P->Evaluate(clsImg); + if (clsResult == 1) { // 假设1表示NG + clsIsNg = true; + break; + } + } + cv::Scalar color = cv::Scalar(0, 255, 0); + if (clsIsNg == true) { + color = cv::Scalar(0, 0, 255); + isNg = true; + QMutexLocker locker(&paintMutex); + cv::drawContours(Paint, contours, i, color, 2); + } + else { + QMutexLocker locker(&paintMutex); + cv::rectangle(Paint, rect, color, 3); + } + putTextZH(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), 25, color); + } + return isNg; +} +static bool _952_15_Q_2D_P_ALGO_ZangWuAI(std::shared_ptr data, QMutex* mutex, cv::Mat& img, _2dP_detParams* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) { + cv::Mat segImg = ~_handleAiModelManager->SEG_2D_ZangWu_P->Evaluate(img); + std::vector> contours; + cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + bool isNg = false; + + for (int i = 0; i < contours.size(); i++) { + cv::Rect rect = cv::boundingRect(contours[i]); + if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓 + auto clsImgs = cutImg2ClsVec(rect, img); + bool clsIsNg = false; + for (auto& clsImg : clsImgs) { + { + QMutexLocker locker(mutex); + data->clsOriginImgs.push_back(std::make_pair("脏污", clsImg)); + } + int clsResult = _handleAiModelManager->CLS_2D_ZangWu_P->Evaluate(clsImg); + if (clsResult == 1) { // 假设1表示NG + clsIsNg = true; + break; + } + } + cv::Scalar color = cv::Scalar(0, 255, 0); + if (clsIsNg == true) { + color = cv::Scalar(0, 0, 255); + isNg = true; + QMutexLocker locker(&paintMutex); + cv::drawContours(Paint, contours, i, color, 2); + } + else { + QMutexLocker locker(&paintMutex); + cv::rectangle(Paint, rect, color, 3); + } + putTextZH(Paint, "脏污", cv::Point(rect.x + 10, rect.y - 20), 25, color); + + } + return isNg; +} + +static bool _952_15_Q_2D_P_ALGO(std::shared_ptr data, _2dP_detParams* _handleAiModelManager, _952_address address) { + //获取模型 + + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 3) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return false; + } + cv::Mat Paintx; + if (data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], Paintx, cv::COLOR_GRAY2BGR); + else + data->oriImgs[0].copyTo(Paintx); + TextRendererZH textPainter(Paintx.cols, Paintx.rows, 300); + textPainter.putText(Paintx, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paintx); + return true; + + cv::Mat Paint; + cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR); + QMutex paintMutex; + QMutex mutex; + std::future futureHuaShang = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_HuaShangAI, data, &mutex, data->oriImgs[1], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex)); + std::future futureZangWu = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_ZangWuAI, data, &mutex, data->oriImgs[2], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex)); + + bool huaShangResult = futureHuaShang.get(); + if (huaShangResult) { + putTextZH(Paint, "划伤检测结果: NG", cv::Point(100, 100), 150, cv::Scalar(0, 0, 255)); + } + else { + putTextZH(Paint, "划伤检测结果: OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + } + + bool zangWuResult = futureZangWu.get(); + if (zangWuResult) { + putTextZH(Paint, "脏污检测结果: NG", cv::Point(100, 200), 150, cv::Scalar(0, 0, 255)); + } + else { + putTextZH(Paint, "脏污检测结果: OK", cv::Point(100, 200), 150, cv::Scalar(0, 255, 0)); + } + data->resultImgs.push_back(Paint); + data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG + return true; +} +static bool _952_15_Q_2D_N_ALGO(std::shared_ptr data, _2dN_detParams* _handleAiModelManager, _952_address address) { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return false; + } + cv::Mat Paint; + if (data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR); + else + data->oriImgs[0].copyTo(Paint); + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return true; +} +static bool _952_15_Q_3D_ALGO(std::shared_ptr data, _3d_detParams* _handleAiModelManager, _952_address address) { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 2) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return false; + } + cv::Mat Paint; + if (data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR); + else + data->oriImgs[0].copyTo(Paint); + putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return true; +} +#pragma endregion + +class _952_15_Q_2D3D : public mission { +public: + _2dP_detParams __2dP_detParams; + _2dN_detParams __2dN_detParams; + _3d_detParams __3d_detParams; + detCallbackChain<_2dP_detParams, _952_address >* algo_2D_P; + detCallbackChain<_2dN_detParams, _952_address >* algo_2D_N; + detCallbackChain<_3d_detParams, _952_address >* algo_3D; + summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData; + //8010 1 + bool Qian_2D_P_SecondTime = false; + void Qian_2D_P(QByteArray& byteArray) { + int snPos = _2dP_address.snAddr[0]; + _serviceManager->_triggerManager->writeShort(_2dP_address.triggerAddr + "_0");//清0 + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _serviceManager->_detDataManager->createDetData("Qian_2D_P", sn, 3, _2DCamera_P->config.oriSaveFormat); + _2DCamera_P->captureImage(data); + algo_2D_P->ansyncProcess(data, _2dP_address, ("D" + _2dP_address.completeAddr + "_1,1")); //处理算法 + data->resultImgShowSet.push_back(showImgPack("通道1-2D正极" + QString::number(Qian_2D_P_SecondTime + 1), "结果图")); + Qian_2D_P_SecondTime = !Qian_2D_P_SecondTime; + } + //8020 1 + bool Qian_2D_N_SecondTime = false; + void Qian_2D_N(QByteArray& byteArray) { + int snPos = _2dN_address.snAddr[0]; + _serviceManager->_triggerManager->writeShort(_2dN_address.triggerAddr + "_0");//清0 + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _serviceManager->_detDataManager->createDetData( + "Qian_2D_N", sn, 1, _2DCamera_N->config.oriSaveFormat); + _2DCamera_N->captureImage(data); + algo_2D_N->ansyncProcess(data, _2dN_address, ("D" + _2dN_address.completeAddr + "_1,1")); //处理算法 + data->resultImgShowSet.push_back(showImgPack("通道1-2D负极" + QString::number(Qian_2D_N_SecondTime + 1), "结果图")); + Qian_2D_N_SecondTime = !Qian_2D_N_SecondTime; + } + + //8030 1 + bool Qian_3D_1_SecondTime = false; + void Qian_3D_1(QByteArray& byteArray) { + int snPos = _3d_address.snAddr[0]; + _serviceManager->_triggerManager->writeShort(_3d_address.triggerAddr + "_0");//清0 + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _serviceManager->_detDataManager->createDetData( + "Qian_3D", sn, 2, _3DCamera_1->config.oriSaveFormat); + _3DCamera_1->captureImage(data); + algo_3D->ansyncProcess(data, _3d_address, ("D" + _3d_address.completeAddr + "_1,1")); //处理算法 + data->resultImgShowSet.push_back(showImgPack("通道1-3D" + QString::number(Qian_3D_1_SecondTime + 1), "结果图")); + Qian_3D_1_SecondTime = !Qian_3D_1_SecondTime; + + } + + //8040 1 Summary1 + void sumRequest1(int triggerPos ,QByteArray& byteArray) { + if (triggerPos == 8090) { + _serviceManager->_triggerManager->writeShort({ "D8040_0" ,"D8042_1","D8045_1","D8046_1","D8047_1","D8048_1" }); + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, 8500, false, false, -1); + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + _serviceManager->_triggerManager->writeShort({ + "D6020_1", "D6021_1", "D6022_1", "D6023_1", "D6024_1", + "D6025_1", "D6026_1", "D6027_1", "D6028_1", "D6029_1", + "D6030_1", "D6031_1", "D6032_1", "D6033_1", "D6034_1", + "D6035_1", "D6036_1", "D6037_1", "D6038_1", "D6039_1" + }); + _summaryData.remove(sn); + } + else{ + _serviceManager->_triggerManager->writeShort({ "D8090_0" ,"D8092_1","D8095_1","D8096_1","D8097_1","D8098_1" }); + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, 9000, false, false, -1); + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + _serviceManager->_triggerManager->writeShort({ + "D6120_1", "D6121_1", "D6122_1", "D6123_1", "D6124_1", + "D6125_1", "D6126_1", "D6127_1", "D6128_1", "D6129_1", + "D6130_1", "D6131_1", "D6132_1", "D6133_1", "D6134_1", + "D6135_1", "D6136_1", "D6137_1", "D6138_1", "D6139_1" + }); + _summaryData.remove(sn); + } + } + + bool initOnce = false; + void onConfigReloaded() { + if (initOnce == false) { + /*__2dP_detParams.SEG_2D_ZangWu_P = handdleAI::CreateSegObj("./handleaiModels/seg_zangWu_P_0708.BHD", 1, 0); + __2dP_detParams.SEG_2D_HuaShang_P = handdleAI::CreateSegObj("./handleaiModels/seg_huaShang_P_0708.BHD", 1, 0); + __2dP_detParams.CLS_2D_ZangWu_P = handdleAI::CreateClsObjV3("./handleaiModels/cls_zangWu_P_0708.BHD", 0, 1); + __2dP_detParams.CLS_2D_HuaShang_P = handdleAI::CreateClsObjV3("./handleaiModels/cls_huaShang_P_0708.BHD", 0, 1);*/ + initOnce = true; + } + } + + bool initCustom() { +#pragma region 注册触发器回调 + if (_serviceManager->_paramSyncManager->get("way", "IN").toString() == "IN") { + _2dP_address = { 8010 ,1,{8200} ,"8011" ,"-1", - 1}; + _2dN_address = { 8020 ,1,{8300} ,"8021" ,"-1", -1 }; + _3d_address = { 8030 ,1,{8400} ,"8031" ,"-1", -1 }; + summary_triggerPos = 8040; + } + else { + _2dP_address = { 8060 ,1,{8700} ,"8061" ,"-1", -1 }; + _2dN_address = { 8070 ,1,{8800} ,"8071" ,"-1", -1 }; + _3d_address = { 8080 ,1,{8900} ,"8081" ,"-1", -1 }; + summary_triggerPos = 8090; + } + _serviceManager->_triggerManager->registerCallback(_2dP_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_2D_P(byteArray); }, "2D_1拍照触发"); + _serviceManager->_triggerManager->registerCallback(_2dN_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发"); + _serviceManager->_triggerManager->registerCallback(_3d_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发"); + + _serviceManager->_triggerManager->registerCallback(summary_triggerPos, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {sumRequest1(triggerPos,byteArray); }, "结果获取触发"); +#pragma endregion +#pragma region 处理算法回调链 + algo_2D_P = new detCallbackChain<_2dP_detParams, _952_address>(_serviceManager, &__2dP_detParams, bridge); + algo_2D_P->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO); + + algo_2D_N = new detCallbackChain<_2dN_detParams, _952_address>(_serviceManager, &__2dN_detParams, bridge); + algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO); + + algo_3D = new detCallbackChain<_3d_detParams, _952_address>(_serviceManager, &__3d_detParams, bridge); + algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO); +#pragma endregion + _2DCamera_P = _serviceManager->_cameraManager->getCamera("Camera1");//获取相机 + _2DCamera_N = _serviceManager->_cameraManager->getCamera("Camera2");//获取相机 + _3DCamera_1 = _serviceManager->_cameraManager->getCamera("Camera3");//获取相机 + _serviceManager->_triggerManager->registerPlcValueViewer("通道1-2D正极", + { {"触发",_2dP_address.triggerAddr }, + {"反馈1", _2dP_address.completeAddr.toInt()}, + {"反馈2",_2dP_address.completeAddr.toInt()+1}}); + _serviceManager->_triggerManager->registerPlcValueViewer("通道1-2D负极", + { {"触发",_2dN_address.triggerAddr }, + {"反馈1", _2dN_address.completeAddr.toInt()}, + {"反馈2",_2dN_address.completeAddr.toInt() + 1} }); + _serviceManager->_triggerManager->registerPlcValueViewer("通道1-3D", + { {"触发",_3d_address.triggerAddr }, + {"反馈1", _3d_address.completeAddr.toInt()}, + {"反馈2",_3d_address.completeAddr.toInt() + 1} }); + return true; + } +private: + int summary_triggerPos = 8040; + _952_address _2dP_address, _2dN_address, _3d_address; + camera* _2DCamera_P = nullptr, * _2DCamera_N = nullptr, * _3DCamera_1 = nullptr; +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp new file mode 100644 index 0000000..3d4b053 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp @@ -0,0 +1,8 @@ +#include <952_15_Q_2D3D.h> + +mission* createMission() { + return new _952_15_Q_2D3D_1(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h new file mode 100644 index 0000000..70c8441 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h @@ -0,0 +1,491 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +struct _952_15_Q_2D3D_1_summaryData +{ + QString _2D_P_Result = "-1"; + QString _2D_N_Result = "-1"; + QString _3D_1_Result = "-1"; +}; +class handleAIModels { +public: + handleAiModelSeg* SEG_2D_HuaShang_P; + handleAiModelSeg* SEG_2D_ZangWu_P; + handleAiModelCls* CLS_2D_HuaShang_P; + handleAiModelCls* CLS_2D_ZangWu_P; +}; +#pragma region 算法 + +#include +#include +#include +#include + +static bool _952_15_Q_2D_P_ALGO_HuaShangAI(cv::Mat& img, handleAIModels* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) { + cv::Mat segImg = ~_handleAiModelManager->SEG_2D_HuaShang_P->Evaluate(img); + std::vector> contours; + cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + bool isNg = false; + + for (int i = 0; i < contours.size(); i++) { + cv::Rect rect = cv::boundingRect(contours[i]); + if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓 + auto clsImgs = cutImg2ClsVec(rect, img); + bool clsIsNg = false; + for (auto& clsImg : clsImgs) { + int clsResult = _handleAiModelManager->CLS_2D_HuaShang_P->Evaluate(clsImg); + if (clsResult == 1) { // 假设1表示NG + clsIsNg = true; + break; + } + } + cv::Scalar color = cv::Scalar(0, 255, 0); + if (clsIsNg == true) { + color = cv::Scalar(0, 0, 255); + isNg = true; + QMutexLocker locker(&paintMutex); + cv::drawContours(Paint, contours, i, color, 2); + } + else { + QMutexLocker locker(&paintMutex); + cv::rectangle(Paint, rect, color, 3); + } + putTextZH(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), 25, color); + } + return isNg; +} +static bool _952_15_Q_2D_P_ALGO_ZangWuAI(cv::Mat& img, handleAIModels* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) { + cv::Mat segImg = ~_handleAiModelManager->SEG_2D_ZangWu_P->Evaluate(img); + std::vector> contours; + cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + bool isNg = false; + + for (int i = 0; i < contours.size(); i++) { + cv::Rect rect = cv::boundingRect(contours[i]); + if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓 + auto clsImgs = cutImg2ClsVec(rect, img); + bool clsIsNg = false; + for (auto& clsImg : clsImgs) { + int clsResult = _handleAiModelManager->CLS_2D_ZangWu_P->Evaluate(clsImg); + if (clsResult == 1) { // 假设1表示NG + clsIsNg = true; + break; + } + } + cv::Scalar color = cv::Scalar(0, 255, 0); + if (clsIsNg == true) { + color = cv::Scalar(0, 0, 255); + isNg = true; + QMutexLocker locker(&paintMutex); + cv::drawContours(Paint, contours, i, color, 2); + } + else { + QMutexLocker locker(&paintMutex); + cv::rectangle(Paint, rect, color, 3); + } + putTextZH(Paint, "脏污", cv::Point(rect.x + 10, rect.y - 20), 25, color); + + } + return isNg; +} + +static bool _952_15_Q_2D_P_ALGO(std::shared_ptr data, handleAIModels* _handleAiModelManager) { + //获取模型 + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 3) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return false; + } + + cv::Mat Paint; + cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR); + data->resultImgs.push_back(Paint); + return true; + + QMutex paintMutex; + std::future futureHuaShang = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_HuaShangAI, data->oriImgs[1], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex)); + std::future futureZangWu = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_ZangWuAI, data->oriImgs[2], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex)); + + bool huaShangResult = futureHuaShang.get(); + if (huaShangResult) { + putTextZH(Paint, "划伤检测结果: NG", cv::Point(100, 100), 150, cv::Scalar(0, 0, 255)); + } + else { + putTextZH(Paint, "划伤检测结果: OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + } + + bool zangWuResult = futureZangWu.get(); + if (zangWuResult) { + putTextZH(Paint, "脏污检测结果: NG", cv::Point(100, 200), 150, cv::Scalar(0, 0, 255)); + } + else { + putTextZH(Paint, "脏污检测结果: OK", cv::Point(100, 200), 150, cv::Scalar(0, 255, 0)); + } + data->resultImgs.push_back(Paint); + data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG + return true; +} +static bool _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 false; + } + cv::Mat Paint; + cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR); + putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return true; +} +static bool _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 false; + } + cv::Mat Paint; + if (data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR); + else + data->oriImgs[0].copyTo(Paint); + putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + data->resultImgs.push_back(Paint); + return true; +} +#pragma endregion + +class _952_15_Q_2D3D_1 : public mission { +public: +#pragma region 由外部输入的参数 + std::string _2D_P_Camera_Name; + std::string _2D_N_Camera_Name; + std::string _3D_1_Camera_Name; + + int _2D_P_triggerPos; + std::vector _2D_P_triggerReply; + int _2D_P_snPos; + QString _2D_P_viewName; + + int _2D_N_triggerPos; + std::vector _2D_N_triggerReply; + int _2D_N_snPos; + QString _2D_N_viewName; + + int _3D_triggerPos; + std::vector _3D_triggerReply; + int _3D_snPos; + QString _3D_P_viewName; + + int summary_triggerPos; +#pragma endregion + handleAIModels _handleAIModels; + 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, + SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { + bridge = bridgeIn; + _serviceManager = _serviceManagerIN; + prasingJson(_missionJson); +#pragma region 相机获取 + _2DCamera_P = _serviceManager->_cameraManager->getCamera(_2D_P_Camera_Name); + if (_2DCamera_P == nullptr) { + std::cout << "camera ->> " << _2D_P_Camera_Name << " not found" << std::endl; + return false; + } + + _2DCamera_N = _serviceManager->_cameraManager->getCamera(_2D_N_Camera_Name); + if (_2DCamera_N == nullptr) { + std::cout << "camera ->> " << _2D_N_Camera_Name << " not found" << std::endl; + return false; + } + + _3DCamera_1 = _serviceManager->_cameraManager->getCamera(_3D_1_Camera_Name); + if (_3DCamera_1 == nullptr) { + std::cout << "camera ->> " << _3D_1_Camera_Name << " not found" << std::endl; + return false; + } +#pragma endregion +#pragma region 注册触发器回调 + + _serviceManager->_triggerManager->registerCallback(_2D_P_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_P(byteArray); }, "2D_1拍照触发"); + _serviceManager->_triggerManager->registerCallback(_2D_N_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发"); + _serviceManager->_triggerManager->registerCallback(_3D_triggerPos, 1, [this](QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发"); + + _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->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO); + algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr data) { + Qian_2D_P_ResultHandle(data); + })); + + algo_2D_N = std::make_shared>(_serviceManager->_imgSaveThreadManager, &_handleAIModels); + algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO); + algo_2D_N->registerResultHandleCallback(([this](std::shared_ptr data) { + Qian_2D_P_ResultHandle(data); + })); + + algo_3D = std::make_shared>(_serviceManager->_imgSaveThreadManager, &_handleAIModels); + algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO); + algo_3D->registerResultHandleCallback(([this](std::shared_ptr data) { + Qian_2D_P_ResultHandle(data); + })); +#pragma endregion + + _handleAIModels.SEG_2D_HuaShang_P = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_2D_HuaShang_P"); + _handleAIModels.SEG_2D_ZangWu_P = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_2D_ZangWu_P"); + _handleAIModels.CLS_2D_HuaShang_P = _serviceManagerIN->_handleAiModelManager->getClsModel("CLS_2D_HuaShang_P"); + _handleAIModels.CLS_2D_ZangWu_P = _serviceManagerIN->_handleAiModelManager->getClsModel("CLS_2D_ZangWu_P"); + //HDevEngineCpp::HDevEngine myEngine; + //myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl"); + return true; + } + void prasingJson(nlohmann::json& _missionJson) { + try { + _2D_P_Camera_Name = _missionJson["_2D_P_Camera_Name"].get(); + _2D_N_Camera_Name = _missionJson["_2D_N_Camera_Name"].get(); + _3D_1_Camera_Name = _missionJson["_3D_1_Camera_Name"].get(); + _2D_P_triggerPos = _missionJson["_2D_P_triggerPos"].get(); + _2D_P_triggerReply = _missionJson["_2D_P_triggerReply"].get>(); + _2D_P_snPos = _missionJson["_2D_P_snPos"].get(); + _2D_P_viewName = QString::fromStdString(_missionJson["_2D_P_viewName"].get()); + _2D_N_triggerPos = _missionJson["_2D_N_triggerPos"].get(); + _2D_N_triggerReply = _missionJson["_2D_N_triggerReply"].get>(); + _2D_N_snPos = _missionJson["_2D_N_snPos"].get(); + _2D_N_viewName = QString::fromStdString(_missionJson["_2D_N_viewName"].get()); + _3D_triggerPos = _missionJson["_3D_triggerPos"].get(); + _3D_triggerReply = _missionJson["_3D_triggerReply"].get>(); + _3D_snPos = _missionJson["_3D_snPos"].get(); + _3D_P_viewName = QString::fromStdString(_missionJson["_3D_P_viewName"].get()); + summary_triggerPos = _missionJson["summary_triggerPos"].get(); + } + catch (const nlohmann::json::out_of_range& e) { + std::cerr << "JSON out-of-range error: " << e.what() << std::endl; + } + catch (const nlohmann::json::type_error& e) { + std::cerr << "JSON type error: " << e.what() << std::endl; + } + catch (const nlohmann::json::exception& e) { + std::cerr << "JSON general exception: " << e.what() << std::endl; + } + + + } + //8010 1 + bool Qian_2D_P_SecondTime = false; + void Qian_2D_P(QByteArray& byteArray) { + int snPos = _2D_P_snPos; + _serviceManager->_triggerManager->writeShort(_2D_P_triggerReply); + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _serviceManager->_detDataManager->createDetData("Qian_2D_P", sn, 3, _2DCamera_P->config.oriSaveFormat); + _2DCamera_P->captureImage(data); + algo_2D_P->ansyncProcess(data); //处理算法 + /*data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-93_Count0.bmp", -1)); + data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-94_Count1.bmp", -1)); + data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-94_Count2.bmp", -1));*/ + + 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_P_viewName + QString::number(Qian_2D_P_SecondTime + 1), "结果图")); + Qian_2D_P_SecondTime = !Qian_2D_P_SecondTime; + } + void Qian_2D_P_ResultHandle(std::shared_ptr data) { + //发送图片 + if (data->resultImgs.size() > 0) { + for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++) { + showImgPack* pack = data->resultImgShowSet[min(i, (int)data->resultImgShowSet.size() - 1)]; + QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]); + pack->img = pixmap; + emit bridge->displayWidget_sendImg(pack); + pixmap = QPixmap(); + } + } + //结果数据保存 + 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()); + // + // } + + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + } + else { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; + } + //8020 1 + bool Qian_2D_N_SecondTime = false; + void Qian_2D_N(QByteArray& byteArray) { + int snPos = _2D_N_snPos; + _serviceManager->_triggerManager->writeShort(_2D_N_triggerReply); + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _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), "结果图")); + Qian_2D_N_SecondTime = !Qian_2D_N_SecondTime; + } + + //8030 1 + bool Qian_3D_1_SecondTime = false; + void Qian_3D_1(QByteArray& byteArray) { + int snPos = _3D_snPos; + _serviceManager->_triggerManager->writeShort(_3D_triggerReply); + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _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), "结果图")); + Qian_3D_1_SecondTime = !Qian_3D_1_SecondTime; + + } + + void HouDuan12ResultHandle(std::shared_ptr data) { + //发送图片 + if (data->resultImgs.size() > 0) { + for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++) { + showImgPack* pack = data->resultImgShowSet[min(i, (int)data->resultImgShowSet.size() - 1)]; + QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]); + pack->img = pixmap; + emit bridge->displayWidget_sendImg(pack); + pixmap = QPixmap(); + } + } + //结果数据保存 + 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()); + // + // } + + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + } + else { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; + } + + //8040 1 Summary1 + void sumRequest1(QByteArray& byteArray) { + _serviceManager->_triggerManager->writeShort({ "D8040_0" ,"D9402_1","D9404_1" }); + int snPos = summary_triggerPos; + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + _serviceManager->_triggerManager->writeShort({ + "D6020_1", "D6021_1", "D6022_1", "D6023_1", "D6024_1", + "D6025_1", "D6026_1", "D6027_1", "D6028_1", "D6029_1", + "D6030_1", "D6031_1", "D6032_1", "D6033_1", "D6034_1", + "D6035_1", "D6036_1", "D6037_1", "D6038_1", "D6039_1" + }); + + _serviceManager->_triggerManager->sendFinsMsg("write_float_D8046_" + dataPtr->_2D_P_Result);//右上留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D8047_" + dataPtr->_2D_N_Result);//右下留白 + _serviceManager->_triggerManager->sendFinsMsg("write_float_D8048_" + dataPtr->_3D_1_Result);//右对其度 + + std::cout << "通道1 SN:" << sn << " 发送结果" << std::endl;//:\n左留白->" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString()< data, handleAiModelManager* _handleAiModelManager) { + cv::Mat testImg; + if (data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], testImg, cv::COLOR_GRAY2BGR); + cv::putText(testImg, "result test", cv::Point(200, 200), + 1, 10, cv::Scalar(0, 255, 0), 4); + data->resultImgs.push_back(testImg); + return false; + } + +private: + + camera* _2DCamera_P = nullptr, * _2DCamera_N = nullptr, * _3DCamera_1 = nullptr; + qtFuncBridge* bridge; + ServiceManager* _serviceManager = nullptr; +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt new file mode 100644 index 0000000..76bbff3 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/back + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/qtBridge.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/952/952_15_Q_2D3D/CMakeLists.txt b/src/mission/952/952_15_Q_2D3D/CMakeLists.txt new file mode 100644 index 0000000..29a2ad1 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/CMakeLists.txt @@ -0,0 +1,78 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/service + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Sql REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/interface.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Sql + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/952/952_15_Q_2D3D/backend.json b/src/mission/952/952_15_Q_2D3D/backend.json new file mode 100644 index 0000000..3a3b330 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/backend.json @@ -0,0 +1,49 @@ +{ + "missionDllPath": "952_15_Q_2D3D_1", + "imgSavePath": "D://CCD", + "Triggers": { + "key": "finstcp", + "initStr": "init_192.168.1.50_9600_128_6_0", + "sleepTime": 20, + "readNum": 400, + "writeType": "ushort", + "heartBeatCmd": "writeHeart_short_D9204_1", + "readAllCmd": "read_byte_D8000_800", + "moduleName": "Hd_SocketModule_FinsTcp" + }, + "CameraSetting": [ + { + "key": "2D-P-1 (24488341)", + "connectionName": "2D-P-1 (24488341)", + "serialNum": "", + "triggerMode": "software_trigger", + "moduleName": "Hd_CameraModule_Basler_hard", + "imageShow": [ + "通道1-2D正极#曝光1", + "通道1-2D正极#曝光2", + "通道1-2D正极#曝光3" + ] + }, + { + "key": "2D-N-1 (24488402)", + "connectionName": "2D-N-1 (24488402)", + "serialNum": "", + "triggerMode": "software_trigger", + "moduleName": "Hd_CameraModule_Basler_hard-2", + "imageShow": [ + "通道1-2D负极#曝光1" + ] + }, + { + "key": "162762", + "connectionName": "162762", + "serialNum": "", + "triggerMode": "software_trigger", + "moduleName": "Hd_3DCameraLMI_module_PointCloud", + "imageShow": [ + "通道1-3D#高度图", + "通道1-3D#亮度图" + ] + } + ] +} \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/externalData.json b/src/mission/952/952_15_Q_2D3D/externalData.json new file mode 100644 index 0000000..be4130e --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/externalData.json @@ -0,0 +1,6 @@ +{ + "952BiaoDing_3d_threshold": 0.5, + "952BiaoDing_in_InnerOffset": 3.0, + "952BiaoDing_in_OutOffset": 23.0, + "952BiaoDing_mode": 0 +} \ No newline at end of file diff --git a/src/mission/952/952_15_Q_2D3D/setting.json b/src/mission/952/952_15_Q_2D3D/setting.json new file mode 100644 index 0000000..8136a14 --- /dev/null +++ b/src/mission/952/952_15_Q_2D3D/setting.json @@ -0,0 +1,623 @@ +{ + "952-15-2D3D-1": { + "ImageView": { + "通道1-2D正极1": { + "viewer": [ + "结果图", + "曝光1", + "曝光2", + "曝光3" + ], + "xPos": 0, + "yPos": 0 + }, + "通道1-2D正极2": { + "viewer": [ + "结果图", + "曝光1", + "曝光2", + "曝光3" + ], + "xPos": 0, + "yPos": 1 + }, + "通道1-2D负极1": { + "viewer": [ + "结果图", + "曝光1" + ], + "xPos": 1, + "yPos": 0 + }, + "通道1-2D负极2": { + "viewer": [ + "结果图", + "曝光1" + ], + "xPos": 1, + "yPos": 1 + }, + "通道1-3D1": { + "viewer": [ + "结果图", + "高度图", + "亮度图" + ], + "xPos": 2, + "yPos": 0 + }, + "通道1-3D2": { + "viewer": [ + "结果图", + "高度图", + "亮度图" + ], + "xPos": 2, + "yPos": 1 + } + }, + "backend": { + "CameraSetting": [ + { + "connectionName": "2D-P-1 (24488341)", + "dllPath": "Hd_CameraModule_Basler_hard", + "imageShow": [ + "通道1-2D正极1#曝光1", + "通道1-2D正极1#曝光2", + "通道1-2D正极1#曝光3", + "通道1-2D正极2#曝光1", + "通道1-2D正极2#曝光2", + "通道1-2D正极2#曝光3" + ], + "key": "2D-P-1 (24488341)", + "oriSaveFormat": [] + }, + { + "connectionName": "2D-N-1 (24488402)", + "dllPath": "Hd_CameraModule_Basler_hard", + "imageShow": [ + "通道1-2D负极1#曝光1", + "通道1-2D负极2#曝光1" + ], + "key": "2D-N-1 (24488402)", + "oriSaveFormat": [] + }, + { + "connectionName": "162762", + "dllPath": "Hd_3DCameraLMI_module_PointCloud", + "imageShow": [ + "通道1-3D1#高度图", + "通道1-3D1#亮度图", + "通道1-3D2#高度图", + "通道1-3D2#亮度图" + ], + "key": "162762", + "oriSaveFormat": [ + "tiff", + "bmp" + ] + } + ], + "Triggers": { + "heartBeatCmd": "writeHeart_short_D8014_1", + "initStr": "init_192.168.1.50_9600_128_6_0", + "moduleName": "Hd_SocketModule_FinsTcp", + "readAllCmd": "read_byte_D8000_800", + "readNum": 400 + }, + "handleAi": { + "modelPath": "./HandleAiModels" + }, + "handleAiModel": { + "cls": { + "CLS_2D_HuaShang_P": { + "gpuIndex": 0, + "modelPath": "./handleaiModels/cls_huaShang_P_0708.BHD" + }, + "CLS_2D_ZangWu_P": { + "gpuIndex": 0, + "modelPath": "./handleaiModels/cls_zangWu_P_0708.BHD" + } + }, + "det": {}, + "seg": { + "SEG_2D_HuaShang_P": { + "gpuIndex": 1, + "modelPath": "./handleaiModels/seg_huaShang_P_0708.BHD" + }, + "SEG_2D_ZangWu_P": { + "gpuIndex": 1, + "modelPath": "./handleaiModels/seg_zangWu_P_0708.BHD" + } + } + }, + "imgSaveBasePath": "D://CCD", + "missionDllPath": "952_15_Q_2D3D", + "missionSettings": { + "_2D_N_Camera_Name": "2D-N-1 (24488402)", + "_2D_N_snPos": 8300, + "_2D_N_triggerPos": 8020, + "_2D_N_triggerReply": [ + "D8020_0", + "D8021_1", + "D8022_1" + ], + "_2D_N_viewName": "通道1-2D负极", + "_2D_P_Camera_Name": "2D-P-1 (24488341)", + "_2D_P_snPos": 8200, + "_2D_P_triggerPos": 8010, + "_2D_P_triggerReply": [ + "D8010_0", + "D8011_1", + "D8012_1" + ], + "_2D_P_viewName": "通道1-2D正极", + "_3D_1_Camera_Name": "162762", + "_3D_P_viewName": "通道1-3D", + "_3D_snPos": 8400, + "_3D_triggerPos": 8030, + "_3D_triggerReply": [ + "D8030_0", + "D8031_1", + "D8032_1" + ], + "summary_triggerPos": 8040 + } + }, + "softwareTile": "952-15前段端面1", + "sublUiSetting": {} + }, + "952-15-2D3D-2": { + "ImageView": { + "通道2-2D正极1": { + "viewer": [ + "结果图", + "曝光1", + "曝光2", + "曝光3" + ], + "xPos": 0, + "yPos": 0 + }, + "通道2-2D正极2": { + "viewer": [ + "结果图", + "曝光1", + "曝光2", + "曝光3" + ], + "xPos": 0, + "yPos": 1 + }, + "通道2-2D负极1": { + "viewer": [ + "结果图", + "曝光1" + ], + "xPos": 1, + "yPos": 0 + }, + "通道2-2D负极2": { + "viewer": [ + "结果图", + "曝光1" + ], + "xPos": 1, + "yPos": 1 + }, + "通道2-3D1": { + "viewer": [ + "结果图", + "高度图", + "亮度图" + ], + "xPos": 2, + "yPos": 0 + }, + "通道2-3D2": { + "viewer": [ + "结果图", + "高度图", + "亮度图" + ], + "xPos": 2, + "yPos": 1 + } + }, + "backend": { + "CameraSetting": [ + { + "connectionName": "2D-P-2 (24488342)", + "dllPath": "Hd_VirualCamera", + "imageShow": [ + "通道2-2D正极1#曝光1", + "通道2-2D正极1#曝光2", + "通道2-2D正极1#曝光3", + "通道2-2D正极2#曝光1", + "通道2-2D正极2#曝光2", + "通道2-2D正极2#曝光3" + ], + "key": "2D-P-2 (24488342)", + "oriSaveFormat": [] + }, + { + "connectionName": "2D-N-2 (24488458)", + "dllPath": "Hd_VirualCamera", + "imageShow": [ + "通道2-2D负极1#曝光1", + "通道2-2D负极2#曝光1" + ], + "key": "2D-N-2 (24488458)", + "oriSaveFormat": [] + }, + { + "connectionName": "156112", + "dllPath": "Hd_VirualCamera", + "imageShow": [ + "通道2-3D1#高度图", + "通道2-3D1#亮度图", + "通道2-3D2#高度图", + "通道2-3D2#亮度图" + ], + "key": "156112", + "oriSaveFormat": [ + "tiff", + "bmp" + ] + } + ], + "Triggers": { + "heartBeatCmd": "writeHeart_short_D9204_1", + "initStr": "init_127.0.0.1_9600_128_6_0", + "moduleName": "Hd_SocketModule_FinsTcp", + "readAllCmd": "read_byte_D8000_800", + "readNum": 400 + }, + "handleAi": { + "modelPath": "./HandleAiModels" + }, + "imgSaveBasePath": "D://CCD", + "missionDllPath": "952_15_Q_2D3D", + "missionSettings": { + "_2D_N_Camera_Name": "2D-N-2 (24488458)", + "_2D_N_snPos": 8800, + "_2D_N_triggerPos": 8070, + "_2D_N_triggerReply": [ + "D8070_0", + "D8071_1", + "D8072_1" + ], + "_2D_N_viewName": "通道2-2D负极", + "_2D_P_Camera_Name": "2D-P-2 (24488342)", + "_2D_P_snPos": 8700, + "_2D_P_triggerPos": 8060, + "_2D_P_triggerReply": [ + "D8060_0", + "D8061_1", + "D8062_1" + ], + "_2D_P_viewName": "通道2-2D正极", + "_3D_1_Camera_Name": "156112", + "_3D_P_viewName": "通道2-3D", + "_3D_snPos": 8900, + "_3D_triggerPos": 8080, + "_3D_triggerReply": [ + "D8080_0", + "D8081_1", + "D8082_1" + ], + "summary_triggerPos": 8090 + } + }, + "softwareTile": "952-15前段端面2", + "sublUiSetting": {} + }, + "952-15-H": { + "ImageView": { + "后段1-1": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 0, + "yPos": 0 + }, + "后段1-2": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 0, + "yPos": 1 + }, + "后段2-1": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 1, + "yPos": 0 + }, + "后段2-2": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 1, + "yPos": 1 + } + }, + "backend": { + "CameraSetting": [ + { + "connectionName": "25D-1", + "dllPath": "Hd_25DCameraVJ_module-ch1", + "imageShow": [ + "后段1-1#正反射图像", + "后段1-1#形状图像1", + "后段1-1#标准图像", + "后段1-2#正反射图像", + "后段1-2#形状图像1", + "后段1-2#标准图像" + ], + "key": "25D-1", + "oriSaveFormat": [] + }, + { + "connectionName": "25D-2", + "dllPath": "Hd_25DCameraVJ_module-ch2", + "imageShow": [ + "后段2-1#正反射图像", + "后段2-1#形状图像1", + "后段2-1#标准图像", + "后段2-2#正反射图像", + "后段2-2#形状图像1", + "后段2-2#标准图像" + ], + "key": "25D-2", + "oriSaveFormat": [] + } + ], + "Triggers": { + "heartBeatCmd": "writeHeart_short_D9204_1", + "initStr": "init_192.168.1.51_9600_128_6_0", + "key": "finstcp", + "moduleName": "Hd_SocketModule_FinsTcp", + "readAllCmd": "read_byte_D9200_800", + "readNum": 400, + "sleepTime": 20, + "writeType": "ushort" + }, + "imgSaveBasePath": "D://CCD", + "missionDllPath": "952_15_H_25D.dll" + }, + "missionSettings": {}, + "softwareTile": "952-15后段", + "sublUiSetting": [ + { + "height": 0, + "key": "后段1-左上留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 0, + "y": 0 + }, + { + "height": 0, + "key": "后段1-右上留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 1, + "y": 0 + }, + { + "height": 0, + "key": "后段1-左下留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 0, + "y": 1 + }, + { + "height": 0, + "key": "后段1-右下留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 1, + "y": 1 + }, + { + "height": 0, + "key": "后段1-左对齐度", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 0, + "y": 2 + }, + { + "height": 0, + "key": "后段1-右对齐度", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 1, + "y": 2 + }, + { + "height": 0, + "key": "后段2-左上留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 2, + "y": 0 + }, + { + "height": 0, + "key": "后段2-右上留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 3, + "y": 0 + }, + { + "height": 0, + "key": "后段2-左下留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 2, + "y": 1 + }, + { + "height": 0, + "key": "后段2-右下留白", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 3, + "y": 1 + }, + { + "height": 0, + "key": "后段2-左对齐度", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 2, + "y": 2 + }, + { + "height": 0, + "key": "后段2-右对齐度", + "limitHigh": 1.5, + "limitLow": -0.5, + "widgetType": "WaveFormWidget", + "width": 0, + "x": 3, + "y": 2 + } + ] + }, + "952-15-Q": { + "ImageView": { + "前段1-1": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 0, + "yPos": 0 + }, + "前段1-2": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 0, + "yPos": 1 + }, + "前段2-1": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 1, + "yPos": 0 + }, + "前段2-2": { + "viewer": [ + "结果图", + "正反射图像", + "形状图像1", + "标准图像" + ], + "xPos": 1, + "yPos": 1 + } + }, + "backend": { + "CameraSetting": [ + { + "connectionName": "25D-1", + "dllPath": "Hd_25DCameraVJ_module-ch1", + "imageShow": [ + "后段1-1#正反射图像", + "后段1-1#形状图像1", + "后段1-1#标准图像", + "后段1-2#正反射图像", + "后段1-2#形状图像1", + "后段1-2#标准图像" + ], + "key": "25D-1", + "oriSaveFormat": [] + }, + { + "connectionName": "25D-2", + "dllPath": "Hd_25DCameraVJ_module-ch2", + "imageShow": [ + "后段2-1#正反射图像", + "后段2-1#形状图像1", + "后段2-1#标准图像", + "后段2-2#正反射图像", + "后段2-2#形状图像1", + "后段2-2#标准图像" + ], + "key": "25D-2", + "oriSaveFormat": [] + } + ], + "Triggers": { + "heartBeatCmd": "writeHeart_short_D9204_1", + "initStr": "init_127.0.0.1_9600_128_6_0", + "key": "finstcp", + "moduleName": "Hd_SocketModule_FinsTcp", + "readAllCmd": "read_byte_D9200_800", + "readNum": 400, + "sleepTime": 20, + "writeType": "ushort" + }, + "imgSaveBasePath": "D://CCD", + "missionDllPath": "952_15_Q_25D.dll" + }, + "missionSettings": {}, + "softwareTile": "952-15前段主体", + "sublUiSetting": {} + }, + "main": { + "jsonVersion": "1.0.1", + "loginPassWord": "", + "objectSelect": "952-15-2D3D-1" + } +} \ No newline at end of file diff --git a/src/mission/952/CMakeLists.txt b/src/mission/952/CMakeLists.txt new file mode 100644 index 0000000..f9a95fd --- /dev/null +++ b/src/mission/952/CMakeLists.txt @@ -0,0 +1,11 @@ +# CMakeList.txt: 遍历文件夹 添加子项目 + +set(OUR_LIBS "") +SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF) +message("OUR_LIBS :" ${OUR_LIBS}) + + +# 遍历子库 +foreach(dll ${OUR_LIBS}) + add_subdirectory(${dll}) +endforeach(dll ${}) diff --git a/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.cpp b/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp similarity index 100% rename from src/mission/581-Dgh-CB-1/581-Dgh-CB-1.cpp rename to src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp diff --git a/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.h b/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h similarity index 100% rename from src/mission/581-Dgh-CB-1/581-Dgh-CB-1.h rename to src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h diff --git a/src/mission/581-Dgh-CB-1/CMakeLists.txt b/src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt similarity index 100% rename from src/mission/581-Dgh-CB-1/CMakeLists.txt rename to src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt diff --git a/src/mission/581-Dgh-CB-2/581-Dgh-CB-2.cpp b/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp similarity index 100% rename from src/mission/581-Dgh-CB-2/581-Dgh-CB-2.cpp rename to src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp diff --git a/src/mission/581-Dgh-CB-2/581-Dgh-CB-2.h b/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h similarity index 100% rename from src/mission/581-Dgh-CB-2/581-Dgh-CB-2.h rename to src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h diff --git a/src/mission/581-Dgh-CB-2/CMakeLists.txt b/src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt similarity index 100% rename from src/mission/581-Dgh-CB-2/CMakeLists.txt rename to src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt diff --git a/src/mission/581-Dgh-DB-1/581-Dgh-DB-1.cpp b/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp similarity index 100% rename from src/mission/581-Dgh-DB-1/581-Dgh-DB-1.cpp rename to src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp diff --git a/src/mission/581-Dgh-DB-1/581-Dgh-DB-1.h b/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h similarity index 100% rename from src/mission/581-Dgh-DB-1/581-Dgh-DB-1.h rename to src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h diff --git a/src/mission/581-Dgh-DB-1/CMakeLists.txt b/src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt similarity index 100% rename from src/mission/581-Dgh-DB-1/CMakeLists.txt rename to src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt diff --git a/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.cpp b/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp similarity index 100% rename from src/mission/581-Dgh-DB-2/581-Dgh-DB-2.cpp rename to src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp diff --git a/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h b/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h similarity index 100% rename from src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h rename to src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h diff --git a/src/mission/581-Dgh-DB-2/CMakeLists.txt b/src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt similarity index 100% rename from src/mission/581-Dgh-DB-2/CMakeLists.txt rename to src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt diff --git a/src/mission/DGH/CMakeLists.txt b/src/mission/DGH/CMakeLists.txt new file mode 100644 index 0000000..f9a95fd --- /dev/null +++ b/src/mission/DGH/CMakeLists.txt @@ -0,0 +1,11 @@ +# CMakeList.txt: 遍历文件夹 添加子项目 + +set(OUR_LIBS "") +SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF) +message("OUR_LIBS :" ${OUR_LIBS}) + + +# 遍历子库 +foreach(dll ${OUR_LIBS}) + add_subdirectory(${dll}) +endforeach(dll ${}) diff --git a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.cpp b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp similarity index 65% rename from src/mission/581_YuHan_hanhou/581_YuHan_hanhou.cpp rename to src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp index 181ab1c..7c9a9df 100644 --- a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.cpp +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp @@ -1,5 +1,11 @@ #include <581_YuHan_hanhou.h> +std::string controlAccuracy(float num, int length) { + std::string resultString = std::to_string(num); + resultString = resultString.substr(0, resultString.find(".") + length + 1); + return resultString; +} + void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint, bool& silieResult, bool& fanZheResult, cv::Point offset, handdleAI::pClassification* clsPtr, std::vector& clsImgs){ @@ -13,7 +19,7 @@ void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint, rect.x += offset.x; rect.y += offset.y; - if (originRect.width < 50 || originRect.height < 50) + if (originRect.width < 200 || originRect.height < 200) continue; std::vector clsImgVec = cutImg2ClsVec(rect, src); std::vector clsRes;//true ok @@ -69,7 +75,7 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - if (out_Flag.D() == 1) + if (out_Flag.D() == 0) { for (auto i = 0; i < out_LinePoint.Length(); i += 4) { @@ -79,13 +85,23 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment cv::Scalar(0, 255, 0), 5); } - double value1 = out_Distance[0].D(); - double value2 = out_Distance[1].D(); - double value3 = out_Distance[2].D(); + if(out_Distance.Length() > 6) { + double hanYin_Width = out_Distance[0].D();//焊印的宽度 + double hanYin_Height = out_Distance[1].D();//焊印的高度 + double hanYIn_Area = out_Distance[2].D();//焊印的面积 + double jiEr_Width = out_Distance[3].D() * 0.013682 * 0.013682;//极耳的宽度 + double jiEr_Height = out_Distance[4].D();//极耳的高度 + double hanYin_Distance_Up = out_Distance[5].D();//焊印上边缘到极耳上边缘的距离 + double hanYin_Distance_Down = out_Distance[6].D();//焊印下边缘到极耳下边缘的距离 - result.jiErWidth = value1; - result.jiErHeight = value2; - result.hanYin1 = value3; + result.jiErWidth = jiEr_Width; + result.jiErHeight = jiEr_Height; + result.hanYin_Width = hanYin_Width; + result.hanYin_Height = hanYin_Height; + result.hanYin_Area = hanYIn_Area; + result.hanYin_Distance_Up = hanYin_Distance_Up; + result.hanYin_Distance_Down = hanYin_Distance_Down; + } } else { @@ -100,33 +116,17 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { QByteArray plcResult = "2"; try { -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - QString resultTag = "OK"; - Mat srcImage; - srcImage = img2D.clone(); - cv::Mat dstImage; - srcImage.copyTo(dstImage); - cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5); - putTextHusky(dstImage, utf8_to_gbk("AI_OK").c_str(), cv::Point(1800, 50), cv::Scalar(0, 255, 0), 200); - putTextHusky(dstImage, utf8_to_gbk("ALGO_OK").c_str(), cv::Point(1800, 250), cv::Scalar(0, 255, 0), 200); - cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5); - resMat.push_back(dstImage); - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, resultTag)); - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, resultTag)); - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else cv::Mat sourceImg = data->oriImgs[0]; + //sourceImg = cv::imread("./testImages/" + std::to_string(_detParams->cameraIndex) + ".bmp"); + cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - + sourceImg.copyTo(Paint); if (Paint.channels() == 1) cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); //HALCON异步处理 cv::Mat hySegResult; - auto futrue = std::async(std::launch::async, halconAlgoProcess, sourceImg, Paint, _detParams->segHanYinZhuaQu, std::ref(hySegResult));//异步执行 + auto futrue = std::async(std::launch::async, halconAlgoProcess,sourceImg, Paint, _detParams->segHanYinZhuaQu, std::ref(hySegResult));//异步执行 //handleAI主线程处理 定位极耳 float resizeRate = 5.0; @@ -147,10 +147,11 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet); bool silieOk = true, fanZheOk = true; std::vector clsImgs; - handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rect.x * resizeRate, rect.y * resizeRate), _detParams->clsHanHou, clsImgs); + //handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rectCutJier.x, rectCutJier.y, _detParams->clsHanHou, clsImgs); //等待halcon算法完成 futrue.wait(); + data->oriImgs.push_back(hySegResult); halconResult halconResult = futrue.get(); //结果处理 QString okNgSaveText = "OK"; @@ -158,39 +159,58 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams QByteArray fanzheResultText = fanZheOk == true ? "1" : "2"; TextRendererZH textPainter(Paint.cols, Paint.rows, 300); if (silieOk == true && fanZheOk == true) {//OK - textPainter.putText(Paint, "缺陷检测OK", cv::Point(4000, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "缺陷检测OK", cv::Point(4200, 50), cv::Scalar(0, 255, 0)); } else { - textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4000, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4200, 50), cv::Scalar(0, 0, 255)); plcResult = "2"; data->aiDetOK = false; } if (halconResult.result == true) { - textPainter.putText(Paint, "算法OK", cv::Point(4000, 350), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "算法OK", cv::Point(4200, 350), cv::Scalar(0, 255, 0)); } else { - textPainter.putText(Paint, "算法NG", cv::Point(4000, 350), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "算法NG", cv::Point(4200, 350), cv::Scalar(0, 0, 255)); plcResult = "2"; data->halconOK = false; } plcResult = "1"; silieResultText = "1"; fanzheResultText = "1"; +#pragma region 判断结果以及储存结果 + double hanyinChangLimitHigh = data->service->_paramSyncManager->get("焊印长(上限)", 30.5).toDouble(); + double hanyinChangLimitLow = data->service->_paramSyncManager->get("焊印长(下限)", 29.5).toDouble(); + bool hanyinChangEnable = data->service->_paramSyncManager->get("焊印长判定启用", false).toBool(); + + double hanyinKuanLimitHigh = data->service->_paramSyncManager->get("焊印宽(上限)", 10.5).toDouble(); + double hanyinKuanLimitLow = data->service->_paramSyncManager->get("焊印宽(下限)", 9.5).toDouble(); + bool hanyinKuanEnable = data->service->_paramSyncManager->get("焊印宽判定启用", false).toBool(); + + double jierChangLimitHigh = data->service->_paramSyncManager->get("极耳长度(上限)", 10.5).toDouble(); + double jierChangLimitLow = data->service->_paramSyncManager->get("极耳长度(下限)", 9.5).toDouble(); + bool jierChangEnable = data->service->_paramSyncManager->get("极耳长度判定启用", false).toBool(); +#pragma endregion + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_" + silieResultText);//发送数据-撕裂OKNG data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 1) + "_" + fanzheResultText);//发送数据-翻折OKNG data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(halconResult.jiErWidth));//发送数据-极耳宽 data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(halconResult.jiErHeight));//发送数据-极耳高 data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//发送数据-焊印位置判定结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(halconResult.hanYin1));//发送数据-芯包顶部到焊印的距离 + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(halconResult.hanYin_Distance_Down));//发送数据-芯包顶部到焊印的距离 + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_" + QByteArray::number(halconResult.hanYin_Width));//发送数据-极耳宽 + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_" + QByteArray::number(halconResult.hanYin_Height));//发送数据-极耳高 - textPainter.putText(Paint, "极耳宽度" + std::to_string(halconResult.jiErWidth), cv::Point(100, 50), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "极耳高度" + std::to_string(halconResult.jiErHeight), cv::Point(100, 300), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "焊印上边缘到极耳上边缘高度" + std::to_string(halconResult.hanYin1), cv::Point(100, 550), cv::Scalar(0, 255, 0)); + //textPainter.putText(Paint, "极耳裁切宽度" + std::to_string(halconResult.jiErWidth), cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳宽度,暂时不显示 + textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳高度 + textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 255, 0));//焊印宽度 + textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 255, 0));//焊印高度 + textPainter.putText(Paint, "焊印面积" + controlAccuracy(halconResult.hanYin_Area, 4) + "mm²", cv::Point(100, 800), cv::Scalar(0, 255, 0));//焊印面积 + textPainter.putText(Paint, "焊印上边缘到极耳上边缘高度" + controlAccuracy(halconResult.hanYin_Distance_Up, 4) + "mm", cv::Point(100, 1050), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "焊印下边缘到极耳下边缘高度" + controlAccuracy(halconResult.hanYin_Distance_Down, 4) + "mm", cv::Point(100, 1300), cv::Scalar(0, 255, 0)); cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); data->resultImgs.push_back(Paint); return true; -#endif } CATCH_EXCEPTIONS @@ -200,7 +220,7 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams if (Paint.channels() == 1) cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); data->resultImgs.push_back(Paint); data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 @@ -210,28 +230,10 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { QByteArray plcResult = "2"; try{ -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - QString resultTag = "OK"; - Mat srcImage; - srcImage = img2D.clone(); - cv::Mat dstImage; - srcImage.copyTo(dstImage); - cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5); - putTextHusky(dstImage, utf8_to_gbk("AI_OK").c_str(), cv::Point(1800, 50), cv::Scalar(0, 255, 0), 200); - cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5); - resMat.push_back(dstImage); - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, resultTag)); - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, resultTag)); - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ - -#else - //存图数据加保存队列,加锁,避免数据访问冲突 cv::Mat sourceImg = data->oriImgs[0]; + //sourceImg = cv::imread("./testImages/"+ std::to_string(_detParams->cameraIndex) +".bmp"); cv::Mat Paint; sourceImg.copyTo(Paint); - if (Paint.channels() == 1) cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); @@ -252,19 +254,24 @@ bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, s //SEG缺陷检测 cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet); + data->segOriginImgs.push_back(matDet); bool silieOk = true, fanZheOk = true; std::vector clsImgs; - handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rect.x * resizeRate, rect.y * resizeRate), _detParams->clsHanHou, clsImgs); + if (_detParams->cameraIndex > 4) { + handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rectCutJier.x, rectCutJier.y), _detParams->clsHanHou, clsImgs); + } QString okNgSaveText = "OK"; QByteArray silieResultText = silieOk == true ? "1" : "2"; QByteArray fanzheResultText = fanZheOk == true ? "1" : "2"; plcResult = "1"; + cv::Rect cutPaintRect = cv::Rect(rectCutJier.x - 100, rectCutJier.y - 100, rectCutJier.width + 200, rectCutJier.height + 200) & cv::Rect(0, 0, sourceImg.cols, sourceImg.rows); + Paint = Paint(cutPaintRect).clone();//裁切结果图,确保界面只显示一个极耳 TextRendererZH textPainter(Paint.cols, Paint.rows, 200); if (silieOk == true && fanZheOk == true) {//OK - textPainter.putText(Paint, "OK", cv::Point(3000, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); } else { - textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(3000, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); plcResult = "2"; data->aiDetOK = false; } @@ -274,7 +281,6 @@ bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, s cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); data->resultImgs.push_back(Paint); return true; -#endif } CATCH_EXCEPTIONS @@ -284,7 +290,7 @@ bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, s if (Paint.channels() == 1) cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); data->resultImgs.push_back(Paint); data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 @@ -292,8 +298,11 @@ bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, s } + + + mission* createMission() { - return new _581_YuHan_hanhou(); + return new _581_YuHan_hanqian(); } void destroyMission(mission* _mission) { delete _mission; diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h new file mode 100644 index 0000000..82d0b42 --- /dev/null +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h @@ -0,0 +1,156 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +class yuHanHanHouParams { +public: + handdleAI::pSegmentation* segHanYinZhuaQu = nullptr; + handdleAI::pSegmentation* segYuHanDingWei = nullptr; + handdleAI::pSegmentation* segHanHou = nullptr; + handdleAI::pClassification* clsHanHou = nullptr; + int cameraIndex = 1; + bool isTong = true; +}; +struct halconResult { + bool result = true; + double hanYin_Width = -1;//焊印宽度 + double hanYin_Height = -1;//焊印高度 + double hanYin_Area = -1;//焊印面积 + double jiErWidth = -1;//极耳的宽度 + double jiErHeight = -1;//极耳的高度 + double hanYin_Distance_Up = -1;//焊印上边缘到极耳上边缘的距离 + double hanYin_Distance_Down = -1;//焊印下边缘到极耳下边缘的距离 +}; +void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint, + bool& silieResult, bool& fanZheResult, + cv::Point offset, handdleAI::pClassification* clsPtr, std::vector& clsImgs,int sgin); +halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegmentation* seg_hanYinZhuaQu, cv::Mat& segResult); +bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address); +bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address); +class _581_YuHan_hanqian : public mission { +public: + _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top90_1; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down90_2; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top90_3; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down90_4; + + _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top45_5; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down45_6; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top45_7; + _581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down45_8; + + //std::vector < yuHanHanHouParams> tongDetParams; + //std::vector < yuHanHanHouParams> lvDetParams; + + std::vector < yuHanHanHouParams> tong_90_DetParams; + std::vector < yuHanHanHouParams> lv_90_DetParams; + + std::vector < yuHanHanHouParams> dibu_45_tong_DetParams; + std::vector < yuHanHanHouParams> dingbu_45_tong_DetParams; + + std::vector < yuHanHanHouParams> dibu_45_lv_DetParams; + std::vector < yuHanHanHouParams> dingbu_45_lv_DetParams; + bool initOnce = false; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); + if (initOnce == false) { + for (int i = 0; i < 2; i++) + { + yuHanHanHouParams tong_90; + tong_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-T-seg.BHD", 64, 0); + tong_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); + tong_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-T.BHD", 64, 0); + tong_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1); + tong_90_DetParams.push_back(tong_90); + + yuHanHanHouParams lv_90; + lv_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-L-seg.BHD", 64, 1); + lv_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); + lv_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-L.BHD", 64, 1); + lv_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1); + lv_90_DetParams.push_back(lv_90); + + } + + yuHanHanHouParams dibu_45_lv; + dibu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); + dibu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); + dibu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-seg.BHD", 64, 1); + dibu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-cls.BHD", 1, 1); + dibu_45_lv_DetParams.push_back(dibu_45_lv); + + yuHanHanHouParams dibu_45_tong; + dibu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); + dibu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); + dibu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-seg.BHD", 64, 0); + dibu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-cls.BHD", 0, 1); + dibu_45_tong_DetParams.push_back(dibu_45_tong); + + yuHanHanHouParams dingbu_45_lv; + dingbu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); + dingbu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); + dingbu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-L-seg.BHD", 64, 1); + dingbu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-45-L-cls.BHD", 1, 1);//未更新 + dingbu_45_lv_DetParams.push_back(dingbu_45_lv); + + yuHanHanHouParams dingbu_45_tong; + dingbu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); + dingbu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); + dingbu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-seg.BHD", 64, 0); + dingbu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-cls.BHD", 0, 1); + dingbu_45_tong_DetParams.push_back(dingbu_45_tong); + + initOnce = true; + } + + + lv_90_DetParams[0].cameraIndex = 1; + lv_90_DetParams[1].cameraIndex = 2; + tong_90_DetParams[0].cameraIndex = 3; + tong_90_DetParams[1].cameraIndex = 4; + + dingbu_45_lv_DetParams[0].cameraIndex = 5; + dibu_45_lv_DetParams[0].cameraIndex = 6; + dingbu_45_tong_DetParams[0].cameraIndex = 7; + dibu_45_tong_DetParams[0].cameraIndex = 8; + + } + bool initCustom() { +#pragma region 注册触发器回调 + if (_serviceManager->_paramSyncManager->get("hanhou","OUT") == "OUT") { + lv_top90_1.init("Camera1", "极耳尺寸-外-铝-相机1(顶部90°)", { { 522, 1,{540},"523","530",820} }, 1, &lv_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); + lv_down90_2.init("Camera2", "极耳尺寸-外-铝-相机2(底部90°)", { { 524, 1,{540},"525","532",-1} }, 1, &lv_90_DetParams[1], _serviceManager, bridge, hanHouDown); + tong_top90_3.init("Camera3", "极耳尺寸-外-铜-相机3(顶部90°)", { { 526,1,{540},"527","534",800} }, 1, &tong_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); + tong_down90_4.init("Camera4", "极耳尺寸-外-铜-相机4(底部90°)", { { 528, 1,{540},"529","536",-1} }, 1, &tong_90_DetParams[1], _serviceManager, bridge, hanHouDown); + + lv_top45_5.init("Camera5", "底部撕裂-外-铝-相机5(顶部45°)", { { 562,1,{540},"563","570",-1} }, 1, &dingbu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown); + lv_down45_6.init("Camera6", "底部撕裂-外-铝-相机6(底部45°)", { { 564, 1,{540},"565","572",-1} }, 1, &dibu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown); + tong_top45_7.init("Camera7", "底部撕裂-外-铜-相机7(顶部45°)", { { 566, 1,{540},"567","574",-1} }, 1, &dingbu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); + tong_down45_8.init("Camera8", "底部撕裂-外-铜-相机8(底部45°)", { { 568, 1,{540},"569","576",-1} }, 1, &dibu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); + } + else { + lv_top90_1.init("Camera1", "极耳尺寸-内-铝-相机1(顶部90°)", { { 602, 1,{580},"603","610",860} }, 1, &lv_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); + lv_down90_2.init("Camera2", "极耳尺寸-内-铝-相机2(底部90°)", { { 604, 1,{580},"605","612",-1} }, 1, &lv_90_DetParams[1], _serviceManager, bridge, hanHouDown); + tong_top90_3.init("Camera3", "极耳尺寸-内-铜-相机3(顶部90°)", { { 606,1,{580},"607","614",840} }, 1, &tong_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); + tong_down90_4.init("Camera4", "极耳尺寸-内-铜-相机4(底部90°)", { { 608, 1,{580},"609","616",-1} }, 1, &tong_90_DetParams[1], _serviceManager, bridge, hanHouDown); + + lv_top45_5.init("Camera5", "底部撕裂-内-铝-相机5(顶部45°)", { { 642,1,{580},"643","650",-1} }, 1, &dingbu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown); + lv_down45_6.init("Camera6", "底部撕裂-内-铝-相机6(底部45°)", { { 644, 1,{580},"645","652",-1} }, 1, &dibu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown); + tong_top45_7.init("Camera7", "底部撕裂-内-铜-相机7(顶部45°)", { { 646, 1,{580},"647","654",-1} }, 1, &dingbu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); + tong_down45_8.init("Camera8", "底部撕裂-内-铜-相机8(底部45°)", { { 648, 1,{580},"649","656",-1} }, 1, &dibu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); + } +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581_YuHan_hanhou/CMakeLists.txt b/src/mission/YuHan/581_YuHan_hanhou/CMakeLists.txt similarity index 100% rename from src/mission/581_YuHan_hanhou/CMakeLists.txt rename to src/mission/YuHan/581_YuHan_hanhou/CMakeLists.txt diff --git a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.cpp b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp similarity index 100% rename from src/mission/581_YuHan_hanqian/581_YuHan_hanqian.cpp rename to src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp diff --git a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h similarity index 93% rename from src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h rename to src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h index d0bf975..3283e86 100644 --- a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h +++ b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h @@ -68,7 +68,7 @@ bool handleAiProcess(cv::Mat& seg_detImg, cv::Mat& seg_Paint, for (int i = 0; i < contours.size(); i++) { cv::Rect cls_rect = cv::boundingRect(contours[i]); - if (cls_rect.width < 50 || cls_rect.height < 50) + if (cls_rect.width < 200 || cls_rect.height < 200) continue; #if 1 std::vector clsImgVec = cutImg2ClsVec(cls_rect, seg_detImg); @@ -164,11 +164,12 @@ bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, auto rect = getImageLocateRect(sourceImg, _detParams->segDingWei, 1.0 / resizeRate);//定位 rect = rect & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows));//防止越界 bool isNG = false; - cv::Mat seg_saveImg; + cv::Mat seg_CutImg,seg_LocateImg; + sourceImg(rect).copyTo(seg_CutImg); + cv::resize(sourceImg, seg_LocateImg, cv::Size(), 0.2, 0.2); if (rect.width > 500 || rect.height > 500) { isNG = handleAiProcess(sourceImg(rect), Paint(rect), _detParams->segJiErFanZhe, _detParams->clsJiErFanZhe, data->clsOriginImgs); cv::rectangle(Paint, rect, cv::Scalar(0, 255, 255), 3); - cv::resize(sourceImg(rect), seg_saveImg, cv::Size(), 0.5, 0.5); } else { isNG = true; @@ -182,14 +183,15 @@ bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, } else { - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); data->aiDetOK = false; plcResult = "2"; } plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - sourceImg.release(); data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + data->segOriginImgs.push_back(seg_CutImg); + data->segOriginImgs.push_back(seg_LocateImg); + data->resultImgs.push_back(Paint); return true; #endif } @@ -228,13 +230,13 @@ public: if (initOnce == false) { for (auto& params : tongDetParams) { params.segDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_dingwei_seg.BHD", 64, 0); - params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_segT.BHD", 64, 0); - params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/60_2_hanqian_clsT.BHD", 0, 1); + params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/hanqian_T-seg.BHD", 64, 0); + params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/hanqian_T-cls.BHD", 0, 1); } for (auto& params : lvDetParams) { params.segDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_dingwei_seg.BHD", 64, 1); - params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_segL.BHD", 64, 1); - params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/60_2_hanqian_clsL.BHD", 1, 1); + params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/hanqian_L-seg.BHD", 64, 1); + params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/hanqian_L-cls.BHD", 1, 1); params.isTong = false; } initOnce = true; @@ -244,8 +246,8 @@ public: #pragma region 注册触发器回调 in_lv_top_1.init("Camera1", "极耳翻折-铝-内-相机1(顶部)", { { 682, 1,{760},"683","670",-1} }, 1, &lvDetParams[0], _serviceManager, bridge, jiErFanZhe); in_lv_down_2.init("Camera2", "极耳翻折-铝-内-相机2(底部)", { { 684, 1,{760},"685","672",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, jiErFanZhe); - in_tong_top_3.init("Camera3", "极耳翻折-铜-内-相机3(顶部)", { { 686,1,{760},"687","674",-1} }, 1, &tongDetParams[0], _serviceManager, bridge, jiErFanZhe); - in_tong_down_4.init("Camera4", "极耳翻折-铜-内-相机4(底部)", { { 688, 1,{760},"689","676",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, jiErFanZhe); + in_tong_top_3.init("Camera3", "极耳翻折-铜-内-相机3(顶部)", { { 686,1, {760},"687","674",-1} }, 1, &tongDetParams[0], _serviceManager, bridge, jiErFanZhe); + in_tong_down_4.init("Camera4", "极耳翻折-铜-内-相机4(底部)", { { 688, 1, {760},"689","676",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, jiErFanZhe); out_lv_top_5.init("Camera5", "极耳翻折-铝-外-相机5(顶部)", { { 702,1,{720},"703","710",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, jiErFanZhe); out_lv_down_6.init("Camera6", "极耳翻折-铝-外-相机6(底部)", { { 704, 1,{720},"705","712",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, jiErFanZhe); diff --git a/src/mission/581_YuHan_hanqian/CMakeLists.txt b/src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt similarity index 100% rename from src/mission/581_YuHan_hanqian/CMakeLists.txt rename to src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt diff --git a/src/mission/YuHan/CMakeLists.txt b/src/mission/YuHan/CMakeLists.txt new file mode 100644 index 0000000..f9a95fd --- /dev/null +++ b/src/mission/YuHan/CMakeLists.txt @@ -0,0 +1,11 @@ +# CMakeList.txt: 遍历文件夹 添加子项目 + +set(OUR_LIBS "") +SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF) +message("OUR_LIBS :" ${OUR_LIBS}) + + +# 遍历子库 +foreach(dll ${OUR_LIBS}) + add_subdirectory(${dll}) +endforeach(dll ${}) diff --git a/src/mission/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp similarity index 100% rename from src/mission/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp rename to src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp diff --git a/src/mission/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h similarity index 100% rename from src/mission/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h rename to src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h diff --git a/src/mission/581_ZhongHan_dibutiejiao/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt similarity index 100% rename from src/mission/581_ZhongHan_dibutiejiao/CMakeLists.txt rename to src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt diff --git a/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp b/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp similarity index 97% rename from src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp rename to src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp index 39cd41c..58e705e 100644 --- a/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp +++ b/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp @@ -128,7 +128,9 @@ bool zhongHan_hanHouCeLiang(std::shared_ptr data, zhongHan2dCeLiangPar textPainter.putText(Paint, "上焊印长:" + QString::number(out_HYValues1[0].D(),'f', 3).toStdString() + "mm", cv::Point(50, 360), cv::Scalar(0, 255, 0)); textPainter.putText(Paint, "上焊印宽:" + QString::number(out_HYValues1[1].D(),'f', 3).toStdString() + "mm", cv::Point(50, 480), cv::Scalar(0, 255, 0)); textPainter.putText(Paint, "上焊印面积:" + QString::number(out_HYValues1[2].D(), 'f', 3).toStdString() + "mm²", cv::Point(50, 600), cv::Scalar(0, 255, 0)); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance1[1].D())); + + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance1[2].D())); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(out_Distance1[2].D())); } //2 { @@ -143,8 +145,12 @@ bool zhongHan_hanHouCeLiang(std::shared_ptr data, zhongHan2dCeLiangPar else { textPainter.putText(Paint, "下焊印右边缘到连接片圆心竖直间距:" + QString::number(out_Distance2[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 170), cv::Scalar(0, 255, 0)); } + xingBaoDingBuDaoHanYinJianJu = (out_Distance1[2].D() + out_Distance2[2].D())/2; + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(out_Distance2[2].D())); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_" + QByteArray::number(out_Distance2[2].D())); + if (data->cameraKeyName == "Camera1") data->service->_triggerManager->writeFloat("D5820_" + QByteArray::number(xingBaoDingBuDaoHanYinJianJu)); else diff --git a/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h b/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h similarity index 100% rename from src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h rename to src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h diff --git a/src/mission/581_ZhongHan_hanhou/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt similarity index 100% rename from src/mission/581_ZhongHan_hanhou/CMakeLists.txt rename to src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt diff --git a/src/mission/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp b/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp similarity index 100% rename from src/mission/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp rename to src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp diff --git a/src/mission/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h b/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h similarity index 98% rename from src/mission/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h rename to src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h index 7b3ba38..888720f 100644 --- a/src/mission/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h +++ b/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h @@ -174,11 +174,6 @@ bool hanQianCeLiang_Main(std::shared_ptr data, zhongHanHanQianParams* cv::drawMarker(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), cv::Scalar(0, 255, 0), cv::MARKER_CROSS, 200, 5); cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5); } - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; } else{ std::string errTails = out_NGTails.S().Text(); @@ -192,6 +187,7 @@ bool hanQianCeLiang_Main(std::shared_ptr data, zhongHanHanQianParams* plcResult = "1";//强制OK data->resultImgs.push_back(Paint); data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 return true; } CATCH_EXCEPTIONS diff --git a/src/mission/581_ZhongHan_hanqian/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt similarity index 100% rename from src/mission/581_ZhongHan_hanqian/CMakeLists.txt rename to src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt diff --git a/src/mission/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp similarity index 100% rename from src/mission/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp rename to src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp diff --git a/src/mission/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h similarity index 100% rename from src/mission/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h rename to src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h diff --git a/src/mission/581_ZhongHan_silie_jixing/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt similarity index 100% rename from src/mission/581_ZhongHan_silie_jixing/CMakeLists.txt rename to src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt diff --git a/src/mission/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp similarity index 100% rename from src/mission/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp rename to src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp diff --git a/src/mission/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h similarity index 100% rename from src/mission/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h rename to src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h diff --git a/src/mission/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt similarity index 100% rename from src/mission/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt rename to src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt diff --git a/src/mission/ZhongHan/CMakeLists.txt b/src/mission/ZhongHan/CMakeLists.txt new file mode 100644 index 0000000..f9a95fd --- /dev/null +++ b/src/mission/ZhongHan/CMakeLists.txt @@ -0,0 +1,11 @@ +# CMakeList.txt: 遍历文件夹 添加子项目 + +set(OUR_LIBS "") +SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF) +message("OUR_LIBS :" ${OUR_LIBS}) + + +# 遍历子库 +foreach(dll ${OUR_LIBS}) + add_subdirectory(${dll}) +endforeach(dll ${}) diff --git a/subModule/Hd_VirtualCamera/Hd_VirtualCamera.cpp b/subModule/Hd_VirtualCamera/Hd_VirtualCamera.cpp index 2f04a31..e4af46a 100644 --- a/subModule/Hd_VirtualCamera/Hd_VirtualCamera.cpp +++ b/subModule/Hd_VirtualCamera/Hd_VirtualCamera.cpp @@ -45,7 +45,7 @@ bool Hd_VirtualCamera::readData(std::vector& mat, QByteArray& data) n_mutex->unlock(); //for (int i=0;i