From 43538697ba21467f0d331e841e3a6d25fb3148ee Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Sat, 6 Dec 2025 15:13:39 +0800 Subject: [PATCH] =?UTF-8?q?V20251206-2.3.0=20=E4=BF=AE=E5=A4=8D=E4=BB=8Emi?= =?UTF-8?q?ssionResultHandle=E8=B0=83=E7=94=A8sql=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=97=B6=E5=BC=82=E5=B8=B8=E7=9A=84bug=E3=80=82=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=BD=93=E5=AD=98=E5=9B=BE=E7=BA=BF=E7=A8=8B=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E8=B6=85=E8=BF=871g=E6=97=B6=E4=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=BC=80=E5=AD=98=E5=9B=BE=E7=BA=BF=E7=A8=8B=EF=BC=8C=E4=B8=8A?= =?UTF-8?q?=E9=99=908=E4=B8=AA=E3=80=82=20=E4=BF=AE=E6=94=B9=E6=93=8D?= =?UTF-8?q?=E4=BD=9Cdetdata=E7=9A=84=E5=9B=BE=E7=89=87=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E6=97=B6=E9=9C=80=E8=A6=81=E5=8A=A0=E9=94=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/global.h | 3 +- include/sxGlobal.h | 13 +- include/yhGlobal.h | 16 +- src/Core/backendInterface.cpp | 2 +- src/core/backendInterface.h | 7 +- src/core/service/cameraManager.cpp | 11 +- src/core/service/cameraManager.h | 4 +- src/core/service/detCallbackChain.hpp | 13 +- src/core/service/detData.h | 147 +- src/core/service/imgSaveThreadManager.h | 120 +- src/core/service/missionResultHandle.h | 18 +- src/cutImage/main.cpp | 27 + src/mission/581-Mfd_djy_sd/581-Mfd.cpp | 8 - src/mission/581-Mfd_djy_sd/581-Mfd.h | 170 - src/mission/581-Mfd_yh_mh_hh/581-Mfd.cpp | 8 - src/mission/581-Mfd_yh_mh_hh/581-Mfd.h | 341 -- src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h | 2903 ----------------- src/mission/581-Ruke/581-Ruke.cpp | 8 - src/mission/581-Ruke/581-Ruke.h | 38 - .../581_RuanLianJie_majiatiejiao.cpp | 9 - .../581_RuanLianJie_majiatiejiao.h | 284 -- .../CMakeLists.txt | 77 - .../581_Ruanlianjie_hanqian_hanhou.cpp | 424 --- .../581_Ruanlianjie_hanqian_hanhou.h | 81 - .../CMakeLists.txt | 77 - .../581_YiCiZhuYe_canye.cpp | 113 - .../581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h | 58 - .../581_YiCiZhuYe_canye/CMakeLists.txt | 77 - .../601/601_RLJ_DingGai/601_RLJ_DingGai.cpp | 483 +++ .../601/601_RLJ_DingGai/601_RLJ_DingGai.h | 137 + .../601_RLJ_DingGai}/CMakeLists.txt | 0 src/mission/601/601_RLJ_HH/601_RLJ_HH.cpp | 155 + src/mission/601/601_RLJ_HH/601_RLJ_HH.h | 63 + .../601_RLJ_HH}/CMakeLists.txt | 0 src/mission/601/601_ZH_Dibu/601_ZH_Dibu.cpp | 478 +++ src/mission/601/601_ZH_Dibu/601_ZH_Dibu.h | 170 + .../601_ZH_Dibu}/CMakeLists.txt | 0 src/mission/{952 => 601}/CMakeLists.txt | 0 .../602_RuanLianJie_dinggai.cpp | 9 - .../602_RuanLianJie_dinggai.h | 394 --- .../602_RuanLianJie_dinggai/CMakeLists.txt | 78 - .../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 ---- .../581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp | 233 -- .../581-BaoMo-Cam1213/581-BaoMo-Cam1213.h | 44 - .../BaoMo/581-BaoMo-Cam1213/CMakeLists.txt | 77 - .../581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp | 181 - .../581-BaoMo-Cam1234/581-BaoMo-Cam1234.h | 68 - .../BaoMo/581-BaoMo-Cam1234/CMakeLists.txt | 77 - .../581-BaoMo-Cam5678/581-BaoMo-Cam5678.cpp | 8 - .../581-BaoMo-Cam5678/581-BaoMo-Cam5678.h | 264 -- .../BaoMo/581-BaoMo-Cam5678/CMakeLists.txt | 77 - .../581-BaoMo-Cam91011/581-BaoMo-Cam91011.cpp | 201 -- .../581-BaoMo-Cam91011/581-BaoMo-Cam91011.h | 64 - .../BaoMo/581-BaoMo-Cam91011/CMakeLists.txt | 77 - src/mission/BaoMo/CMakeLists.txt | 11 - src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp | 8 - src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h | 182 -- src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt | 77 - src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp | 8 - src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h | 451 --- src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt | 77 - src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp | 8 - src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h | 46 - src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt | 77 - src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp | 8 - src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h | 273 -- src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt | 77 - src/mission/DGH/CMakeLists.txt | 11 - .../581_YuHan_hanhou/581_YuHan_hanhou.cpp | 341 -- .../YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h | 156 - .../YuHan/581_YuHan_hanhou/CMakeLists.txt | 77 - .../581_YuHan_hanqian/581_YuHan_hanqian.cpp | 8 - .../581_YuHan_hanqian/581_YuHan_hanqian.h | 268 -- .../YuHan/581_YuHan_hanqian/CMakeLists.txt | 77 - .../581_YuHan_jixing/581_YuHan_jixing.cpp | 8 - .../YuHan/581_YuHan_jixing/581_YuHan_jixing.h | 177 - .../YuHan/581_YuHan_jixing/CMakeLists.txt | 77 - src/mission/YuHan/CMakeLists.txt | 11 - .../581_ZhongHan_dibutiejiao.cpp | 8 - .../581_ZhongHan_dibutiejiao.h | 410 --- .../581_ZhongHan_dibutiejiao/CMakeLists.txt | 77 - .../581_ZhongHan_hanhou.cpp | 394 --- .../581_ZhongHan_hanhou/581_ZhongHan_hanhou.h | 119 - .../581_ZhongHan_hanhou/CMakeLists.txt | 77 - .../581_ZhongHan_hanqian.cpp | 8 - .../581_ZhongHan_hanqian.h | 376 --- .../581_ZhongHan_hanqian/CMakeLists.txt | 77 - .../581_ZhongHan_silie_jixing.cpp | 247 -- .../581_ZhongHan_silie_jixing.h | 83 - .../581_ZhongHan_silie_jixing/CMakeLists.txt | 77 - .../581_ZhongHan_tiejiao_dingbu.cpp | 217 -- .../581_ZhongHan_tiejiao_dingbu.h | 60 - .../CMakeLists.txt | 77 - src/mission/ZhongHan/CMakeLists.txt | 11 - .../Hd_CameraModule_3DKeyence.cpp | 39 +- 103 files changed, 1787 insertions(+), 13174 deletions(-) delete mode 100644 src/mission/581-Mfd_djy_sd/581-Mfd.cpp delete mode 100644 src/mission/581-Mfd_djy_sd/581-Mfd.h delete mode 100644 src/mission/581-Mfd_yh_mh_hh/581-Mfd.cpp delete mode 100644 src/mission/581-Mfd_yh_mh_hh/581-Mfd.h delete mode 100644 src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h delete mode 100644 src/mission/581-Ruke/581-Ruke.cpp delete mode 100644 src/mission/581-Ruke/581-Ruke.h delete mode 100644 src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp delete mode 100644 src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h delete mode 100644 src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt delete mode 100644 src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp delete mode 100644 src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h delete mode 100644 src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt delete mode 100644 src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.cpp delete mode 100644 src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h delete mode 100644 src/mission/581_YiCiZhuYe_canye/CMakeLists.txt create mode 100644 src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.cpp create mode 100644 src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.h rename src/mission/{581-Mfd_djy_sd => 601/601_RLJ_DingGai}/CMakeLists.txt (100%) create mode 100644 src/mission/601/601_RLJ_HH/601_RLJ_HH.cpp create mode 100644 src/mission/601/601_RLJ_HH/601_RLJ_HH.h rename src/mission/{581-Mfd_yh_mh_hh => 601/601_RLJ_HH}/CMakeLists.txt (100%) create mode 100644 src/mission/601/601_ZH_Dibu/601_ZH_Dibu.cpp create mode 100644 src/mission/601/601_ZH_Dibu/601_ZH_Dibu.h rename src/mission/{581-Ruke => 601/601_ZH_Dibu}/CMakeLists.txt (100%) rename src/mission/{952 => 601}/CMakeLists.txt (100%) delete mode 100644 src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.cpp delete mode 100644 src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.h delete mode 100644 src/mission/602_RuanLianJie_dinggai/CMakeLists.txt delete mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp delete mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h delete mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp delete mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h delete mode 100644 src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt delete mode 100644 src/mission/952/952_15_Q_2D3D/CMakeLists.txt delete mode 100644 src/mission/952/952_15_Q_2D3D/backend.json delete mode 100644 src/mission/952/952_15_Q_2D3D/externalData.json delete mode 100644 src/mission/952/952_15_Q_2D3D/setting.json delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.h delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1213/CMakeLists.txt delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam1234/CMakeLists.txt delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.cpp delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam5678/CMakeLists.txt delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.cpp delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.h delete mode 100644 src/mission/BaoMo/581-BaoMo-Cam91011/CMakeLists.txt delete mode 100644 src/mission/BaoMo/CMakeLists.txt delete mode 100644 src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp delete mode 100644 src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h delete mode 100644 src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt delete mode 100644 src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp delete mode 100644 src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h delete mode 100644 src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt delete mode 100644 src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp delete mode 100644 src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h delete mode 100644 src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt delete mode 100644 src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp delete mode 100644 src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h delete mode 100644 src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt delete mode 100644 src/mission/DGH/CMakeLists.txt delete mode 100644 src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp delete mode 100644 src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h delete mode 100644 src/mission/YuHan/581_YuHan_hanhou/CMakeLists.txt delete mode 100644 src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp delete mode 100644 src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h delete mode 100644 src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt delete mode 100644 src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp delete mode 100644 src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h delete mode 100644 src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt delete mode 100644 src/mission/YuHan/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp delete mode 100644 src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h delete mode 100644 src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h delete mode 100644 src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp delete mode 100644 src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h delete mode 100644 src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp delete mode 100644 src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h delete mode 100644 src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt delete mode 100644 src/mission/ZhongHan/CMakeLists.txt diff --git a/include/global.h b/include/global.h index 30d084b..750e9c9 100644 --- a/include/global.h +++ b/include/global.h @@ -11,8 +11,9 @@ #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251127-2.2.7"; +const std::string softwareVersion = "20251206-2.3.0"; const std::string euiJsonVersion = "1.0.6"; +#define GigaByte 1073741824 #define globalDatabasePth "./sqlDatabase/eui_db.db" //全局数据库路径 #define saveImgEnable 1 #define switchToTongYongUi 1 //是否切换到通用UI界面 diff --git a/include/sxGlobal.h b/include/sxGlobal.h index 624cd3f..09b357b 100644 --- a/include/sxGlobal.h +++ b/include/sxGlobal.h @@ -44,14 +44,15 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; std::vector < std::string> defects = {"测试"}; ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) + if (data->getOriImgSize() < 1) { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); return false; } - if (data->oriImgs[0].rows == 100) { + auto oriImgs = data->getOriImgVec(); + if (oriImgs[0].rows == 100) { cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); + oriImgs[0].copyTo(Paint); cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); return false; } @@ -60,7 +61,7 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam QMutex paintMutex; clock_t start, finish; start = clock(); - cv::Mat src1 = data->oriImgs[0]; + cv::Mat src1 = oriImgs[0]; if (src1.channels() != 3) cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); else @@ -71,7 +72,7 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 - data->resultImgs.push_back(Paint); + data->insertResultImg(Paint); return true; } CATCH_EXCEPTIONS diff --git a/include/yhGlobal.h b/include/yhGlobal.h index 0ef7fe0..d13c675 100644 --- a/include/yhGlobal.h +++ b/include/yhGlobal.h @@ -60,14 +60,14 @@ public: void generalExceptionResume(std::shared_ptr data, yh_581_address address, QString why = "") { qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); + data->getOriImg(0).copyTo(Paint); if (Paint.channels() == 1) cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); TextRendererZH textPainter(Paint.cols, Paint.rows, 300); textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); + data->insertResultImg(Paint); if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 else @@ -78,14 +78,14 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; std::vector < std::string> defects = {"测试"}; ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) + if (data->getOriImgSize() < 1) { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); return false; } - if (data->oriImgs[0].rows == 100) { + if (data->getOriImg(0).rows == 100) { cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); + data->getOriImg(0).copyTo(Paint); cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); return false; } @@ -94,7 +94,7 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam QMutex paintMutex; clock_t start, finish; start = clock(); - cv::Mat src1 = data->oriImgs[0]; + cv::Mat src1 = data->getOriImg(0); if (src1.channels() != 3) cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); else @@ -107,7 +107,7 @@ static bool generalAlgoTest(std::shared_ptr data, detParams* _detParam data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2)+ "_0.456");//发送数据2 data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 - data->resultImgs.push_back(Paint); + data->insertResultImg(Paint); return true; } CATCH_EXCEPTIONS diff --git a/src/Core/backendInterface.cpp b/src/Core/backendInterface.cpp index 9bbf06a..34fbd9f 100644 --- a/src/Core/backendInterface.cpp +++ b/src/Core/backendInterface.cpp @@ -25,7 +25,7 @@ void Backend::init(SQLiteDB* db, nlohmann::ordered_json& json) { _csvWriter = new CsvWriter(sqlDatabase, externalInitDataVec); _serviceManager._detDataManager = new detDataManager(); - _missionResultHandle = new missionResultHandle(&_signalHub); + _missionResultHandle = new missionResultHandle(&_signalHub, _csvWriter); _serviceManager._missionResultHandle = _missionResultHandle; _serviceManager.dataBase = sqlDatabase; _serviceManager._csvWriter = _csvWriter; diff --git a/src/core/backendInterface.h b/src/core/backendInterface.h index 0960e74..59441a7 100644 --- a/src/core/backendInterface.h +++ b/src/core/backendInterface.h @@ -85,18 +85,19 @@ public slots: } camera->captureImage(dataPtr); int cnt = 0; - while (dataPtr->oriImgs.size() == 0 && cnt < 20) { + while (dataPtr->getOriImgSize() == 0 && cnt < 20) { QThread::msleep(10); cnt++; } - if (dataPtr->oriImgs.size() == 0) { + if (dataPtr->getOriImgSize() == 0) { cv::Mat mat(1000, 1000, CV_8UC1, 255); cv::putText(mat, "Capture Image Timeout", cv::Point(50, 500), cv::FONT_HERSHEY_SIMPLEX, 2, cv::Scalar(0, 0, 255), 3); mats->push_back(mat); return; } - mats->swap(dataPtr->oriImgs); + auto matVec = dataPtr->getOriImgVec(); + mats->insert(mats->end(), matVec.begin(), matVec.end()); return; } bool excuteCliCommand(const QString& command) { diff --git a/src/core/service/cameraManager.cpp b/src/core/service/cameraManager.cpp index 9b0e766..3c6637f 100644 --- a/src/core/service/cameraManager.cpp +++ b/src/core/service/cameraManager.cpp @@ -76,13 +76,14 @@ void camera::run(){ QMutexLocker locker(&mutex); data = requestQueue.dequeue(); } - if(data->oriImgs.size() >=data->imgAmountMin)continue; - QMutexLocker locker2(&data->oriImgMutex); + if(data->getOriImgSize() >= data->imgAmountMin)continue; while (1) { trigger(); - getCameraImg(data->oriImgs, data->imgAmountMin); - if (data->oriImgs.size() >= data->imgAmountMin) { - qDebug() << data->uuid << " Min:" << data->imgAmountMin << " Get:" << data->oriImgs.size(); + std::vector mats; + getCameraImg(mats, data->imgAmountMin); + data->insertOriImg(mats); + if (data->getOriImgSize() >= data->imgAmountMin) { + qDebug() << data->uuid << " Min:" << data->imgAmountMin << " Get:" << data->getOriImgSize(); break; } } diff --git a/src/core/service/cameraManager.h b/src/core/service/cameraManager.h index f9d7e0a..4bbef15 100644 --- a/src/core/service/cameraManager.h +++ b/src/core/service/cameraManager.h @@ -185,10 +185,10 @@ public slots: std::shared_ptr data(new detData());//创建数据包 data->imgAmountMin = 1; camera->second->captureImage(data); - while (data->oriImgs.size() == 0) { + while (data->getOriImgSize() == 0) { QThread::msleep(10); } - return data->oriImgs[0]; + return data->getOriImgVec()[0]; } }; diff --git a/src/core/service/detCallbackChain.hpp b/src/core/service/detCallbackChain.hpp index 614a089..d522009 100644 --- a/src/core/service/detCallbackChain.hpp +++ b/src/core/service/detCallbackChain.hpp @@ -34,7 +34,7 @@ public: //启动检测 void process(std::shared_ptr data, addressTemplate address, QByteArray completeSignal = "") { data->service = _serviceManager; - while (data->oriImgs.size() < data->imgAmountMin) { + while (data->getOriImgSize() < data->imgAmountMin) { QThread::msleep(10); } if(completeSignal != "") @@ -43,17 +43,18 @@ public: auto resultData = algoEvaluate(data, _handleAiModels, address); // 确保线程安全退出 qDebug() << "Processing finished for data with UUID:" << data->uuid; - if (data->resultImgs.size() > 0) { + if (data->getResultImgSize() > 0) { - for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++) { + for (int i = 0; i < data->getResultImgSize() && i < data->resultImgShowSet.size(); i++) { auto pack = data->resultImgShowSet[std::min(i, (int)data->resultImgShowSet.size() - 1)]; - int resizeRate = qMax(data->resultImgs[i].cols / uiShowImgCompressThreshold, data->resultImgs[i].rows / uiShowImgCompressThreshold) ; + cv::Mat img = data->getResultImg(i); + int resizeRate = qMax(img.cols / uiShowImgCompressThreshold, img.rows / uiShowImgCompressThreshold) ; resizeRate = std::pow(2, resizeRate); if (resizeRate > 1) { - cv::resize(data->resultImgs[i], pack.img, cv::Size(data->resultImgs[i].cols / resizeRate, data->resultImgs[i].rows / resizeRate), 0, 0, cv::INTER_AREA); + cv::resize(img, pack.img, cv::Size(img.cols / resizeRate, img.rows / resizeRate), 0, 0, cv::INTER_AREA); } else - data->resultImgs[i].copyTo(pack.img); + img.copyTo(pack.img); emit bridge->displayWidget_sendImg(pack); } } diff --git a/src/core/service/detData.h b/src/core/service/detData.h index 5a9634d..37e37d3 100644 --- a/src/core/service/detData.h +++ b/src/core/service/detData.h @@ -17,6 +17,14 @@ class detData; class detDataManager; class ServiceManager; class detData{ +private: + QMutex oriImgMutex;//原图锁 + std::vector oriImgs;//原图容器 + + QMutex resultMutex;//结果图锁 + std::vector resultImgs;//结果图容器 + std::vector segOriginImgs;//seg检测原图容器 + std::vector> clsOriginImgs;//cls检测原图容器 public: std::chrono::steady_clock::time_point startTime = std::chrono::high_resolution_clock::now(); std::chrono::steady_clock::time_point getImageTime; @@ -38,13 +46,113 @@ public: #pragma endregion #pragma region 存图相关 QString saveObjectName; - QMutex resultMutex;//结果图锁 - std::vector resultImgs;//结果图容器 - std::vector segOriginImgs;//seg检测原图容器 - std::vector> clsOriginImgs;//cls检测原图容器 + int getResultImgSize() { + QMutexLocker locker(&resultMutex); + return resultImgs.size(); + } + const cv::Mat& getResultImg(const int index) { + QMutexLocker locker(&resultMutex); + if (resultImgs.size() < index) + return cv::Mat(100, 100, CV_8UC1,cv::Scalar(0)); + return resultImgs[index]; + } + const std::vector& getResultImgVec() { + QMutexLocker locker(&resultMutex); + return resultImgs; + } + void insertResultImg(const cv::Mat& img) { + QMutexLocker locker(&resultMutex); + resultImgs.push_back(img); + } + void insertResultImg(const std::vector& imgs) { + QMutexLocker locker(&resultMutex); + for (const auto& img : imgs) + resultImgs.push_back(img); + } + bool deleteResultImg(int index) { + QMutexLocker locker(&resultMutex); + if (index < 0 || index >= resultImgs.size()) + return false; + resultImgs.erase(resultImgs.begin() + index); + return true; + } - QMutex oriImgMutex;//原图锁 - std::vector oriImgs;//原图容器 + int getSegOriginImgSize() { + QMutexLocker locker(&resultMutex); + return segOriginImgs.size(); + } + const std::vector& getSegOriginImgVec() { + QMutexLocker locker(&resultMutex); + return segOriginImgs; + } + void insertSegOriginImg(const cv::Mat& img) { + QMutexLocker locker(&resultMutex); + segOriginImgs.push_back(img); + } + void insertSegOriginImg(const std::vector& imgs) { + QMutexLocker locker(&resultMutex); + for (const auto& img : imgs) + segOriginImgs.push_back(img); + } + bool deleteSegOriginImg(int index) { + QMutexLocker locker(&resultMutex); + if (index < 0 || index >= segOriginImgs.size()) + return false; + segOriginImgs.erase(segOriginImgs.begin() + index); + return true; + } + + int getClsOriginImgSize() { + QMutexLocker locker(&resultMutex); + return clsOriginImgs.size(); + } + const std::vector>& getClsOriginImgVec() { + QMutexLocker locker(&resultMutex); + return clsOriginImgs; + } + void insertClsOriginImg(const std::vector>& items) { + QMutexLocker locker(&resultMutex); + for (const auto& item : items) + clsOriginImgs.push_back({ item.first, item.second.clone() }); + } + bool deleteClsOriginImg(int index) { + QMutexLocker locker(&resultMutex); + if (index < 0 || index >= clsOriginImgs.size()) + return false; + clsOriginImgs.erase(clsOriginImgs.begin() + index); + return true; + } + + int getOriImgSize() { + QMutexLocker locker(&oriImgMutex); + return oriImgs.size(); + } + const cv::Mat& getOriImg(const int& index) { + QMutexLocker locker(&oriImgMutex); + if (oriImgs.size() < index) + return cv::Mat(100, 100, CV_8UC1, cv::Scalar(0)); + return oriImgs[index]; + } + const std::vector& getOriImgVec() { + QMutexLocker locker(&oriImgMutex); + return oriImgs; + } + void insertOriImg(const cv::Mat& img) { + QMutexLocker locker(&oriImgMutex); + oriImgs.push_back(img); + } + void insertOriImg(const std::vector& img) { + QMutexLocker locker(&oriImgMutex); + oriImgs.insert(oriImgs.end(), img.begin(), img.end()); + } + bool deleteOriImg(const int& index) { + QMutexLocker locker(&oriImgMutex); + if (index < 0 || index >= oriImgs.size()) { + return false; // 越界 + } + oriImgs.erase(oriImgs.begin() + index); + return true; + } std::vector oriFormat;//原图格式 如果数量不一致直接全存bmp //PATH_SAMPLE : "{imgSaveRootDir}/{yyyy-MM-dd}/{HH}H/{imageType}/{processResult}/{SN}/" @@ -63,14 +171,25 @@ public: QMap additional;//自定义参数 detData() {} ~detData() { - for (auto& img : oriImgs) - img.release(); - for (auto& img : resultImgs) - img.release(); - for (auto& img : segOriginImgs) - img.release(); - for (auto& img : clsOriginImgs) - img.second.release(); + try { + for (auto& img : oriImgs) + img.release(); + for (auto& img : resultImgs) + img.release(); + for (auto& img : segOriginImgs) + img.release(); + for (auto& img : clsOriginImgs) + img.second.release(); + } + catch (cv::Exception& e) { + qCritical() << "detData析构崩溃 OpenCV异常: " << e.what() << " SN: " << QString::fromStdString(SNcode) << " uuid: " << uuid; + } + catch (std::exception& e) { + qCritical() << "detData析构崩溃 标准异常: " << e.what() << " SN: " << QString::fromStdString(SNcode) << " uuid: " << uuid; + } + catch (...) { + qCritical() << "detData析构崩溃 未知异常 SN: " << QString::fromStdString(SNcode) << " uuid: " << uuid; + } } }; class detDataManager{ diff --git a/src/core/service/imgSaveThreadManager.h b/src/core/service/imgSaveThreadManager.h index 58ee8dd..8a5968b 100644 --- a/src/core/service/imgSaveThreadManager.h +++ b/src/core/service/imgSaveThreadManager.h @@ -103,7 +103,7 @@ public: return result.toLocal8Bit().toStdString() + "." + format; } - std::vector genFileNames(std::shared_ptr data, imgSaveThreadType type, std::vector& imgs) { + std::vector genFileNames(std::shared_ptr data, imgSaveThreadType type, const std::vector& imgs) { std::vector result; switch (type) { @@ -129,7 +129,7 @@ public: } return result; } - std::vector genClsFileNames(std::shared_ptr data, imgSaveThreadType type, std::vector>& imgs, QString customFileName = "") { + std::vector genClsFileNames(std::shared_ptr data, imgSaveThreadType type, const std::vector>& imgs, QString customFileName = "") { std::vector result; for (int i = 0; i < imgs.size(); i++) { result.push_back(genFileName(data, type, i, defaultFileName, data->customImageSaveTemplateParams)); @@ -182,15 +182,13 @@ struct saveJob { class imgSaveThread : public QThread { public: + imgSaveThread(int threadIndexIn = 0) :threadIndex(threadIndexIn) { + } enum type { normal, priority }; - QMutex mutex; - std::vector compressionParams{ cv::IMWRITE_PNG_COMPRESSION ,9 }; - QQueue< std::shared_ptr>priorityQueue; - QQueue< std::shared_ptr>defaultQueue; - int imgRemainCount = 0; + void run() { try { while (true) { @@ -198,7 +196,7 @@ public: std::shared_ptr job = nullptr; // 优先处理 priorityQueue { - QMutexLocker locker(&mutex); + QMutexLocker locker(&queueMutex); if (!priorityQueue.isEmpty()) { job = priorityQueue.dequeue(); } @@ -220,6 +218,8 @@ public: auto data = std::move(localQueue.dequeue()); #if saveImgEnable cv::imwrite(data.first, data.second); + QMutexLocker locker(&threadBufferSizeMutex); + threadBufferSize -= data.second.total() * data.second.elemSize(); #endif } @@ -227,19 +227,23 @@ public: } } catch (cv::Exception& e) { - qCritical() << "存图线程发生严重错误" << e.what(); + qCritical() << "OpenCV异常: " << e.what(); } catch (std::exception& e) { - qCritical() << "存图线程发生严重错误" << e.what(); + qCritical() << "标准异常: " << e.what(); } catch (...) { - qCritical() << "存图线程发生严重错误"; + qCritical() << "未知异常: 存图崩溃"; } } - void addJob(std::shared_ptr job, type type_ = normal) { - - QMutexLocker locker(&mutex); + { + QMutexLocker locker(&threadBufferSizeMutex); + for (auto& img : job->imgQueue) { + threadBufferSize += img.second.total() * img.second.elemSize(); + } + } + QMutexLocker locker(&queueMutex); switch (type_) { case normal: defaultQueue.append(job); @@ -254,25 +258,35 @@ public: this->start(); } } - - int queueSize() { - QMutexLocker locker(&mutex); - int size = defaultQueue.size(); + int getQueueSize() { + QMutexLocker locker(&queueMutex); + int size = defaultQueue.size() + priorityQueue.size(); return size; } + int getThreadBufferSize() { + QMutexLocker locker(&threadBufferSizeMutex); + return threadBufferSize; + } +private: + std::vector compressionParams{ cv::IMWRITE_PNG_COMPRESSION ,9 }; + QMutex queueMutex, threadBufferSizeMutex; + int threadIndex = 0,threadBufferSize = 0,imgRemainCount = 0;; + QQueue< std::shared_ptr>priorityQueue; + QQueue< std::shared_ptr>defaultQueue; }; class imgSaveThreadManager { public: imgSaveThreadManager(std::string pathIn, paramSyncManager* paramSyncManagerIn) { _ImageSavePathFormatter.rootDir = QString::fromStdString(pathIn); _paramSyncManager = paramSyncManagerIn; + saveThreads.emplace_back(std::make_unique(saveThreads.size())); saveOri = _paramSyncManager->get("通用设置", "存储原图", true).toBool(); saveRes = _paramSyncManager->get("通用设置", "存储结果图", true).toBool(); saveSeg = _paramSyncManager->get("通用设置", "存储Seg图", true).toBool(); saveCls = _paramSyncManager->get("通用设置", "存储Cls图", true).toBool(); } - ~imgSaveThreadManager() {}; - imgSaveThread saveThread; + ~imgSaveThreadManager() {} + void saveImage(std::shared_ptr data) { if (getParamTimer.elapsed() > 5000) { saveOri = _paramSyncManager->get("通用设置", "存储原图", true).toBool(); @@ -286,50 +300,74 @@ public: std::shared_ptr resJob(new saveJob("[RES_JOB]" + data->SNcode)); QString oriSavePath = _ImageSavePathFormatter.genPath(data, oriImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 - if (saveOri == true || saveSeg == true || saveCls == true) { + if ((saveOri == true || saveSeg == true || saveCls == true) && (data->getOriImgSize() != 0 || data->getSegOriginImgSize() != 0 || data->getClsOriginImgSize() != 0)){ createDirectoryIfNotExists(oriSavePath);//不存在此文件夹则创建 - if (data->oriImgs.size() != 0 && saveOri == true) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->oriImgs);//按规则为文件创建命名 - packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->oriImgs);//打包数据 + if (data->getOriImgSize() != 0 && saveOri == true) { + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->getOriImgVec());//按规则为文件创建命名 + packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->getOriImgVec());//打包数据 } //SEG原图 - if (data->segOriginImgs.size() != 0 && saveSeg == true) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->segOriginImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->segOriginImgs);//打包数据 + if (data->getSegOriginImgSize() != 0 && saveSeg == true) { + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->getSegOriginImgVec());//按规则为文件创建命名 + packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->getSegOriginImgVec());//打包数据 } //CLS原图 - if (data->clsOriginImgs.size() != 0 && saveCls == true) { - std::vectorfileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->clsOriginImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->clsOriginImgs);//打包数据 + if (data->getClsOriginImgSize() != 0 && saveCls == true) { + std::vectorfileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->getClsOriginImgVec());//按规则为文件创建命名 + packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->getClsOriginImgVec());//打包数据 } } QString resSavePath = _ImageSavePathFormatter.genPath(data, resImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 - if (saveRes == true) { + if (saveRes == true && data->getResultImgSize() != 0) { createDirectoryIfNotExists(resSavePath);//不存在此文件夹则创建 //结果图保存 - if (data->resultImgs.size() != 0) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->resultImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->resultImgs);//打包数据 - } + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->getResultImgVec());//按规则为文件创建命名 + packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->getResultImgVec());//打包数据 + } if (oriJob->imgQueue.size() != 0) - saveThread.addJob(oriJob); + getSaveThread()->addJob(oriJob); if (resJob->imgQueue.size() != 0) - saveThread.addJob(resJob, imgSaveThread::priority); + getSaveThread()->addJob(resJob, imgSaveThread::priority); } - catch (...) { - qDebug() << "存图崩溃 SN" << QString::fromStdString(data->SNcode) << " uuid" << data->uuid; + catch (cv::Exception& e) { + qCritical() << "打包存图崩溃 OpenCV异常: " << e.what() << " SN: " << QString::fromStdString(data->SNcode) << " uuid: " << data->uuid; + } catch (std::exception& e) { + qCritical() << "打包存图崩溃 标准异常: " << e.what() << " SN: " << QString::fromStdString(data->SNcode) << " uuid: " << data->uuid; + } catch (...) { + qCritical() << "打包存图崩溃 未知异常 SN: " << QString::fromStdString(data->SNcode) << " uuid: " << data->uuid; } } + imgSaveThread* getSaveThread() { + QMutexLocker locker(&saveThreadMutexVec); + for (auto& threadPtr : saveThreads) { + int threadbufferSize = threadPtr->getThreadBufferSize(); + if (threadbufferSize < GigaByte) { + return threadPtr.get(); + } + } + // 否则新建线程 + if (saveThreads.size() < maxSaveThreadCount) { + saveThreads.emplace_back(std::make_unique(saveThreads.size())); + qWarning() << "当前存图线程缓存均已超过1Gb,新建存图线程后当前线程数" << saveThreads.size(); + } + else { + qCritical() << "当前存图线程缓存均已超过1Gb,且已达最大线程数限制,继续使用最后一个存图线程,当前线程数" << saveThreads.size(); + } + return saveThreads.back().get(); + } private: + int maxSaveThreadCount = 8; + QMutex saveThreadMutexVec; + std::vector> saveThreads; bool saveOri = true, saveRes = true, saveSeg = true, saveCls = true; QElapsedTimer getParamTimer;//防止加锁次数过多导致卡顿 paramSyncManager* _paramSyncManager; ImageSavePathFormatter _ImageSavePathFormatter; - void packageData(QQueue>& jobQueue, std::string imgSavaPath, std::vector fileNames, std::vector& mats) { + void packageData(QQueue>& jobQueue, std::string imgSavaPath, const std::vector fileNames, const std::vector& mats) { if (fileNames.size() != mats.size()) qWarning() << "检测到存图文件名数量与图片数量不符"; @@ -344,7 +382,7 @@ private: jobQueue.enqueue(std::make_pair(imgSavaPath + fileNames[index], img)); } } - void packageData(QQueue>& jobQueue, std::string imgSavaPath, std::vector fileNames, std::vector>& mats) { + void packageData(QQueue>& jobQueue, std::string imgSavaPath, const std::vector fileNames, const std::vector>& mats) { if (fileNames.size() != mats.size()) qWarning() << "检测到存图文件名数量与图片数量不符"; diff --git a/src/core/service/missionResultHandle.h b/src/core/service/missionResultHandle.h index f1ec346..a28ca58 100644 --- a/src/core/service/missionResultHandle.h +++ b/src/core/service/missionResultHandle.h @@ -3,8 +3,9 @@ //为了更集中方便的展示检测结果到主页面 class missionResultHandle { public: - missionResultHandle(bSignalHub* qtBridgeIn){ + missionResultHandle(bSignalHub* qtBridgeIn, CsvWriter* _csvWriterIn){ qtBridge = qtBridgeIn; + _csvWriter = _csvWriterIn; } void toBarChart(std::string SN,bool isNG,std::vector defectAndNum) { if (isNG == false) { @@ -21,21 +22,6 @@ public: void addSqlData(QString snCode, std::map data) { _csvWriter->addData(snCode, data); } - void test() { - QThread::msleep(1000); - emit qtBridge->pieWidgetAddNG(); - emit qtBridge->pieWidgetAddOK(); - for (int i = 0; i < 100;i++) { - emit qtBridge->histogramWidgetAddData({ "我","想","下","班"}); - QThread::msleep(100); - } - emit qtBridge->histogramWidgetAddData({ "我想下班" }); - emit qtBridge->histogramWidgetAddData({ "我想下班z" }); - emit qtBridge->histogramWidgetAddData({ "我想下班zz" }); - emit qtBridge->histogramWidgetAddData({ "我想下班zzz" }); - emit qtBridge->histogramWidgetAddData({ "我想下班zzzz" }); - emit qtBridge->histogramWidgetAddData({ }); - } private: bSignalHub* qtBridge; CsvWriter* _csvWriter; diff --git a/src/cutImage/main.cpp b/src/cutImage/main.cpp index 0c3a822..18738ff 100644 --- a/src/cutImage/main.cpp +++ b/src/cutImage/main.cpp @@ -1,12 +1,39 @@ #include #include #include +#include +void readMat(const cv::Mat& m) { + for (int i = 0; i < 1000000; i++) { + if (m.data) { + volatile uchar x = m.data[0]; + } + } +} int main(int argc, char* argv[]) { + { + cv::Mat m = cv::Mat::ones(100, 100, CV_8UC1); + + auto f = std::async(std::launch::async, readMat, std::ref(m)); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + m.release(); + + f.get(); // Ï߳Ì join +} //rlj_hanyin("D:\\º¸ӡImage\\11.20\\T\\NG", "bmp", "./outputs/", cv::Size(300, 300)); //yuhan_hanqian("D:\\testImage\\OK", "bmp", "./outputs/" , cv::Size(300, 300)); // yuhan_hanqian("D:\\testImg\\L", "bmp", "./outputs/", cv::Size(50, 50)); + QDir dir; + dir.mkpath("D:\\testImagezzz\\xsaxaaa\\dddd\\1.txt"); cv::Mat img = cv::imread("D:\\testImage\\cutImageTest (2).bmp", -1); + + img.data = nullptr; + int size = 100; + uchar* buf = new uchar[size]; // Íⲿ¶ÑÄڴ棨Êֶ¯¹ÜÀí£© + cv::Mat m(10, 10, CV_8UC1, buf); + delete[] buf; + + m.release(); img(cv::Rect(1000, 1500, 2350, 1020)).copyTo(img); cv::Mat imgR = cv::imread("D:\\testImage\\cutImageTest (1).bmp", -1); std::vector> contours; diff --git a/src/mission/581-Mfd_djy_sd/581-Mfd.cpp b/src/mission/581-Mfd_djy_sd/581-Mfd.cpp deleted file mode 100644 index c1c5f96..0000000 --- a/src/mission/581-Mfd_djy_sd/581-Mfd.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Mfd.h> - -mission* createMission() { - return new _581_Mfd(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/581-Mfd_djy_sd/581-Mfd.h b/src/mission/581-Mfd_djy_sd/581-Mfd.h deleted file mode 100644 index 06ccbaf..0000000 --- a/src/mission/581-Mfd_djy_sd/581-Mfd.h +++ /dev/null @@ -1,170 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -static bool ShangDing(std::shared_ptr data, detParams* &_detParams, yh_581_address address){; - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - std::map sqlMapData; - sqlMapData["项目"] = "上钉"; - sqlMapData["相机"] = "相机" + address.triggerAddr; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1){ - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return false; - } - - cv::Mat Paint; - cv::Mat src1 = data->oriImgs[0]; - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - //处理算法 -#pragma region halcon处理 - QString singal_sign = address.triggerAddr; - int cameraNumberStr = 1; - if (singal_sign.contains("19000")) - cameraNumberStr = 2; - else if (singal_sign.contains("19200")) - cameraNumberStr = 3; - else if (singal_sign.contains("19400")) - cameraNumberStr = 4; - HalconCpp::HObject in_Image = MatToHObject(src1); - - HDevEngineCpp::HDevProcedure proc("_9_shangding"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_ProductionType", HTuple(0)); - procedureCall.SetInputCtrlParamTuple("in_CameraNumber", HTuple(cameraNumberStr)); - procedureCall.SetInputCtrlParamTuple("in_FilePath1", HTuple("./halconFiles/template/")); - procedureCall.SetInputCtrlParamTuple("in_FilePath2", HTuple("./halconFiles/base/")); - procedureCall.Execute(); - // *output(HTuple) : < / c> - // *out_Circle, 圆心坐标(y, x, radius) < / c > - // * out_Flag, 算法执行成功标志位, 0 : 算法执行失败 1 : 算法执行成功< / c> - // *out_OffsetX : 模组X轴的补偿量(mm) < / c > - // *out_OffsetY : 模组Y轴的补偿量(mm) < / c > - HTuple out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_OffsetX = procedureCall.GetOutputCtrlParamTuple("out_OffsetX"); - HTuple out_OffsetY = procedureCall.GetOutputCtrlParamTuple("out_OffsetY"); - HTuple out_ErrInfo = procedureCall.GetOutputCtrlParamTuple("out_ErrInfo"); -#pragma endregion - int outFlag = out_Flag.D(); - qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera::放钉" << "_SN::" << QString::fromStdString(data->SNcode) << ",放钉算法结果;" << out_Flag[0].D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - if (outFlag == 1) { //-1为失败,无结果 - //先处理数据 - double offsetX; - double offsetY; - offsetX = 0 - out_OffsetX.D(); - offsetY = 0 - out_OffsetY.D(); - //if (singal_sign.contains("18800")) - // offsetX -= 0.2; - //else if (singal_sign.contains("19000")) { - // offsetX -= 0.15; - // offsetY += 0.1; - //} - //else if (singal_sign.contains("19400")) { - // offsetY -= 0.2; - //} - - if (abs(offsetX) >= 6000 || abs(offsetY) >= 6000){ - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - qDebug() << __FUNCTION__ << " line:" << __LINE__ << " 放钉X偏移abs(resultData[0]) >= 6000,may err,set 0"; - data->halconOK = false; - } - else { - sqlMapData["偏移X"] = offsetX; - sqlMapData["偏移Y"] = offsetY; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(offsetX));//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(offsetY));//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - data->halconOK = true; - } - //圆及十字 - cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 20); - cv::line(Paint, cv::Point(out_Circle[1].D() - 300, out_Circle[0].D()), cv::Point(out_Circle[1].D() + 300, out_Circle[0].D()), cv::Scalar(0, 255, 0), 15); - cv::line(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D() - 300), cv::Point(out_Circle[1].D(), out_Circle[0].D() + 300), cv::Scalar(0, 255, 0), 15); - - textPainter.putText(Paint, "X偏移:" + std::to_string(offsetX), cv::Point(50, 150), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "Y偏移:" + std::to_string(offsetY), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "相机:" + std::to_string(cameraNumberStr), cv::Point(50, 0), cv::Scalar(0, 255, 0)); - - - } - else{ - data->halconOK = false; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); - } - - if (data->halconOK == true){ - textPainter.putText(Paint, "OK", cv::Point(50, 550), cv::Scalar(0, 255, 0)); - sqlMapData["结果"] = "OK"; - } - else{ - textPainter.putText(Paint, "NG", cv::Point(50, 500), cv::Scalar(0, 0, 255)); - sqlMapData["结果"] = "NG"; - } - data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), sqlMapData); - data->resultImgs.push_back(Paint); - return data->halconOK; -} -#pragma endregion - -class _581_Mfd : public mission { -public: - _581_Single_triggerTemplate< detParams> djy_1; - _581_Single_triggerTemplate< detParams> djy_2; - _581_Single_triggerTemplate< detParams> djy_3; - _581_Single_triggerTemplate< detParams> djy_4; - - _581_Single_triggerTemplate< detParams> sd_1; - _581_Single_triggerTemplate< detParams> sd_2; - _581_Single_triggerTemplate< detParams> sd_3; - _581_Single_triggerTemplate< detParams> sd_4; - - detParams _detParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - djy_1.init("Camera1", "电解液1", 18000, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - djy_2.init("Camera2", "电解液2", 18200, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - djy_3.init("Camera3", "电解液3", 18400, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - djy_4.init("Camera4", "电解液4", 18600, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - - sd_1.init("Camera5", "上钉1", 18800, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - sd_2.init("Camera6", "上钉2", 19000, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - sd_3.init("Camera7", "上钉3", 19200, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); - sd_4.init("Camera8", "上钉4", 19400, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); -#pragma endregion - return true; - } - void reloadAlgo(QByteArray& byteArray) { - - } - -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.cpp b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.cpp deleted file mode 100644 index c1c5f96..0000000 --- a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Mfd.h> - -mission* createMission() { - return new _581_Mfd(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h deleted file mode 100644 index e6aa369..0000000 --- a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h +++ /dev/null @@ -1,341 +0,0 @@ -#include -#include -class mfd_detParams { -public: - int biaoding = 0; -}; -#pragma region 算法 -#include -#include -#include -void exceptionResume(std::shared_ptr data, mfd_detParams* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 100); - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.01");//结果反馈 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.01");//结果反馈 -} -using namespace HDevEngineCpp; -static bool ManHan(std::shared_ptr data, mfd_detParams* _detParams, yh_581_address address){ - try { - data->service->_triggerManager->writeFloat("D100_1,2,3,4,5,6,7,8,9,9"); - std::map sqlMapData; - sqlMapData["项目"] = "满焊"; - sqlMapData["相机"] = "相机" + address.triggerAddr; - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - cv::Mat Paint; - cv::Mat src1 = data->oriImgs[0]; - - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - //处理算法 -#pragma region halcon处理 - std::string cameraNumberStr = "1", FixtureNumber = "1"; - - if (address.triggerAddr == 20000) { - cameraNumberStr = "1"; - FixtureNumber = "1"; - } - else if (address.triggerAddr == 20002) { - cameraNumberStr = "1"; - FixtureNumber = "2"; - } - else if (address.triggerAddr == 20200) { - cameraNumberStr = "2"; - FixtureNumber = "3"; - } - else if (address.triggerAddr == 20202) { - cameraNumberStr = "2"; - FixtureNumber = "4"; - } - else if (address.triggerAddr == 20400) { - cameraNumberStr = "3"; - FixtureNumber = "5"; - } - else if (address.triggerAddr == 20402) { - cameraNumberStr = "3"; - FixtureNumber = "6"; - } - else if (address.triggerAddr == 20600) { - cameraNumberStr = "4"; - FixtureNumber = "7"; - } - else if (address.triggerAddr == 20602) { - cameraNumberStr = "4"; - FixtureNumber = "8"; - } - data->customPath = QString::fromStdString("{imgSaveRootDir}/{yyyy-MM-dd}/{saveObjectName}{imageType}/{HH}H/{processResult}/相机" + cameraNumberStr + "孔" + FixtureNumber + "/"); - HalconCpp::HObject in_Image = MatToHObject(src1); - HDevEngineCpp::HDevProcedure proc("_9_manhan"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_ProductionType", _detParams->biaoding); - procedureCall.SetInputCtrlParamTuple("in_CameraNumber", HTuple(cameraNumberStr.c_str())); - procedureCall.SetInputCtrlParamTuple("in_FixtureNumber", HTuple(FixtureNumber.c_str())); - procedureCall.SetInputCtrlParamTuple("in_FilePath1", HTuple("./halconFiles/template_manHan/")); - procedureCall.SetInputCtrlParamTuple("in_FilePath2", HTuple("./halconFiles/base_manHan/")); - procedureCall.Execute(); - // *output(HTuple) : < / c> - // *out_Circle, 圆心坐标(y, x, radius) < / c > - // * out_Flag, 算法执行成功标志位, 0 : 算法执行失败 1 : 算法执行成功< / c> - // *out_OffsetX : 模组X轴的补偿量(mm) < / c > - // *out_OffsetY : 模组Y轴的补偿量(mm) < / c > - HTuple out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_OffsetX = procedureCall.GetOutputCtrlParamTuple("out_OffsetX"); - HTuple out_OffsetY = procedureCall.GetOutputCtrlParamTuple("out_OffsetY"); -#pragma endregion - int outFlag = out_Flag.D(); - //qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera::放钉" << "_SN::" << SN << ",放钉算法结果;" << out_Flag[0].D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - textPainter.putText(Paint, "相机:" + cameraNumberStr + " 孔" + FixtureNumber, cv::Point(50, 0), cv::Scalar(0, 255, 0)); - if (outFlag == 1) { //-1为失败,无结果 - //先处理数据 - double offsetX = 0 - out_OffsetX.D() * 1000;//和激光交流后要求我们*1000 - double offsetY = 0 - out_OffsetY.D() * 1000; - double X_Circle = out_Circle[1].D(); - double Y_Circle = out_Circle[0].D(); - - - if (abs(offsetX) >= 6000 || abs(offsetY) >= 6000) - { - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - qDebug() << __FUNCTION__ << " line:" << __LINE__ << " 满焊X偏移abs(resultData[0]) >= 6000,may err,set 0"; - data->halconOK = false; - } - else { - sqlMapData["偏移X"] = offsetX; - sqlMapData["偏移Y"] = offsetY; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(offsetX));//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(offsetY));//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - data->halconOK = true; - } - //圆及十字 - cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 20); - cv::line(Paint, cv::Point(out_Circle[1].D() - 300, out_Circle[0].D()), cv::Point(out_Circle[1].D() + 300, out_Circle[0].D()), cv::Scalar(0, 255, 0), 15); - cv::line(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D() - 300), cv::Point(out_Circle[1].D(), out_Circle[0].D() + 300), cv::Scalar(0, 255, 0), 15); - - textPainter.putText(Paint, "X偏移:" + std::to_string(offsetX), cv::Point(50, 150), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "Y偏移:" + std::to_string(offsetY), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - //textPainter.putText(Paint, "圆心X坐标:" + std::to_string(X_Circle), cv::Point(50, 150), cv::Scalar(0, 255, 0)); - //textPainter.putText(Paint, "圆心Y坐标:" + std::to_string(offsetY), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - - - } - else { - data->halconOK = false; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); - } - - if (data->halconOK == true) { - textPainter.putText(Paint, "OK", cv::Point(50, 550), cv::Scalar(0, 255, 0)); - sqlMapData["结果"] = "OK"; - } - else { - textPainter.putText(Paint, "NG", cv::Point(50, 500), cv::Scalar(0, 0, 255)); - sqlMapData["结果"] = "NG"; - } - data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), sqlMapData); - data->resultImgs.push_back(Paint); - - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "异常"); -} -static bool YuHan(std::shared_ptr data, mfd_detParams* _detParams, yh_581_address address){ - try { - data->service->_missionResultHandle->toBarChart("", true, {"测试"}); - //data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "123", 123); - std::map sqlMapData; - sqlMapData["项目"] = "预焊"; - sqlMapData["相机"] = "相机" + address.triggerAddr; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - cv::Mat Paint; - cv::Mat src1 = data->oriImgs[0]; - //src1 = cv::imread("D://ceshi/15H/1/333.bmp",-1); - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - //处理算法 -#pragma region halcon处理 - std::string cameraNumberStr = "1", FixtureNumber = "1"; - if (address.triggerAddr == 19600) { - cameraNumberStr = "1"; - FixtureNumber = "1"; - } - else if (address.triggerAddr == 19602) { - cameraNumberStr = "1"; - FixtureNumber = "3"; - } - else if (address.triggerAddr == 19800) { - cameraNumberStr = "2"; - FixtureNumber = "2"; - } - else if (address.triggerAddr == 19802) { - cameraNumberStr = "2"; - FixtureNumber = "4"; - } - data->SNcode = "相机" + cameraNumberStr + "孔" + FixtureNumber + "_" + data->SNcode; - HDevEngineCpp::HDevProcedure proc("_9_yuhan"); - HalconCpp::HObject in_Image = MatToHObject(src1); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_ProductionType", 0); - procedureCall.SetInputCtrlParamTuple("in_Resolution", HTuple(0.0069699)); - procedureCall.SetInputCtrlParamTuple("in_CameraNumber", HTuple(cameraNumberStr.c_str())); - procedureCall.SetInputCtrlParamTuple("in_FixtureNumber", HTuple(FixtureNumber.c_str())); - procedureCall.SetInputCtrlParamTuple("in_FilePath1", HTuple("./halconFiles/template_yuhan/")); - procedureCall.SetInputCtrlParamTuple("in_FilePath2", HTuple("./halconFiles/base_yuhan/")); - procedureCall.SetInputCtrlParamTuple("in_NailType", 1);//1:平钉 2:凹钉; - procedureCall.Execute(); - // *output(HTuple) : < / c> - // *out_Circle, 圆心坐标(y, x, radius) < / c > - // * out_Flag, 算法执行成功标志位, 0 : 算法执行失败 1 : 算法执行成功< / c> - // *out_OffsetX : 模组X轴的补偿量(mm) < / c > - // *out_OffsetY : 模组Y轴的补偿量(mm) < / c > - HTuple out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_OffsetX = procedureCall.GetOutputCtrlParamTuple("out_OffsetX"); - HTuple out_OffsetY = procedureCall.GetOutputCtrlParamTuple("out_OffsetY"); -#pragma endregion - int outFlag = out_Flag.D(); - //qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera::放钉" << "_SN::" << SN << ",放钉算法结果;" << out_Flag[0].D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - textPainter.putText(Paint, "相机:" + cameraNumberStr + " 孔位" + FixtureNumber, cv::Point(50, 0), cv::Scalar(0, 255, 0)); - if (outFlag == 1) { //-1为失败,无结果 - double offsetX = out_OffsetX.D(); - double offsetY = out_OffsetY.D(); - //if (address.triggerAddr == 19600) - // offsetX -= 0.2; - //else if (address.triggerAddr == 19602) { - // offsetX -= 0.15; - // offsetY += 0.1; - //} - //else (address.triggerAddr == 19800) { - // offsetY -= 0.2; - //} - if (abs(offsetX) >= 6000 || abs(offsetY) >= 6000) { - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - qDebug() << __FUNCTION__ << " line:" << __LINE__ << " 预焊X偏移abs(resultData[0]) >= 6000,may err,set 0"; - data->halconOK = false; - } - else { - sqlMapData["偏移X"] = offsetX; - sqlMapData["偏移Y"] = offsetY; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(offsetX));//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(offsetY));//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - data->halconOK = true; - } - //圆及十字 - cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 20); - cv::line(Paint, cv::Point(out_Circle[1].D() - 300, out_Circle[0].D()), cv::Point(out_Circle[1].D() + 300, out_Circle[0].D()), cv::Scalar(0, 255, 0), 15); - cv::line(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D() - 300), cv::Point(out_Circle[1].D(), out_Circle[0].D() + 300), cv::Scalar(0, 255, 0), 15); - - textPainter.putText(Paint, "X偏移:" + std::to_string(offsetX), cv::Point(50, 150), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "Y偏移:" + std::to_string(offsetY), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - - textPainter.putText(Paint, "圆心坐标X:" + std::to_string(out_Circle[1].D()), cv::Point(50, 750), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "圆心坐标Y:" + std::to_string(out_Circle[0].D()), cv::Point(50, 950), cv::Scalar(0, 255, 0)); - } - else { - data->halconOK = false; - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");//发送偏移X - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");//发送偏移Y - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送结果 - textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); - } - - if (data->halconOK == true) { - textPainter.putText(Paint, "OK", cv::Point(50, 550), cv::Scalar(0, 255, 0)); - sqlMapData["结果"] = "OK"; - } - else { - textPainter.putText(Paint, "NG", cv::Point(50, 500), cv::Scalar(0, 0, 255)); - sqlMapData["结果"] = "NG"; - } - data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), sqlMapData); - data->resultImgs.push_back(Paint); - - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "异常"); -} -#pragma endregion -class _581_Mfd : public mission { -public: - _581_Single_triggerTemplate< mfd_detParams> yh_1; - _581_Single_triggerTemplate< mfd_detParams> yh_2; - - _581_Single_triggerTemplate< mfd_detParams> mh_1; - _581_Single_triggerTemplate< mfd_detParams> mh_2; - _581_Single_triggerTemplate< mfd_detParams> mh_3; - _581_Single_triggerTemplate< mfd_detParams> mh_4; - - _581_Union_triggerTemplate< detParams> hh_2D; - _581_Union_triggerTemplate< detParams> hh_3D; - - mfd_detParams _params; - - detParams _detParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - yh_1.init("Camera1", "预焊1", 19600, 2, 1, &_params, _serviceManager, bridge, YuHan, "预焊CCD"); - yh_2.init("Camera2", "预焊2", 19800, 2, 1, &_params, _serviceManager, bridge, YuHan, "预焊CCD"); - - mh_1.init("Camera3", "满焊1", 20000, 2, 1, &_params, _serviceManager, bridge, ManHan, "满焊CCD"); - mh_2.init("Camera4", "满焊2", 20200, 2, 1, &_params, _serviceManager, bridge, ManHan, "满焊CCD"); - mh_3.init("Camera5", "满焊3", 20400, 2, 1, &_params, _serviceManager, bridge, ManHan, "满焊CCD"); - mh_4.init("Camera6", "满焊4", 20600, 2, 1, &_params, _serviceManager, bridge, ManHan, "满焊CCD"); - - hh_2D.init("Camera7", "焊后2d", 20800, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest, "焊后CCD"); - hh_3D.init("Camera8", "焊后3d", 21000, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest, "焊后CCD"); -#pragma endregion - return true; - } - - - //9600 - -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h b/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h deleted file mode 100644 index be2cd91..0000000 --- a/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h +++ /dev/null @@ -1,2903 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// File generated by HDevelop for HALCON/C++ Version 18.05.0.1 -/////////////////////////////////////////////////////////////////////////////// - - -# include "HalconCpp.h" -//# include "HDevThread.h" -//#ifndef __APPLE__ -//# include "HalconCpp.h" -//# include "HDevThread.h" -//# if defined(__linux__) && !defined(__arm__) && !defined(NO_EXPORT_APP_MAIN) -//# include -//# endif -//#else -//# ifndef HC_LARGE_IMAGES -//# include -//# include -//# else -//# include -//# include -//# endif -//# include -//# include -//# include -//#endif -// - - -using namespace HalconCpp; - -// Procedure declarations -// External procedures -void cal_distanceJiao_4 (HObject ho_in_image, HTuple hv_in_ProductType, HTuple *hv_out_standardPar, - HTuple *hv_out_Flag, HTuple *hv_out_disLeftVertical, HTuple *hv_out_LeftVerticalLinePar, - HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, HTuple *hv_out_disRightVertical, - HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar); -void cal_left_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, - HObject ho_LeftContour, HTuple hv_in_ProductType, HTuple *hv_out_disLeftVertical, - HTuple *hv_out_LeftVerticalLinePar, HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, - HTuple *hv_out_standardPar, HTuple *hv_out_Flag); -void cal_Right_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, - HObject ho_RightXLD, HTuple hv_in_ProductType, HTuple *hv_out_disRightVertical, - HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar, - HTuple *hv_out_standardPar, HTuple *hv_out_Flag); -// Chapter: Graphics / Text -// Short Description: This procedure writes a text message. -void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem, - HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box); -// Chapter: XLD / Creation -// Short Description: Creates an arrow shaped XLD contour. -void gen_arrow_contour_xld (HObject *ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, - HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth); -void Get_Rectangle2_Corner_new (HObject ho_Rectangle, HTuple *hv_out_Row, HTuple *hv_out_Col); -// Chapter: File / Misc -// Short Description: Get all image files under the given path -void list_image_files (HTuple hv_ImageDirectory, HTuple hv_Extensions, HTuple hv_Options, - HTuple *hv_ImageFiles); -// Chapter: File / Misc -// Short Description: Parse a filename into directory, base filename, and extension -void parse_filename (HTuple hv_FileName, HTuple *hv_BaseName, HTuple *hv_Extension, - HTuple *hv_Directory); -void pts_to_best_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Cols, HTuple hv_ActiveNum, - HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2); -void pts_to_smooth_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Columns, HTuple hv_ActiveNum, - HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2); -void rake (HObject ho_Image, HObject *ho_Regions, HTuple hv_Elements, HTuple hv_DetectHeight, - HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold, HTuple hv_Transition, - HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, HTuple hv_Column2, - HTuple *hv_ResultRow, HTuple *hv_ResultColumn); -// Chapter: Graphics / Text -// Short Description: Set font independent of OS -void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold, - HTuple hv_Slant); - -// Procedures -// External procedures -void cal_distanceJiao_4 (HObject ho_in_image, HTuple hv_in_ProductType, HTuple *hv_out_standardPar, - HTuple *hv_out_Flag, HTuple *hv_out_disLeftVertical, HTuple *hv_out_LeftVerticalLinePar, - HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, HTuple *hv_out_disRightVertical, - HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar) -{ - - // Local iconic variables - HObject ho_ImageCleared, ho_ImageSub, ho_Region3; - HObject ho_RegionOpening, ho_ConnectedRegions3, ho_RegionFillUp; - HObject ho_RegionOpening2, ho_ConnectedRegions1, ho_SelectedRegions3; - HObject ho_Partitioned, ho_SelectedRegions4, ho_RegionUnion1; - HObject ho_RegionMoved4, ho_Region1, ho_RegionMoved5, ho_Region; - HObject ho_RegionLines4, ho_RegionDilation5, ho_RegionDifference5; - HObject ho_ConnectedRegions6, ho_ProductRegion, ho_RegionDifference2; - HObject ho_RegionOpening1, ho_RegionLines2, ho_RegionDilation3; - HObject ho_RegionDifference3, ho_ConnectedRegions4, ho_SelectedRegions5; - HObject ho_RegionTrans, ho_RegionBorder, ho_Skeleton, ho_Contours1; - HObject ho_SmoothedContours, ho_ContoursSplit, ho_LineContour1; - HObject ho_LineContour, ho_LeftXLD, ho_LeftContour, ho_RegionLines3; - HObject ho_Contour1, ho_RegionDilation4, ho_RegionDifference4; - HObject ho_ConnectedRegions5, ho_SelectedRegions, ho_GlueRegions; - HObject ho_ImageReduced4, ho_ImageCleared1, ho_ImageSub1; - HObject ho_Region4, ho_RegionClosing1, ho_ConnectedRegions7; - HObject ho_SelectedRegions7, ho_Partitioned1, ho_SelectedRegions8; - HObject ho_WhiteRegion, ho_RightXLD, ho_RegionClosing2; - HObject ho_ConnectedRegions; - - // Local control variables - HTuple hv_Debug, hv_Gray, hv_clipHeight, hv_sel_Gray; - HTuple hv_sel_smallGray, hv_XLD_Lenth, hv_Width, hv_Height; - HTuple hv_W, hv_Number1, hv_Area1, hv_Row4, hv_Column4; - HTuple hv_RowBegin, hv_ColBegin, hv_RowEnd, hv_ColEnd; - HTuple hv_Nr, hv_Nc, hv_Dist, hv_row, hv_col, hv_k, hv_b; - HTuple hv_Row1, hv_Col1, hv_areaValue, hv_W1, hv_H1, hv_Value; - HTuple hv_out_standardPar1, hv_out_Flag1, hv_Number, hv_out_standardPar2; - HTuple hv_out_Flag2, hv_Exception; - - - - - (*hv_out_standardPar) = HTuple(); - (*hv_out_Flag) = 1; - - //×ó±ßÊúֱ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óֵ¡¿ ¸ߡ¾×îСֵ£¬×î´óֵ¡¿ ¡¾¾àÀë¶þ×îСֵ£¬¾àÀë¶þ×î´óֵ£¬¾àÀëһ×îСֵ£¬¾àÀëһ×î´óֵ¡¿ - (*hv_out_disLeftVertical) = HTuple(); - (*hv_out_LeftVerticalLinePar) = HTuple(); - //×ó±ßˮƽ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óֵ¡¿ ¸ߡ¾×îСֵ£¬×î´óֵ¡¿ ¡¾¾àÀëÈý×îСֵ£¬¾àÀëÈý×î´óֵ£¬¾àÀëËÄ×îСֵ£¬¾àÀëËÄ×î´óֵ¡¿ - (*hv_out_disLeftLevel) = HTuple(); - (*hv_out_LeftLevelLinePar) = HTuple(); - - //ÓұßÊúֱ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óֵ¡¿ ¸ߡ¾×îСֵ£¬×î´óֵ¡¿ ¡¾¾àÀëÁù×îСֵ£¬¾àÀëÁù×î´óֵ£¬¾àÀëÎå×îСֵ£¬¾àÀëÎå×î´óֵ¡¿ - (*hv_out_disRightVertical) = HTuple(); - (*hv_out_RightVerticalLinePar) = HTuple(); - - //Óұßˮƽ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óֵ¡¿ ¸ߡ¾×îСֵ£¬×î´óֵ¡¿ ¡¾¾àÀëÆß×îСֵ£¬¾àÀëÆß×î´óֵ£¬¾àÀë°Ë×îСֵ£¬¾àÀë°Ë×î´óֵ¡¿ - (*hv_out_disRightLevel) = HTuple(); - (*hv_out_RightLevelLinePar) = HTuple(); - - if (HDevWindowStack::IsOpen()) - SetDraw(HDevWindowStack::GetActive(),"margin"); - hv_Debug = 1; - - //2024,05,24 V1.1 ºúºº±ø Ë㷨µ÷Õû×ó²àÀ¶ĤµĿí¶ȼÆËã. - // V1.2 ºúºº±ø »ùÓڲ»ͬµÄÏßÌå, µ÷Õû´úÂë. - //2025,04,17 v1.3 ÓŻ¯,µ÷Õû´úÂë - //2025,06,24 V1.4 - - if (0 != (hv_in_ProductType==HTuple("181-1"))) - { - hv_Gray = 60; - hv_clipHeight = 950; - hv_sel_Gray = 200; - hv_sel_smallGray = 210; - hv_XLD_Lenth = 100; - } - else if (0 != (hv_in_ProductType==HTuple("181-2"))) - { - //Gray := 70 - //clipHeight := 1000 - //sel_Gray := 215 - //sel_smallGray := 215 - //XLD_Lenth := 100 - hv_Gray = 60; - hv_clipHeight = 950; - hv_sel_Gray = 200; - hv_sel_smallGray = 210; - hv_XLD_Lenth = 100; - } - else if (0 != (hv_in_ProductType==HTuple("185-1"))) - { - hv_Gray = 40; - hv_clipHeight = 600; - hv_sel_Gray = 230; - hv_sel_smallGray = 210; - hv_XLD_Lenth = 200; - } - else if (0 != (hv_in_ProductType==HTuple("185-2"))) - { - //************************** - //ԭʼÊý¾ݣ¬±£Áô - hv_Gray = 50; - hv_clipHeight = 750; - hv_sel_Gray = 215; - hv_sel_smallGray = 195; - hv_XLD_Lenth = 200; - //***************************** - } - else if (0 != (hv_in_ProductType==HTuple("186-1"))) - { - hv_Gray = 40; - hv_clipHeight = 600; - hv_sel_Gray = 230; - hv_sel_smallGray = 215; - hv_XLD_Lenth = 200; - } - else if (0 != (hv_in_ProductType==HTuple("186-2"))) - { - hv_Gray = 40; - hv_clipHeight = 700; - hv_sel_Gray = 230; - hv_sel_smallGray = 200; - hv_XLD_Lenth = 400; - } - - //*********************************************************************** - try - { - GetImageSize(ho_in_image, &hv_Width, &hv_Height); - //step1: »ñȡ²øÈƵçоµÄÇøÓò. - GenImageProto(ho_in_image, &ho_ImageCleared, hv_Gray); - SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 5, -100); - Threshold(ho_ImageSub, &ho_Region3, 100, 255); - ClosingCircle(ho_Region3, &ho_RegionOpening, 25.5); - Connection(ho_RegionOpening, &ho_ConnectedRegions3); - FillUp(ho_ConnectedRegions3, &ho_RegionFillUp); - OpeningCircle(ho_RegionFillUp, &ho_RegionOpening2, 40.5); - Connection(ho_RegionOpening2, &ho_ConnectedRegions1); - SelectShapeStd(ho_ConnectedRegions1, &ho_SelectedRegions3, "max_area", 70); - RegionFeatures(ho_SelectedRegions3, "width", &hv_W); - PartitionRectangle(ho_SelectedRegions3, &ho_Partitioned, hv_W+10, 5); - SelectShape(ho_Partitioned, &ho_SelectedRegions4, "width", "and", (hv_W*0.5).TupleInt(), - hv_W+60); - Union1(ho_SelectedRegions4, &ho_RegionUnion1); - MoveRegion(ho_RegionUnion1, &ho_RegionMoved4, 0, 80); - Union2(ho_RegionUnion1, ho_RegionMoved4, &ho_Region1); - MoveRegion(ho_Region1, &ho_RegionMoved5, -5, 0); - Union2(ho_Region1, ho_RegionMoved5, &ho_Region); - - //¸ô¦²úƷµÄRegion½øÐвÃÇÐ, - //²ÎÊý1:²úƷµIJÃÇÐλÖÃ, clipHeight:=200 - GenRegionLine(&ho_RegionLines4, hv_Height-hv_clipHeight, 0, hv_Height-hv_clipHeight, - hv_Width); - DilationRectangle1(ho_RegionLines4, &ho_RegionDilation5, 1, 30); - Difference(ho_Region, ho_RegionDilation5, &ho_RegionDifference5); - Connection(ho_RegionDifference5, &ho_ConnectedRegions6); - //²úƷµÄͼÏñ,×óÉϺÍÓÒÉϵĵã, ÓÃÓڶ¨λrow×ø±ê. - SelectShapeStd(ho_ConnectedRegions6, &ho_ProductRegion, "max_area", 70); - //dev_display (in_image) - //dev_display (ProductRegion) - //stop () - //*********************************************************************** - - //*********************************************************************** - //step2£º »ñȡ²úƷ¹¤װµıßԵÂÖÀª, ÓÃÓڲÃÇÐ×óÓҲàµÄͼÏñ, - Difference(ho_SelectedRegions3, ho_Region, &ho_RegionDifference2); - ClosingCircle(ho_RegionDifference2, &ho_RegionOpening1, 200.5); - //dev_display (in_image) - //dev_display (RegionOpening1) - //³¢ÊԽ«ͼÏñ½øÐзָî, »ñȡеÄÌØÕ÷µã - GenRegionLine(&ho_RegionLines2, 520, 0, 520, hv_Width-1); - DilationRectangle1(ho_RegionLines2, &ho_RegionDilation3, 1, 10); - Difference(ho_RegionOpening1, ho_RegionLines2, &ho_RegionDifference3); - Connection(ho_RegionDifference3, &ho_ConnectedRegions4); - SelectShapeStd(ho_ConnectedRegions4, &ho_SelectedRegions5, "max_area", 70); - - ShapeTrans(ho_SelectedRegions5, &ho_RegionTrans, "inner_rectangle1"); - Boundary(ho_RegionTrans, &ho_RegionBorder, "inner"); - Skeleton(ho_RegionBorder, &ho_Skeleton); - GenContoursSkeletonXld(ho_Skeleton, &ho_Contours1, 1, "filter"); - SmoothContoursXld(ho_Contours1, &ho_SmoothedContours, 5); - //½«ÂÖÀª½øÐÐÇиî, »ñȡÊúֱÂÖÀª£¬ - SegmentContoursXld(ho_SmoothedContours, &ho_ContoursSplit, "lines", 10, 10, 4); - SelectContoursXld(ho_ContoursSplit, &ho_LineContour1, "direction", 1.3+3.1415, - 1.75+3.1415, -0.5, 0.5); - SelectContoursXld(ho_LineContour1, &ho_LineContour1, "contour_length", hv_XLD_Lenth, - 99999, -0.5, 0.5); - //¸ô¦½øÐб£»¤, ½«ÁٽüµÄÏ߽øÐÐÁ¬½Ó, - UnionAdjacentContoursXld(ho_LineContour1, &ho_LineContour, 1000, 10, "attr_keep"); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_LineContour1, HDevWindowStack::GetActive()); - //stop () - } - CountObj(ho_LineContour, &hv_Number1); - if (0 != (hv_Number1!=2)) - { - return; - } - //*********************************************************************** - - //*********************************************************************** - //step3: Ë㷨»ñȡ×ó²àÀ¦½ºµĶ¨λµã, - AreaCenterPointsXld(ho_LineContour, &hv_Area1, &hv_Row4, &hv_Column4); - SelectShapeXld(ho_LineContour, &ho_LeftXLD, "column_points", "and", (hv_Column4.TupleMin())-1, - (hv_Column4.TupleMin())+1); - FitLineContourXld(ho_LeftXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, - &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist); - if (0 != ((hv_ColEnd-hv_ColBegin)==0)) - { - hv_row = hv_Height+400; - hv_col = hv_ColBegin; - } - else - { - //Éú³ÉֱÏ߷½³Ì, ÓÃÓڻñȡȱÏݵÄ - hv_k = (hv_RowEnd-hv_RowBegin)/(hv_ColEnd-hv_ColBegin); - hv_b = hv_RowBegin-(hv_k*hv_ColBegin); - hv_row = hv_Height+400; - hv_col = (hv_row-hv_b)/hv_k; - } - if (0 != (hv_RowBegin>hv_RowEnd)) - { - hv_Row1 = hv_RowEnd; - hv_Col1 = hv_ColEnd; - } - else - { - hv_Row1 = hv_RowBegin; - hv_Col1 = hv_ColBegin; - } - GenContourPolygonXld(&ho_LeftContour, hv_Row1.TupleConcat(hv_row), (hv_Col1-30).TupleConcat(hv_col-30)); - GenRegionLine(&ho_RegionLines3, hv_RowEnd, hv_ColEnd-30, hv_row, hv_col-30); - //µ÷ÊÔÓÃ, ¹۲ì²âÊÔЧ¹û - if (0 != hv_Debug) - { - GenContourPolygonXld(&ho_Contour1, hv_RowEnd.TupleConcat(hv_row), hv_ColEnd.TupleConcat(hv_col)); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RegionLines3, HDevWindowStack::GetActive()); - } - DilationRectangle1(ho_RegionLines3, &ho_RegionDilation4, 50, 1); - Difference(ho_ProductRegion, ho_RegionDilation4, &ho_RegionDifference4); - Connection(ho_RegionDifference4, &ho_ConnectedRegions5); - SelectShape(ho_ConnectedRegions5, &ho_SelectedRegions, "area", "and", 9999, 999999999999999999); - RegionFeatures(ho_SelectedRegions, "area", &hv_areaValue); - //»ñȡÀ¦½ºÇøÓò(°üº¬µçо·¶Χ) - SelectShape(ho_SelectedRegions, &ho_GlueRegions, "area", "and", (hv_areaValue.TupleMin())-1, - (hv_areaValue.TupleMin())+1); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); - //stop () - } - if (HDevWindowStack::IsOpen()) - SetDraw(HDevWindowStack::GetActive(),"margin"); - ReduceDomain(ho_in_image, ho_GlueRegions, &ho_ImageReduced4); - //¸ô¦»ùÓڲ»ͬµIJúÏß, ¹۲첻ͬµĻҶÈ, ½øÐÐͳ¼Æ. - GenImageProto(ho_ImageReduced4, &ho_ImageCleared1, hv_sel_Gray); - SubImage(ho_ImageReduced4, ho_ImageCleared1, &ho_ImageSub1, 15, -100); - Threshold(ho_ImageSub1, &ho_Region4, 200, 255); - OpeningCircle(ho_Region4, &ho_RegionClosing1, 10.5); - Connection(ho_RegionClosing1, &ho_ConnectedRegions7); - SelectShapeStd(ho_ConnectedRegions7, &ho_SelectedRegions7, "max_area", 70); - //dev_display (in_image) - //dev_display (SelectedRegions7) - RegionFeatures(ho_SelectedRegions7, "width", &hv_W1); - RegionFeatures(ho_SelectedRegions7, "height", &hv_H1); - PartitionRectangle(ho_SelectedRegions7, &ho_Partitioned1, hv_W1+100, 4); - RegionFeatures(ho_Partitioned1, "width", &hv_Value); - SelectShape(ho_Partitioned1, &ho_SelectedRegions8, "width", "and", (hv_Value.TupleMax())-200, - (hv_Value.TupleMax())+10); - Union1(ho_SelectedRegions8, &ho_WhiteRegion); - //*********************************************************************** - //×Ӻ¯Êý:¼ÆËã×ó²àÀ¦½ºµľàÀë - cal_left_Distance(ho_in_image, ho_GlueRegions, ho_WhiteRegion, ho_LeftContour, - hv_in_ProductType, &(*hv_out_disLeftVertical), &(*hv_out_LeftVerticalLinePar), - &(*hv_out_disLeftLevel), &(*hv_out_LeftLevelLinePar), &hv_out_standardPar1, - &hv_out_Flag1); - if (0 != (hv_out_Flag1==1)) - { - return; - } - //*********************************************************************** - //step4: Ë㷨»ñȡÓҲàÀ¦½ºµĶ¨λµã, - //area_center_xld (LineContour, Area1, Row4, Column4, PointOrder) - //select_shape_xld (LineContour, RightXLD, 'column', 'and', max(Column4)-1, max(Column4)+1) - AreaCenterPointsXld(ho_LineContour, &hv_Area1, &hv_Row4, &hv_Column4); - SelectShapeXld(ho_LineContour, &ho_RightXLD, "column_points", "and", (hv_Column4.TupleMax())-1, - (hv_Column4.TupleMax())+1); - //dev_display (in_image) - //dev_display (RightXLD) - FitLineContourXld(ho_RightXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, - &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist); - if (0 != ((hv_ColEnd-hv_ColBegin)==0)) - { - hv_row = hv_Height-1; - hv_col = hv_ColEnd; - } - else - { - hv_k = (hv_RowEnd-hv_RowBegin)/(hv_ColEnd-hv_ColBegin); - hv_b = hv_RowBegin-(hv_k*hv_ColBegin); - hv_row = hv_Height+400; - hv_col = (hv_row-hv_b)/hv_k; - } - - if (0 != (hv_RowBegin>hv_RowEnd)) - { - hv_Row1 = hv_RowEnd; - hv_Col1 = hv_ColEnd; - } - else - { - hv_Row1 = hv_RowBegin; - hv_Col1 = hv_ColBegin; - } - - GenRegionLine(&ho_RegionLines3, hv_Row1, hv_Col1+30, hv_row, hv_col+30); - GenContourPolygonXld(&ho_RightXLD, hv_Row1.TupleConcat(hv_row), (hv_Col1+30).TupleConcat(hv_col+30)); - //µ÷ÊÔÓÃ, ¹۲ì²âÊÔЧ¹û - if (0 != hv_Debug) - { - //gen_contour_polygon_xld (Contour1, [RowBegin,row], [ColEnd,col]) - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RegionLines3, HDevWindowStack::GetActive()); - } - DilationRectangle1(ho_RegionLines3, &ho_RegionDilation4, 10, 1); - Difference(ho_ProductRegion, ho_RegionDilation4, &ho_RegionDifference4); - Connection(ho_RegionDifference4, &ho_ConnectedRegions5); - RegionFeatures(ho_ConnectedRegions5, "area", &hv_areaValue); - //»ñȡÀ¦½ºÇøÓò(°üº¬µçо·¶Χ) - SelectShape(ho_ConnectedRegions5, &ho_GlueRegions, "area", "and", (hv_areaValue.TupleMin())-1, - (hv_areaValue.TupleMin())+1); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); - //stop () - } - //************************************************** - //dev_set_draw ('margin') - ReduceDomain(ho_in_image, ho_GlueRegions, &ho_ImageReduced4); - GenImageProto(ho_ImageReduced4, &ho_ImageCleared1, hv_sel_smallGray); - SubImage(ho_ImageReduced4, ho_ImageCleared1, &ho_ImageSub1, 10, -100); - Threshold(ho_ImageSub1, &ho_Region4, 200, 255); - ClosingCircle(ho_Region4, &ho_RegionClosing2, 1.5); - OpeningCircle(ho_RegionClosing2, &ho_RegionClosing1, 10.5); - Connection(ho_RegionClosing1, &ho_ConnectedRegions7); - SelectShapeStd(ho_ConnectedRegions7, &ho_SelectedRegions7, "max_area", 70); - //dev_display (in_image) - //dev_display (SelectedRegions7) - RegionFeatures(ho_SelectedRegions7, "width", &hv_W1); - RegionFeatures(ho_SelectedRegions7, "height", &hv_H1); - PartitionRectangle(ho_SelectedRegions7, &ho_Partitioned1, hv_W1+100, 4); - RegionFeatures(ho_Partitioned1, "width", &hv_Value); - SelectShape(ho_Partitioned1, &ho_SelectedRegions8, "width", "and", (hv_Value.TupleMax())-250, - (hv_Value.TupleMax())+10); - Union1(ho_SelectedRegions8, &ho_WhiteRegion); - Connection(ho_WhiteRegion, &ho_ConnectedRegions); - CountObj(ho_ConnectedRegions, &hv_Number); - if (0 != (hv_Number>1)) - { - Union1(ho_ConnectedRegions, &ho_WhiteRegion); - //select_shape_std (ConnectedRegions, WhiteRegion, 'max_area', 70) - } - //¿¼ÂÇ: ÓÉÓڻҽײ»ͳһ, µ¼Ö°×ɫĤÇøÓòûÓÐÌáȡÍêȫ, ¿¼ÂǽøÐÐÓŻ¯; - - //×Ӻ¯Êý: ¼ÆËãÓҲàÏߵľàÀë, - cal_Right_Distance(ho_in_image, ho_GlueRegions, ho_WhiteRegion, ho_RightXLD, - hv_in_ProductType, &(*hv_out_disRightVertical), &(*hv_out_RightVerticalLinePar), - &(*hv_out_disRightLevel), &(*hv_out_RightLevelLinePar), &hv_out_standardPar2, - &hv_out_Flag2); - int fflag1 = hv_out_Flag1.D(), fflag2 = hv_out_Flag2.D(); - if (0 != (hv_out_Flag2==1)) - { - return; - } - - - - if (0 != (HTuple(HTuple(HTuple(hv_out_Flag1==0).TupleAnd(hv_out_Flag2==0)).TupleAnd((hv_out_standardPar1.TupleLength())==8)).TupleAnd((hv_out_standardPar2.TupleLength())==8))) - { - //Êý¾ݽøÐлã×Ü, - (*hv_out_Flag) = 0; - (*hv_out_standardPar).Clear(); - (*hv_out_standardPar).Append(hv_out_standardPar1); - (*hv_out_standardPar).Append(hv_out_standardPar2); - } - //*********************************************************************** - } - // catch (Exception) - catch (HException &HDevExpDefaultException) - { - HDevExpDefaultException.ToHTuple(&hv_Exception); - std::string str = hv_Exception.ToString(); - } - return; -} - -void cal_left_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, - HObject ho_LeftContour, HTuple hv_in_ProductType, HTuple *hv_out_disLeftVertical, - HTuple *hv_out_LeftVerticalLinePar, HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, - HTuple *hv_out_standardPar, HTuple *hv_out_Flag) -{ - - // Local iconic variables - HObject ho_RegionMoved, ho_RegionTrans, ho_RegionDilation; - HObject ho_ImageReduced, ho_ImageEmphasize, ho_Cross, ho_Cross1; - HObject ho_Cross2, ho_Cross3, ho_Regions1, ho_L_Line1, ho_Regions2; - HObject ho_L_Line2, ho_Line, ho_Contour2, ho_V_Regions2; - HObject ho_V_Line2, ho_V_Regions1, ho_V_Line1, ho_Rectangle; - HObject ho_ImageReduced1, ho_EdgeAmplitude, ho_ImageAbs; - HObject ho_ImageScaled, ho_Region, ho_RegionClosing, ho_ConnectedRegions; - HObject ho_SelectedRegions1, ho_ObjectSelected, ho_RegionTrans1; - HObject ho_L_Regions3, ho_L_Line3, ho_Rectangle1, ho_ImageCleared; - HObject ho_ImageSub, ho_ImageGauss, ho_RegionIntersection; - HObject ho_RegionLines1, ho_RegionLines2, ho_Cross5, ho_Cross6; - HObject ho_Contour, ho_Region1, ho_ImageReduced2, ho_EdgeAmplitude1; - HObject ho_ImageAbs1, ho_ImageScaled1, ho_SelectedRegions; - HObject ho_V_Regions3, ho_V_Line3; - - // Local control variables - HTuple hv_Debug, hv_Newtuple, hv_clip_Row1, hv_clip_Row2; - HTuple hv_clip_Row, hv_insideRow, hv_insideCol, hv_outsideRow; - HTuple hv_outsideCol, hv_L_ResultRow1, hv_L_ResultColumn1; - HTuple hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, hv_L_ResultRow2; - HTuple hv_L_ResultColumn2, hv_L_Row2, hv_L_Col2, hv_L_Row22; - HTuple hv_L_Col22, hv_ResultRow2, hv_ResultColumn2, hv_Row11; - HTuple hv_Column11, hv_Row21, hv_Column21, hv_Angle, hv_k; - HTuple hv_b, hv_row, hv_col, hv_V_ResultRow2, hv_V_ResultColumn2; - HTuple hv_V_Row2, hv_V_Col2, hv_V_Row22, hv_V_Col22, hv_V_ResultRow1; - HTuple hv_V_ResultColumn1, hv_V_Row1, hv_V_Column1, hv_V_Row11; - HTuple hv_V_Column11, hv_Value, hv_Value1, hv_Indices; - HTuple hv_Symbol, hv_index1, hv_N, hv_X, hv_Row, hv_Col; - HTuple hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row3; - HTuple hv_L_Column3, hv_L_Row33, hv_L_Column33, hv_Row12; - HTuple hv_Column12, hv_Row22, hv_Column22, hv_Mean, hv_Deviation; - HTuple hv_Row1, hv_Column1, hv_IsOverlapping, hv_Row2; - HTuple hv_Column2, hv_IsOverlapping1, hv_Row3, hv_Column3; - HTuple hv_IsOverlapping2, hv_Row4, hv_Column4, hv_Symbol1; - HTuple hv_Col1, hv_V_ResultRow3, hv_V_ResultColumn3, hv_DistanceMin; - HTuple hv_DistanceMax, hv_V_Row3, hv_V_Column3, hv_V_Row33; - HTuple hv_V_Column33, hv_Distance1, hv_Sorted1, hv_Selected1; - HTuple hv_Selected2, hv_Distance2, hv_Sorted2, hv_Selected3; - HTuple hv_Selected4, hv_Distance3, hv_Sorted3, hv_Selected5; - HTuple hv_Selected6, hv_Distance4, hv_Sorted4, hv_Selected7; - HTuple hv_Selected8, hv_Exception; - - - //ÎÊÌâµã: À¶ĤµıßԵµã´æÔڶ¨λ²»׼µÄÎÊÌâ. - hv_Debug = 0; - TupleGenConst(16, 0, &hv_Newtuple); - (*hv_out_disLeftVertical) = HTuple(); - (*hv_out_LeftVerticalLinePar) = HTuple(); - (*hv_out_disLeftLevel) = HTuple(); - (*hv_out_LeftLevelLinePar) = HTuple(); - (*hv_out_standardPar) = HTuple(); - (*hv_out_Flag) = 1; - if (0 != (hv_in_ProductType==HTuple("181-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 1050; - hv_clip_Row = -25; - } - else if (0 != (hv_in_ProductType==HTuple("181-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 1050; - hv_clip_Row = -25; - } - else if (0 != (hv_in_ProductType==HTuple("185-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 940; - hv_clip_Row = -60; - } - else if (0 != (hv_in_ProductType==HTuple("185-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 900; - hv_clip_Row = -25; - } - else if (0 != (hv_in_ProductType==HTuple("186-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = -150; - hv_clip_Row = -25; - } - else if (0 != (hv_in_ProductType==HTuple("186-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 450; - hv_clip_Row = -10; - } - - try - { - //Ԥ´¦Àí,ÔöǿÓҲà²øÈƵçоµĻҽײî. - MoveRegion(ho_GlueRegions, &ho_RegionMoved, -180, 0); - Intersection(ho_GlueRegions, ho_RegionMoved, &ho_GlueRegions); - ShapeTrans(ho_GlueRegions, &ho_RegionTrans, "rectangle2"); - DilationRectangle1(ho_RegionTrans, &ho_RegionDilation, 600, 600); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RegionDilation, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - - ReduceDomain(ho_in_image, ho_RegionDilation, &ho_ImageReduced); - Emphasize(ho_in_image, &ho_ImageEmphasize, 7, 7, 1); - //*********************************************************************** - //step3.2 Ë㷨»ñȡ×ó²àµĶ¨λµã, - //»ñȡÄڲà°üĤµÄËĸöµãλ - Get_Rectangle2_Corner_new(ho_WhiteRegion, &hv_insideRow, &hv_insideCol); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross, hv_insideRow, hv_insideCol, 35, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross, HDevWindowStack::GetActive()); - - //gen_cross_contour_xld (Cross1, insideRow[0], insideCol[0], 65, rad(45)) - //gen_cross_contour_xld (Cross2, insideRow[1], insideCol[1], 65, rad(45)) - //gen_cross_contour_xld (Cross3, insideRow[2], insideCol[2], 65, rad(45)) - //gen_cross_contour_xld (Cross4, insideRow[3], insideCol[3], 65, rad(45)) - //dev_display (in_image) - - //dev_display (Cross1) - //dev_display (Cross2) - //dev_display (Cross3) - //dev_display (Cross4) - //stop () - } - //»ñȡÍâ²à°üĤµÄËĸöµãλ, - Get_Rectangle2_Corner_new(ho_GlueRegions, &hv_outsideRow, &hv_outsideCol); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross, hv_outsideRow, hv_outsideCol, 35, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //*********************************************************************** - - //*********************************************************************** - //step3.3 ץȡÓҲà°üĤµÄÂÖÀªµã, - //step3.3.1 ץȡˮƽÂÖÀªһ, - rake(ho_ImageEmphasize, &ho_Regions1, 150, 280, 5, 1, 8, "positive", "first", - HTuple(hv_outsideRow[1]), HTuple(hv_outsideCol[1]), HTuple(hv_outsideRow[0]), - HTuple(hv_outsideCol[0]), &hv_L_ResultRow1, &hv_L_ResultColumn1); - if (0 != ((hv_L_ResultRow1.TupleLength())<10)) - { - return; - } - pts_to_smooth_line(&ho_L_Line1, hv_L_ResultRow1, hv_L_ResultColumn1, 5, &hv_L_Row1, - &hv_L_Col1, &hv_L_Row11, &hv_L_Col11); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow1, hv_L_ResultColumn1, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_ImageEmphasize, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions1, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line1, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //step3.3.2 ץȡˮƽÂÖÀª¶þ, - //ץȡˮƽÏß2, - rake(ho_in_image, &ho_Regions2, 250, 480, 5, 1, 8, "negative", "first", HTuple(hv_insideRow[0]), - HTuple(hv_insideCol[0]), HTuple(hv_insideRow[1]), HTuple(hv_insideCol[1]), - &hv_L_ResultRow2, &hv_L_ResultColumn2); - if (0 != ((hv_L_ResultRow2.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_L_Line2, hv_L_ResultRow2, hv_L_ResultColumn2, 5, &hv_L_Row2, - &hv_L_Col2, &hv_L_Row22, &hv_L_Col22); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow2, hv_L_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line2, HDevWindowStack::GetActive()); - } - - //step3.3.2 ץȡÊúֱ°üĤµıßԵ¶þ - //ץȡÊúֱ°üĤµIJ¿·ֱßԵ,ÓÃÓÚÉú³ɸ¨ÖúÏß, - rake(ho_in_image, &ho_Regions2, 100, 250, 5, 1, 8, "negative", "first", HTuple(hv_insideRow[2]), - HTuple(hv_insideCol[2]), HTuple(hv_insideRow[0]), HTuple(hv_insideCol[0]), - &hv_ResultRow2, &hv_ResultColumn2); - if (0 != ((hv_ResultRow2.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_Line, hv_ResultRow2, hv_ResultColumn2, 5, &hv_Row11, &hv_Column11, - &hv_Row21, &hv_Column21); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_ResultRow2, hv_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Line, HDevWindowStack::GetActive()); - } - - //¸ô¦ÐÂÔö½ǶÈÅжÏ, Èç¹û½Ƕȹý´ó, ÀûÓÃÔöǿºóµÄͼÏñ, ½øÐжþ´Îץ±ß. - AngleLx(hv_Row11, hv_Column11, hv_Row21, hv_Column21, &hv_Angle); - - hv_k = (hv_Row11-hv_Row21)/(hv_Column11-hv_Column21); - hv_b = hv_Row11-(hv_k*hv_Column11); - hv_row = hv_Row11+750; - hv_col = (hv_row-hv_b)/hv_k; - if (0 != hv_Debug) - { - GenContourPolygonXld(&ho_Contour2, hv_Row21.TupleConcat(hv_row), hv_Column21.TupleConcat(hv_col)); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Contour2, HDevWindowStack::GetActive()); - } - rake(ho_in_image, &ho_V_Regions2, 150, 100, 5, 1, 15, "negative", "first", hv_row, - hv_col, hv_Row21, hv_Column21, &hv_V_ResultRow2, &hv_V_ResultColumn2); - if (0 != ((hv_V_ResultRow2.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_V_Line2, hv_V_ResultRow2, hv_V_ResultColumn2, 2, &hv_V_Row2, - &hv_V_Col2, &hv_V_Row22, &hv_V_Col22); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross3, hv_V_ResultRow2, hv_V_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_ImageEmphasize, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line2, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //step3.3.3 ץȡÊúֱ°üĤµıßԵһ - rake(ho_in_image, &ho_V_Regions1, 200, 450, 5, 1, 15, "positive", "first", HTuple(hv_outsideRow[0]), - HTuple(hv_outsideCol[0]), hv_V_Row2, HTuple(hv_outsideCol[0]), &hv_V_ResultRow1, - &hv_V_ResultColumn1); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); - - } - - if (0 != ((hv_V_ResultRow1.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_V_Line1, hv_V_ResultRow1, hv_V_ResultColumn1, 5, &hv_V_Row1, - &hv_V_Column1, &hv_V_Row11, &hv_V_Column11); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_V_ResultRow1, hv_V_ResultColumn1, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line1, HDevWindowStack::GetActive()); - } - //**************************************** - - //_______________________________________________________ - //step3.3.4 ץȡˮƽ°üĤµıßԵÈý - - //¸ô¦µIJÎÊý½øÐе÷Õû,»ñȡÕæʵµIJúƷ±ßԵ, - //¸ô¦²ÎÊý½øÐпª·Å, »ùÓڲ»ͬµIJúƷ½øÐе÷Õû, - - if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) - { - //gen_cross_contour_xld (Cross4, insideRow[2]+clip_Row2, outsideCol[2]+500, 35, rad(45)) - //gen_cross_contour_xld (Cross7, insideRow[2]+clip_Row1, insideCol[2]-400, 35, rad(45)) - //dev_display (in_image) - //dev_display (Cross4) - //dev_display (Cross7) - - - GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[2])+hv_clip_Row1, HTuple(hv_insideCol[2])-400, - HTuple(hv_insideRow[2])+hv_clip_Row2, HTuple(hv_outsideCol[2])+500); - } - else - { - GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[2])+hv_clip_Row1, HTuple(hv_insideCol[2])-350, - HTuple(hv_insideRow[2])+hv_clip_Row2, HTuple(hv_outsideCol[2])+350); - } - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Rectangle, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - - ReduceDomain(ho_in_image, ho_Rectangle, &ho_ImageReduced1); - SobelAmp(ho_ImageReduced1, &ho_EdgeAmplitude, "y", 3); - AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); - ScaleImage(ho_ImageAbs, &ho_ImageScaled, 15, -120); - Threshold(ho_ImageScaled, &ho_Region, 50, 255); - ClosingRectangle1(ho_Region, &ho_RegionClosing, 100, 2); - Connection(ho_RegionClosing, &ho_ConnectedRegions); - RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); - SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 20, 99999); - RegionFeatures(ho_SelectedRegions1, "width", &hv_Value1); - TupleSortIndex(hv_Value1, &hv_Indices); - hv_Symbol = 0; - { - HTuple end_val228 = hv_Indices.TupleLength(); - HTuple step_val228 = 1; - for (hv_index1=1; hv_index1.Continue(end_val228, step_val228); hv_index1 += step_val228) - { - hv_N = hv_Value1.TupleLength(); - hv_X = HTuple(hv_Indices[hv_N-hv_index1]); - SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); - ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); - Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); - GenCrossContourXld(&ho_Cross1, hv_Row, hv_Col, 6, 0.785398); - //dev_display (in_image) - //dev_display (Cross1) - rake(ho_in_image, &ho_L_Regions3, 100, 150, 2, 1, 8, "negative", "first", HTuple(hv_Row[2]), - HTuple(hv_Col[2]), HTuple(hv_Row[3]), HTuple(hv_Col[3]), &hv_L_ResultRow3, - &hv_L_ResultColumn3); - if (0 != ((hv_L_ResultRow3.TupleLength())<10)) - { - continue; - } - pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 10, &hv_L_Row3, - &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow3, hv_L_ResultColumn3, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line3, HDevWindowStack::GetActive()); - } - hv_Symbol = 1; - break; - } - } - if (0 != (hv_Symbol==0)) - { - ReduceDomain(ho_in_image, ho_Rectangle, &ho_ImageReduced1); - - SmallestRectangle1(ho_Rectangle, &hv_Row12, &hv_Column12, &hv_Row22, &hv_Column22); - GenRectangle1(&ho_Rectangle1, hv_Row22-100, hv_Column22-100, hv_Row22, hv_Column22); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Rectangle1, HDevWindowStack::GetActive()); - Intensity(ho_Rectangle1, ho_ImageReduced1, &hv_Mean, &hv_Deviation); - GenImageProto(ho_in_image, &ho_ImageCleared, (hv_Mean.TupleInt())*0.5); - SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 6, 0); - - GaussFilter(ho_ImageSub, &ho_ImageGauss, 9); - SobelAmp(ho_ImageGauss, &ho_EdgeAmplitude, "y", 3); - AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); - ScaleImage(ho_ImageAbs, &ho_ImageScaled, 17, -120); - Threshold(ho_ImageScaled, &ho_Region, 50, 255); - Intersection(ho_Region, ho_Rectangle, &ho_RegionIntersection); - - ClosingRectangle1(ho_RegionIntersection, &ho_RegionClosing, 100, 2); - Connection(ho_RegionClosing, &ho_ConnectedRegions); - RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); - SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 20, - 99999); - RegionFeatures(ho_SelectedRegions1, "width", &hv_Value1); - TupleSortIndex(hv_Value1, &hv_Indices); - hv_Symbol = 0; - { - HTuple end_val280 = hv_Indices.TupleLength(); - HTuple step_val280 = 1; - for (hv_index1=1; hv_index1.Continue(end_val280, step_val280); hv_index1 += step_val280) - { - hv_N = hv_Value1.TupleLength(); - hv_X = HTuple(hv_Indices[hv_N-hv_index1]); - SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); - ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); - Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); - GenCrossContourXld(&ho_Cross1, hv_Row, hv_Col, 6, 0.785398); - //dev_display (RegionTrans1) - //dev_display (Cross1) - rake(ho_ImageSub, &ho_L_Regions3, 100, 150, 2, 1, 10, "negative", "first", - HTuple(hv_Row[2]), HTuple(hv_Col[2]), HTuple(hv_Row[3]), HTuple(hv_Col[3]), - &hv_L_ResultRow3, &hv_L_ResultColumn3); - if (0 != ((hv_L_ResultRow3.TupleLength())<10)) - { - continue; - } - pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 10, - &hv_L_Row3, &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow3, hv_L_ResultColumn3, 7, - HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line3, HDevWindowStack::GetActive()); - } - hv_Symbol = 1; - break; - } - } - } - if (0 != (hv_Symbol==0)) - { - return; - } - //________________________________________________________ - //step3.3.4 ץȡˮƽ°üĤµıßԵÈý - IntersectionLineContourXld(ho_LeftContour, hv_L_Row1, hv_L_Col1, hv_L_Row11, - hv_L_Col11, &hv_Row1, &hv_Column1, &hv_IsOverlapping); - IntersectionLineContourXld(ho_LeftContour, hv_L_Row2, hv_L_Col2, hv_L_Row22, - hv_L_Col22, &hv_Row2, &hv_Column2, &hv_IsOverlapping1); - - if (0 != hv_Debug) - { - GenRegionLine(&ho_RegionLines1, hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11); - GenRegionLine(&ho_RegionLines2, hv_L_Row2, hv_L_Col2, hv_L_Row22, hv_L_Col22); - - //gen_cross_contour_xld (Cross4, Row1, Column1, 30, 0.785398) - //gen_cross_contour_xld (Cross5, Row2, Column2, 30, 0.785398) - //dev_display (in_image) - //dev_display (Cross4) - //dev_display (Cross5) - //dev_display (LeftContour) - //dev_display (RegionLines1) - //dev_display (RegionLines2) - //stop () - } - //¸ô¦²ÎÊýҲ¿ÉÒԿ¼ÂǽøÐпª·Å, - IntersectionLines(hv_Row1, hv_Column1-600, hv_Row2, hv_Column2-600, hv_L_Row1, - hv_L_Col1, hv_L_Row11, hv_L_Col11, &hv_Row3, &hv_Column3, &hv_IsOverlapping2); - IntersectionLines(hv_Row1, hv_Column1-600, hv_Row2, hv_Column2-600, hv_L_Row2, - hv_L_Col2, hv_L_Row22, hv_L_Col22, &hv_Row4, &hv_Column4, &hv_IsOverlapping2); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross5, hv_Row3, hv_Column3, 30, 0.785398); - GenCrossContourXld(&ho_Cross6, hv_Row4, hv_Column4, 30, 0.785398); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross5, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross6, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - - //¸ô¦½øÐе÷Õû²ÎÊý, - GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), - ((((hv_Column1+hv_clip_Row).TupleConcat(hv_Column2+hv_clip_Row)).TupleConcat(hv_Column4)).TupleConcat(hv_Column3)).TupleConcat(hv_Column1+hv_clip_Row)); - GenRegionContourXld(ho_Contour, &ho_Region1, "filled"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Region1, HDevWindowStack::GetActive()); - - ReduceDomain(ho_in_image, ho_Region1, &ho_ImageReduced2); - SobelAmp(ho_ImageReduced2, &ho_EdgeAmplitude1, "x", 3); - AbsImage(ho_EdgeAmplitude1, &ho_ImageAbs1); - ScaleImage(ho_ImageAbs1, &ho_ImageScaled1, 15, -120); - Threshold(ho_ImageScaled1, &ho_Region1, 50, 255); - ClosingRectangle1(ho_Region1, &ho_RegionClosing, 15, 180); - Connection(ho_RegionClosing, &ho_ConnectedRegions); - RegionFeatures(ho_ConnectedRegions, "height", &hv_Value1); - SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "height", "and", 20, 99999); - RegionFeatures(ho_SelectedRegions1, "height", &hv_Value1); - - TupleSortIndex(hv_Value1, &hv_Indices); - hv_Symbol1 = 0; - { - HTuple end_val361 = hv_Indices.TupleLength(); - HTuple step_val361 = 1; - for (hv_index1=1; hv_index1.Continue(end_val361, step_val361); hv_index1 += step_val361) - { - hv_N = hv_Value1.TupleLength(); - hv_X = HTuple(hv_Indices[hv_N-hv_index1]); - SelectObj(ho_SelectedRegions1, &ho_SelectedRegions, hv_X+1); - ShapeTrans(ho_SelectedRegions, &ho_RegionTrans1, "rectangle1"); - Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row1, &hv_Col1); - //gen_cross_contour_xld (Cross1, Row, Col, 6, 0.785398) - //dev_display (RegionTrans1) - //dev_display (Cross1) - rake(ho_in_image, &ho_V_Regions3, 50, 150, 5, 1, 6, "positive", "first", HTuple(hv_Row1[1]), - (HTuple(hv_Col1[1])+HTuple(hv_Col1[0]))*0.5, HTuple(hv_Row1[3]), (HTuple(hv_Col1[3])+HTuple(hv_Col1[2]))*0.5, - &hv_V_ResultRow3, &hv_V_ResultColumn3); - if (0 != ((hv_V_ResultRow3.TupleLength())<5)) - { - continue; - } - DistancePc(ho_LeftContour, hv_V_ResultRow3, hv_V_ResultColumn3, &hv_DistanceMin, - &hv_DistanceMax); - if (0 != ((hv_DistanceMin.TupleMean())<30)) - { - continue; - } - else - { - pts_to_smooth_line(&ho_V_Line3, hv_V_ResultRow3, hv_V_ResultColumn3, 5, &hv_V_Row3, - &hv_V_Column3, &hv_V_Row33, &hv_V_Column33); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross3, hv_V_ResultRow3, hv_V_ResultColumn3, 7, - HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line3, HDevWindowStack::GetActive()); - } - hv_Symbol1 = 1; - break; - } - if (0 != (hv_Symbol1==0)) - { - return; - } - } - } - //*********************************************************************** - - //*********************************************************************** - //step3.4 ¿ªʼ¼ÆËãÓҲàµĽº´ø¾àÀë. - DistancePl(hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row1, hv_L_Col1, hv_L_Row11, - hv_L_Col11, &hv_Distance1); - TupleSort(hv_Distance1, &hv_Sorted1); - TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(0,HTuple((hv_Sorted1.TupleLength())*0.1).TupleInt(),1), - &hv_Selected1); - TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(HTuple((hv_Sorted1.TupleLength())*0.9).TupleInt(),(hv_Sorted1.TupleLength())-1,1), - &hv_Selected2); - DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row1, hv_L_Col1, hv_L_Row11, - hv_L_Col11, &hv_Distance2); - //_____________________________________ - //µ÷ÊÔÓÃ, ¹۲ì²âÁ¿Ч¹û, - //gen_contour_polygon_xld (Contour1, [L_Row1,L_Row11], [L_Col1,L_Col11]) - //gen_cross_contour_xld (Cross3, L_ResultRow3, L_ResultColumn3, 6, rad(45)) - //dev_display (in_image) - //dev_display (Contour1) - //dev_display (Cross3) - - - TupleSort(hv_Distance2, &hv_Sorted2); - TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(0,HTuple((hv_Sorted2.TupleLength())*0.1).TupleInt(),1), - &hv_Selected3); - TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(HTuple((hv_Sorted2.TupleLength())*0.9).TupleInt(),(hv_Sorted2.TupleLength())-1,1), - &hv_Selected4); - - (*hv_out_disLeftVertical).Clear(); - (*hv_out_disLeftVertical).Append(hv_Selected1.TupleMean()); - (*hv_out_disLeftVertical).Append(hv_Selected2.TupleMean()); - (*hv_out_disLeftVertical).Append(hv_Selected3.TupleMean()); - (*hv_out_disLeftVertical).Append(hv_Selected4.TupleMean()); - (*hv_out_LeftVerticalLinePar).Clear(); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Row2); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Col2); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Row22); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Col22); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Row3); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Column3); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Row33); - (*hv_out_LeftVerticalLinePar).Append(hv_L_Column33); - - DistancePl(hv_V_ResultRow2, hv_V_ResultColumn2, hv_V_Row1, hv_V_Column1, hv_V_Row11, - hv_V_Column11, &hv_Distance3); - TupleSort(hv_Distance3, &hv_Sorted3); - TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(0,HTuple((hv_Sorted3.TupleLength())*0.1).TupleInt(),1), - &hv_Selected5); - TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(HTuple((hv_Sorted3.TupleLength())*0.9).TupleInt(),(hv_Sorted3.TupleLength())-1,1), - &hv_Selected6); - - DistancePl(hv_V_ResultRow3, hv_V_ResultColumn3, hv_V_Row1, hv_V_Column1, hv_V_Row11, - hv_V_Column11, &hv_Distance4); - TupleSort(hv_Distance4, &hv_Sorted4); - TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(0,HTuple((hv_Sorted4.TupleLength())*0.1).TupleInt(),1), - &hv_Selected7); - TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(HTuple((hv_Sorted4.TupleLength())*0.9).TupleInt(),(hv_Sorted4.TupleLength())-1,1), - &hv_Selected8); - - (*hv_out_disLeftLevel).Clear(); - (*hv_out_disLeftLevel).Append(hv_Selected5.TupleMean()); - (*hv_out_disLeftLevel).Append(hv_Selected6.TupleMean()); - (*hv_out_disLeftLevel).Append(hv_Selected7.TupleMean()); - (*hv_out_disLeftLevel).Append(hv_Selected8.TupleMean()); - (*hv_out_LeftLevelLinePar).Clear(); - (*hv_out_LeftLevelLinePar).Append(hv_V_Row2); - (*hv_out_LeftLevelLinePar).Append(hv_V_Col2); - (*hv_out_LeftLevelLinePar).Append(hv_V_Row22); - (*hv_out_LeftLevelLinePar).Append(hv_V_Col22); - (*hv_out_LeftLevelLinePar).Append(hv_V_Row3); - (*hv_out_LeftLevelLinePar).Append(hv_V_Column3); - (*hv_out_LeftLevelLinePar).Append(hv_V_Row33); - (*hv_out_LeftLevelLinePar).Append(hv_V_Column33); - - (*hv_out_standardPar).Clear(); - (*hv_out_standardPar).Append(hv_L_Row1); - (*hv_out_standardPar).Append(hv_L_Col1); - (*hv_out_standardPar).Append(hv_L_Row11); - (*hv_out_standardPar).Append(hv_L_Col11); - (*hv_out_standardPar).Append(hv_V_Row1); - (*hv_out_standardPar).Append(hv_V_Column1); - (*hv_out_standardPar).Append(hv_V_Row11); - (*hv_out_standardPar).Append(hv_V_Column11); - if (0 != (HTuple(((*hv_out_disLeftVertical).TupleLength())==4).TupleAnd(((*hv_out_disLeftLevel).TupleLength())==4))) - { - (*hv_out_Flag) = 0; - } - } - // catch (Exception) - catch (HException &HDevExpDefaultException) - { - HDevExpDefaultException.ToHTuple(&hv_Exception); - //stop () - } - return; -} - -void cal_Right_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, - HObject ho_RightXLD, HTuple hv_in_ProductType, HTuple *hv_out_disRightVertical, - HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar, - HTuple *hv_out_standardPar, HTuple *hv_out_Flag) -{ - - // Local iconic variables - HObject ho_RegionTrans, ho_RegionDilation, ho_ImageReduced; - HObject ho_ImageCleared2, ho_ImageSub2, ho_Cross, ho_RegionOpening; - HObject ho_Regions1, ho_L_Line1, ho_Cross2, ho_Regions2; - HObject ho_Region2, ho_RegionErosion1, ho_RegionIntersection1; - HObject ho_L_Line2, ho_Line, ho_Contour2, ho_V_Regions2; - HObject ho_V_Line2, ho_Cross3, ho_V_Regions1, ho_V_Line1; - HObject ho_Cross1, ho_Cross4, ho_Contour, ho_Region1, ho_ImageReduced2; - HObject ho_EdgeAmplitude1, ho_ImageAbs1, ho_ImageScaled1; - HObject ho_RegionClosing, ho_ConnectedRegions, ho_SelectedRegions1; - HObject ho_SelectedRegions, ho_RegionTrans1, ho_V_Regions3; - HObject ho_V_Line3, ho_Rectangle, ho_Rectangle1, ho_ImageCleared; - HObject ho_ImageSub, ho_ImageReduced1, ho_ImageGauss, ho_EdgeAmplitude; - HObject ho_ImageAbs, ho_ImageScaled, ho_Region, ho_RegionErosion; - HObject ho_RegionIntersection, ho_ObjectSelected, ho_L_Regions3; - HObject ho_L_Line3; - - // Local control variables - HTuple hv_Debug, hv_clip_Row1, hv_clip_Row2; - HTuple hv_move_col, hv_insideRow, hv_insideCol, hv_outsideRow; - HTuple hv_outsideCol, hv_L_ResultRow1, hv_L_ResultColumn1; - HTuple hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, hv_Height; - HTuple hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row2; - HTuple hv_L_Col2, hv_L_Row22, hv_L_Col22, hv_ResultRow2; - HTuple hv_ResultColumn2, hv_Row11, hv_Column11, hv_Row21; - HTuple hv_Column21, hv_k, hv_b, hv_row, hv_col, hv_V_ResultRow2; - HTuple hv_V_ResultColumn2, hv_V_Row2, hv_V_Col2, hv_V_Row22; - HTuple hv_V_Col22, hv_V_ResultRow1, hv_V_ResultColumn1; - HTuple hv_V_Row1, hv_V_Column1, hv_V_Row11, hv_V_Column11; - HTuple hv_Row1, hv_Column1, hv_IsOverlapping, hv_Row2; - HTuple hv_Column2, hv_Row3, hv_Column3, hv_IsOverlapping2; - HTuple hv_Row4, hv_Column4, hv_Value, hv_Value1, hv_Indices; - HTuple hv_Symbol1, hv_index1, hv_N, hv_X, hv_Row, hv_Col; - HTuple hv_V_ResultRow3, hv_V_ResultColumn3, hv_DistanceMin; - HTuple hv_DistanceMax, hv_V_Row3, hv_V_Column3, hv_V_Row33; - HTuple hv_V_Column33, hv_Col11, hv_Mean, hv_Deviation; - HTuple hv_Symbol, hv_L_ResultRow3, hv_L_ResultColumn3; - HTuple hv_Distance, hv_Sorted, hv_start1, hv_end1, hv_Selected; - HTuple hv_Greater, hv_Less, hv_And, hv_Indices1, hv_L_Row3; - HTuple hv_L_Column3, hv_L_Row33, hv_L_Column33, hv_Distance1; - HTuple hv_Sorted1, hv_Selected1, hv_Selected2, hv_Distance2; - HTuple hv_Sorted2, hv_Selected3, hv_Selected4, hv_Distance3; - HTuple hv_Sorted3, hv_Selected5, hv_Selected6, hv_Distance4; - HTuple hv_Sorted4, hv_Selected7, hv_Selected8, hv_Exception; - - - - - (*hv_out_disRightVertical) = HTuple(); - (*hv_out_RightVerticalLinePar) = HTuple(); - (*hv_out_disRightLevel) = HTuple(); - (*hv_out_RightLevelLinePar) = HTuple(); - (*hv_out_standardPar) = HTuple(); - (*hv_out_Flag) = 1; - hv_Debug = 0; - //ÎÊÌâµã: ˮƽϱßԵûÓа취׼ȷ¶¨λ. - if (0 != (hv_in_ProductType==HTuple("181-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 1050; - hv_move_col = 30; - } - else if (0 != (hv_in_ProductType==HTuple("181-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 1050; - hv_move_col = 30; - } - else if (0 != (hv_in_ProductType==HTuple("185-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 950; - hv_move_col = 30; - } - else if (0 != (hv_in_ProductType==HTuple("185-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 900; - hv_move_col = 15; - } - else if (0 != (hv_in_ProductType==HTuple("186-1"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = -150; - hv_move_col = 30; - } - else if (0 != (hv_in_ProductType==HTuple("186-2"))) - { - hv_clip_Row1 = -150; - hv_clip_Row2 = 550; - hv_move_col = 100; - } - try - { - //Ԥ´¦Àí,ÔöǿÓҲà²øÈƵçоµĻҽײî. - ShapeTrans(ho_GlueRegions, &ho_RegionTrans, "rectangle2"); - DilationRectangle1(ho_RegionTrans, &ho_RegionDilation, 700, 700); - if (0 != hv_Debug) - { - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RegionDilation, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - ReduceDomain(ho_in_image, ho_RegionDilation, &ho_ImageReduced); - GenImageProto(ho_ImageReduced, &ho_ImageCleared2, 40); - SubImage(ho_ImageReduced, ho_ImageCleared2, &ho_ImageSub2, 5, 0); - //dev_display (ImageSub2) - //************************************************** - //step3.2 Ë㷨»ñȡ×ó²àµĶ¨λµã, - //»ñȡÄڲà°üĤµÄËĸöµãλ - Get_Rectangle2_Corner_new(ho_WhiteRegion, &hv_insideRow, &hv_insideCol); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross, hv_insideRow, hv_insideCol, 35, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //GlueRegionsÐèҪ½øÐÐԤ´¦Àí, ȥ³ý±ßԵ¸ÉÈŵã, - OpeningCircle(ho_GlueRegions, &ho_RegionOpening, 30); - //»ñȡÍâ²à°üĤµÄËĸöµãλ, - Get_Rectangle2_Corner_new(ho_RegionOpening, &hv_outsideRow, &hv_outsideCol); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross, hv_outsideRow, hv_outsideCol, 35, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RegionOpening, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //*********************************************************************** - //step3.3 ץȡÓҲà°üĤµÄÂÖÀªµã, - //step3.3.1 ץȡˮƽÂÖÀªһ, - rake(ho_ImageSub2, &ho_Regions1, 150, 300, 3, 1, 15, "positive", "first", HTuple(hv_outsideRow[1]), - HTuple(hv_outsideCol[1]), HTuple(hv_outsideRow[0]), HTuple(hv_outsideCol[0]), - &hv_L_ResultRow1, &hv_L_ResultColumn1); - if (0 != ((hv_L_ResultRow1.TupleLength())<10)) - { - return; - } - pts_to_smooth_line(&ho_L_Line1, hv_L_ResultRow1, hv_L_ResultColumn1, 5, &hv_L_Row1, - &hv_L_Col1, &hv_L_Row11, &hv_L_Col11); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow1, hv_L_ResultColumn1, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_ImageSub2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions1, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line1, HDevWindowStack::GetActive()); - } - //step3.3.2 ץȡˮƽÂÖÀª¶þ, - //ץȡˮƽÏß2, - if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) - { - hv_Height = 550; - } - else - { - hv_Height = 300; - } - rake(ho_in_image, &ho_Regions2, 240, hv_Height, 5, 1, 15, "negative", "first", - HTuple(hv_insideRow[0]), HTuple(hv_insideCol[0]), HTuple(hv_insideRow[1]), - HTuple(hv_insideCol[1]), &hv_L_ResultRow2, &hv_L_ResultColumn2); - if (0 != ((hv_L_ResultRow2.TupleLength())<10)) - { - return; - } - - - GenRegionPoints(&ho_Region2, hv_L_ResultRow2, hv_L_ResultColumn2); - ErosionRectangle1(ho_RegionOpening, &ho_RegionErosion1, 2, 125); - //dev_display (Region2) - //dev_display (RegionErosion1) - Intersection(ho_RegionErosion1, ho_Region2, &ho_RegionIntersection1); - GetRegionPoints(ho_RegionIntersection1, &hv_L_ResultRow2, &hv_L_ResultColumn2); - - pts_to_best_line(&ho_L_Line2, hv_L_ResultRow2, hv_L_ResultColumn2, 5, &hv_L_Row2, - &hv_L_Col2, &hv_L_Row22, &hv_L_Col22); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_L_ResultRow2, hv_L_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line2, HDevWindowStack::GetActive()); - } - - //step3.3.2 ץȡÊúֱ°üĤµıßԵ¶þ - //ץȡÊúֱ°üĤµIJ¿·ֱßԵ,ÓÃÓÚÉú³ɸ¨ÖúÏß, - rake(ho_in_image, &ho_Regions2, 100, 450, 5, 1, 12, "negative", "first", HTuple(hv_insideRow[1]), - HTuple(hv_insideCol[1]), HTuple(hv_insideRow[3]), HTuple(hv_insideCol[3]), - &hv_ResultRow2, &hv_ResultColumn2); - if (0 != ((hv_ResultRow2.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_Line, hv_ResultRow2, hv_ResultColumn2, 5, &hv_Row11, &hv_Column11, - &hv_Row21, &hv_Column21); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_ResultRow2, hv_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Line, HDevWindowStack::GetActive()); - } - hv_k = (hv_Row11-hv_Row21)/(hv_Column11-hv_Column21); - hv_b = hv_Row11-(hv_k*hv_Column11); - hv_row = hv_Row11+1500; - hv_col = (hv_row-hv_b)/hv_k; - if (0 != hv_Debug) - { - GenContourPolygonXld(&ho_Contour2, hv_Row11.TupleConcat(hv_row), hv_Column11.TupleConcat(hv_col)); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Contour2, HDevWindowStack::GetActive()); - } - rake(ho_in_image, &ho_V_Regions2, 100, 60, 5, 1, 10, "negative", "first", hv_Row11, - hv_Column11, hv_row, hv_col, &hv_V_ResultRow2, &hv_V_ResultColumn2); - if (0 != ((hv_V_ResultRow2.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_V_Line2, hv_V_ResultRow2, hv_V_ResultColumn2, 2, &hv_V_Row2, - &hv_V_Col2, &hv_V_Row22, &hv_V_Col22); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross3, hv_V_ResultRow2, hv_V_ResultColumn2, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line2, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //step3.3.3 ץȡÊúֱ°üĤµıßԵһ - rake(ho_ImageSub2, &ho_V_Regions1, 200, 250, 5, 1, 10, "positive", "first", hv_V_Row22, - HTuple(hv_outsideCol[1])-15, HTuple(hv_outsideRow[1]), HTuple(hv_outsideCol[1])-15, - &hv_V_ResultRow1, &hv_V_ResultColumn1); - if (0 != ((hv_V_ResultRow1.TupleLength())<10)) - { - return; - } - pts_to_best_line(&ho_V_Line1, hv_V_ResultRow1, hv_V_ResultColumn1, 5, &hv_V_Row1, - &hv_V_Column1, &hv_V_Row11, &hv_V_Column11); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_V_ResultRow1, hv_V_ResultColumn1, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_ImageSub2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line1, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - //************************************************************ - //step3.3.4 ץȡÊúֱ°üĤµıßԵÈý - //»ñȡˮƽĤÓë×ó²àÊúֱ±ߵĽ»µã; - IntersectionLineContourXld(ho_RightXLD, hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, - &hv_Row1, &hv_Column1, &hv_IsOverlapping); - IntersectionLineContourXld(ho_RightXLD, hv_L_Row2, hv_L_Col2, hv_L_Row22, hv_L_Col22, - &hv_Row2, &hv_Column2, &hv_IsOverlapping); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross1, hv_Row1, hv_Column1, 24, 0.785398); - GenCrossContourXld(&ho_Cross2, hv_Row2, hv_Column2, 24, 0.785398); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_RightXLD, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross1, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - } - - IntersectionLines(hv_Row1, hv_Column1+800, hv_Row2, hv_Column1+800, hv_L_Row1, - hv_L_Col1, hv_L_Row11, hv_L_Col11, &hv_Row3, &hv_Column3, &hv_IsOverlapping2); - IntersectionLines(hv_Row1, hv_Column1+800, hv_Row2, hv_Column2+800, hv_L_Row2, - hv_L_Col2, hv_L_Row22, hv_L_Col22, &hv_Row4, &hv_Column4, &hv_IsOverlapping2); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross3, hv_Row3, hv_Column3, 35, HTuple(45).TupleRad()); - GenCrossContourXld(&ho_Cross4, hv_Row4, hv_Column4, 35, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross4, HDevWindowStack::GetActive()); - } - - //¸üÐÂ, ¸ô¦Çø·ֲ»ͬµIJúÏß - if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) - { - GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), - ((((hv_Column1+hv_move_col).TupleConcat(hv_Column2+hv_move_col)).TupleConcat(hv_Column4-100)).TupleConcat(hv_Column3-100)).TupleConcat(hv_Column1+hv_move_col)); - } - else - { - GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), - ((((hv_Column1+hv_move_col).TupleConcat(hv_Column2+hv_move_col)).TupleConcat(hv_Column4-300)).TupleConcat(hv_Column3-300)).TupleConcat(hv_Column1+hv_move_col)); - } - //dev_display (in_image) - //dev_display (Contour) - GenRegionContourXld(ho_Contour, &ho_Region1, "filled"); - ReduceDomain(ho_in_image, ho_Region1, &ho_ImageReduced2); - SobelAmp(ho_ImageReduced2, &ho_EdgeAmplitude1, "x", 3); - AbsImage(ho_EdgeAmplitude1, &ho_ImageAbs1); - ScaleImage(ho_ImageAbs1, &ho_ImageScaled1, 15, -120); - Threshold(ho_ImageScaled1, &ho_Region1, 60, 255); - ClosingRectangle1(ho_Region1, &ho_RegionClosing, 4, 60); - Connection(ho_RegionClosing, &ho_ConnectedRegions); - RegionFeatures(ho_ConnectedRegions, "height", &hv_Value); - SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "height", "and", 40, 99999); - RegionFeatures(ho_SelectedRegions1, "height", &hv_Value1); - TupleSortIndex(hv_Value1, &hv_Indices); - hv_Symbol1 = 0; - { - HTuple end_val227 = hv_Indices.TupleLength(); - HTuple step_val227 = 1; - for (hv_index1=1; hv_index1.Continue(end_val227, step_val227); hv_index1 += step_val227) - { - hv_N = hv_Value1.TupleLength(); - hv_X = HTuple(hv_Indices[hv_N-hv_index1]); - SelectObj(ho_SelectedRegions1, &ho_SelectedRegions, hv_X+1); - ShapeTrans(ho_SelectedRegions, &ho_RegionTrans1, "rectangle1"); - Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); - - rake(ho_in_image, &ho_V_Regions3, 100, 200, 2, 1, 15, "positive", "first", - HTuple(hv_Row[2]), HTuple(hv_Col[2]), HTuple(hv_Row[0]), HTuple(hv_Col[0]), - &hv_V_ResultRow3, &hv_V_ResultColumn3); - if (0 != ((hv_V_ResultRow3.TupleLength())<10)) - { - continue; - } - DistancePc(ho_RightXLD, hv_V_ResultRow3, hv_V_ResultColumn3, &hv_DistanceMin, - &hv_DistanceMax); - //a := mean(DistanceMin) - if (0 != ((hv_DistanceMin.TupleMean())<20)) - { - continue; - } - else - { - pts_to_smooth_line(&ho_V_Line3, hv_V_ResultRow3, hv_V_ResultColumn3, 10, - &hv_V_Row3, &hv_V_Column3, &hv_V_Row33, &hv_V_Column33); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross2, hv_V_ResultRow3, hv_V_ResultColumn3, 7, - HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Regions3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross2, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_V_Line3, HDevWindowStack::GetActive()); - } - hv_Symbol1 = 1; - break; - } - } - } - if (0 != (hv_Symbol1==0)) - { - return; - } - - //________________________________________________________________ - //step3.3.4 ץȡˮƽ°üĤµıßԵÈý - GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[3])+hv_clip_Row1, HTuple(hv_insideCol[3])-50, - HTuple(hv_insideRow[3])+hv_clip_Row2, HTuple(hv_outsideCol[3])); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Rectangle, HDevWindowStack::GetActive()); - - Get_Rectangle2_Corner_new(ho_Rectangle, &hv_Row11, &hv_Col11); - GenRectangle1(&ho_Rectangle1, HTuple(hv_Row11[2])-100, HTuple(hv_Col11[2])+100, - HTuple(hv_Row11[2]), HTuple(hv_Col11[2])+200); - //dev_display (in_image) - //dev_display (Rectangle1) - Intensity(ho_Rectangle1, ho_in_image, &hv_Mean, &hv_Deviation); - GenImageProto(ho_in_image, &ho_ImageCleared, (hv_Mean.TupleInt())*0.5); - SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 6, 0); - ReduceDomain(ho_ImageSub, ho_Rectangle, &ho_ImageReduced1); - GaussFilter(ho_ImageReduced1, &ho_ImageGauss, 9); - SobelAmp(ho_ImageGauss, &ho_EdgeAmplitude, "y", 3); - AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); - ScaleImage(ho_ImageAbs, &ho_ImageScaled, 17, -120); - Threshold(ho_ImageScaled, &ho_Region, 50, 255); - ErosionRectangle1(ho_Rectangle, &ho_RegionErosion, 1, 20); - Intersection(ho_Region, ho_RegionErosion, &ho_RegionIntersection); - ClosingRectangle1(ho_RegionIntersection, &ho_RegionClosing, 100, 6); - Connection(ho_RegionClosing, &ho_ConnectedRegions); - //dev_display (in_image) - //dev_display (Rectangle) - //stop () - RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); - SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 25, 99999); - RegionFeatures(ho_SelectedRegions1, "row", &hv_Value1); - TupleSortIndex(hv_Value1, &hv_Indices); - hv_Symbol = 0; - { - HTuple end_val293 = hv_Indices.TupleLength(); - HTuple step_val293 = 1; - for (hv_index1=1; hv_index1.Continue(end_val293, step_val293); hv_index1 += step_val293) - { - hv_N = hv_Value1.TupleLength(); - hv_X = HTuple(hv_Indices[hv_N-hv_index1]); - SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); - ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); - Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); - rake(ho_in_image, &ho_L_Regions3, 80, 400, 3, 1, 6, "negative", "first", HTuple(hv_Row[2]), - HTuple(hv_Col[2])-40, HTuple(hv_Row[3]), HTuple(hv_Col[3])+80, &hv_L_ResultRow3, - &hv_L_ResultColumn3); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); - if (0 != ((hv_L_ResultRow3.TupleLength())<12)) - { - continue; - } - - if (0 != ((hv_L_ResultRow3.TupleLength())>40)) - { - DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, HTuple(hv_Row[2]), HTuple(hv_Col[2])-40, - HTuple(hv_Row[3]), HTuple(hv_Col[3])+80, &hv_Distance); - TupleSort(hv_Distance, &hv_Sorted); - hv_start1 = HTuple((hv_Sorted.TupleLength())*0.2).TupleInt(); - hv_end1 = HTuple((hv_Sorted.TupleLength())*0.8).TupleInt(); - TupleSelect(hv_Sorted, HTuple::TupleGenSequence(hv_start1,hv_end1,1), &hv_Selected); - TupleGreaterElem(hv_Distance, hv_Selected.TupleMin(), &hv_Greater); - TupleLessElem(hv_Distance, hv_Selected.TupleMax(), &hv_Less); - TupleAnd(hv_Greater, hv_Less, &hv_And); - TupleFind(hv_And, 1, &hv_Indices1); - TupleSelect(hv_L_ResultRow3, hv_Indices1, &hv_L_ResultRow3); - TupleSelect(hv_L_ResultColumn3, hv_Indices1, &hv_L_ResultColumn3); - } - - pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 5, &hv_L_Row3, - &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); - if (0 != hv_Debug) - { - GenCrossContourXld(&ho_Cross3, hv_L_ResultRow3, hv_L_ResultColumn3, 7, HTuple(45).TupleRad()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"red"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"green"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_Cross3, HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - SetColor(HDevWindowStack::GetActive(),"yellow"); - if (HDevWindowStack::IsOpen()) - DispObj(ho_L_Line3, HDevWindowStack::GetActive()); - // stop(...); only in hdevelop - } - hv_Symbol = 1; - break; - } - } - - if (0 != (hv_Symbol==0)) - { - return; - } - //*********************************************************************** - - //*********************************************************************** - //step3.4 ¿ªʼ¼ÆËãÓҲàµĽº´ø¾àÀë. - DistancePl(hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row1, hv_L_Col1, hv_L_Row11, - hv_L_Col11, &hv_Distance1); - TupleSort(hv_Distance1, &hv_Sorted1); - TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(0,HTuple((hv_Sorted1.TupleLength())*0.1).TupleInt(),1), - &hv_Selected1); - TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(HTuple((hv_Sorted1.TupleLength())*0.9).TupleInt(),(hv_Sorted1.TupleLength())-1,1), - &hv_Selected2); - - DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row1, hv_L_Col1, hv_L_Row11, - hv_L_Col11, &hv_Distance2); - TupleSort(hv_Distance2, &hv_Sorted2); - TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(0,HTuple((hv_Sorted2.TupleLength())*0.1).TupleInt(),1), - &hv_Selected3); - TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(HTuple((hv_Sorted2.TupleLength())*0.9).TupleInt(),(hv_Sorted2.TupleLength())-1,1), - &hv_Selected4); - - (*hv_out_disRightVertical).Clear(); - (*hv_out_disRightVertical).Append(hv_Selected1.TupleMean()); - (*hv_out_disRightVertical).Append(hv_Selected2.TupleMean()); - (*hv_out_disRightVertical).Append(hv_Selected3.TupleMean()); - (*hv_out_disRightVertical).Append(hv_Selected4.TupleMean()); - (*hv_out_RightVerticalLinePar).Clear(); - (*hv_out_RightVerticalLinePar).Append(hv_L_Row2); - (*hv_out_RightVerticalLinePar).Append(hv_L_Col2); - (*hv_out_RightVerticalLinePar).Append(hv_L_Row22); - (*hv_out_RightVerticalLinePar).Append(hv_L_Col22); - (*hv_out_RightVerticalLinePar).Append(hv_L_Row3); - (*hv_out_RightVerticalLinePar).Append(hv_L_Column3); - (*hv_out_RightVerticalLinePar).Append(hv_L_Row33); - (*hv_out_RightVerticalLinePar).Append(hv_L_Column33); - - DistancePl(hv_V_ResultRow2, hv_V_ResultColumn2, hv_V_Row1, hv_V_Column1, hv_V_Row11, - hv_V_Column11, &hv_Distance3); - TupleSort(hv_Distance3, &hv_Sorted3); - TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(0,HTuple((hv_Sorted3.TupleLength())*0.1).TupleInt(),1), - &hv_Selected5); - TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(HTuple((hv_Sorted3.TupleLength())*0.9).TupleInt(),(hv_Sorted3.TupleLength())-1,1), - &hv_Selected6); - - DistancePl(hv_V_ResultRow3, hv_V_ResultColumn3, hv_V_Row1, hv_V_Column1, hv_V_Row11, - hv_V_Column11, &hv_Distance4); - TupleSort(hv_Distance4, &hv_Sorted4); - TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(0,HTuple((hv_Sorted4.TupleLength())*0.1).TupleInt(),1), - &hv_Selected7); - TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(HTuple((hv_Sorted4.TupleLength())*0.9).TupleInt(),(hv_Sorted4.TupleLength())-1,1), - &hv_Selected8); - - (*hv_out_disRightLevel).Clear(); - (*hv_out_disRightLevel).Append(hv_Selected5.TupleMean()); - (*hv_out_disRightLevel).Append(hv_Selected6.TupleMean()); - (*hv_out_disRightLevel).Append(hv_Selected7.TupleMean()); - (*hv_out_disRightLevel).Append(hv_Selected8.TupleMean()); - (*hv_out_RightLevelLinePar).Clear(); - (*hv_out_RightLevelLinePar).Append(hv_V_Row2); - (*hv_out_RightLevelLinePar).Append(hv_V_Col2); - (*hv_out_RightLevelLinePar).Append(hv_V_Row22); - (*hv_out_RightLevelLinePar).Append(hv_V_Col22); - (*hv_out_RightLevelLinePar).Append(hv_V_Row3); - (*hv_out_RightLevelLinePar).Append(hv_V_Column3); - (*hv_out_RightLevelLinePar).Append(hv_V_Row33); - (*hv_out_RightLevelLinePar).Append(hv_V_Column33); - (*hv_out_standardPar).Clear(); - (*hv_out_standardPar).Append(hv_V_Row1); - (*hv_out_standardPar).Append(hv_V_Column1); - (*hv_out_standardPar).Append(hv_V_Row11); - (*hv_out_standardPar).Append(hv_V_Column11); - (*hv_out_standardPar).Append(hv_L_Row1); - (*hv_out_standardPar).Append(hv_L_Col1); - (*hv_out_standardPar).Append(hv_L_Row11); - (*hv_out_standardPar).Append(hv_L_Col11); - if (0 != (HTuple(((*hv_out_disRightLevel).TupleLength())==4).TupleAnd(((*hv_out_disRightLevel).TupleLength())==4))) - { - (*hv_out_Flag) = 0; - } - } - // catch (Exception) - catch (HException &HDevExpDefaultException) - { - HDevExpDefaultException.ToHTuple(&hv_Exception); - //stop () - } - return; -} - -// Chapter: Graphics / Text -// Short Description: This procedure writes a text message. -void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem, - HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box) -{ - - // Local iconic variables - - // Local control variables - HTuple hv_GenParamName, hv_GenParamValue; - - //This procedure displays text in a graphics window. - // - //Input parameters: - //WindowHandle: The WindowHandle of the graphics window, where - // the message should be displayed - //String: A tuple of strings containing the text message to be displayed - //CoordSystem: If set to 'window', the text position is given - // with respect to the window coordinate system. - // If set to 'image', image coordinates are used. - // (This may be useful in zoomed images.) - //Row: The row coordinate of the desired text position - // A tuple of values is allowed to display text at different - // positions. - //Column: The column coordinate of the desired text position - // A tuple of values is allowed to display text at different - // positions. - //Color: defines the color of the text as string. - // If set to [], '' or 'auto' the currently set color is used. - // If a tuple of strings is passed, the colors are used cyclically... - // - if |Row| == |Column| == 1: for each new textline - // = else for each text position. - //Box: If Box[0] is set to 'true', the text is written within an orange box. - // If set to' false', no box is displayed. - // If set to a color string (e.g. 'white', '#FF00CC', etc.), - // the text is written in a box of that color. - // An optional second value for Box (Box[1]) controls if a shadow is displayed: - // 'true' -> display a shadow in a default color - // 'false' -> display no shadow - // otherwise -> use given string as color string for the shadow color - // - //It is possible to display multiple text strings in a single call. - //In this case, some restrictions apply: - //- Multiple text positions can be defined by specifying a tuple - // with multiple Row and/or Column coordinates, i.e.: - // - |Row| == n, |Column| == n - // - |Row| == n, |Column| == 1 - // - |Row| == 1, |Column| == n - //- If |Row| == |Column| == 1, - // each element of String is display in a new textline. - //- If multiple positions or specified, the number of Strings - // must match the number of positions, i.e.: - // - Either |String| == n (each string is displayed at the - // corresponding position), - // - or |String| == 1 (The string is displayed n times). - // - // - //Convert the parameters for disp_text. - if (0 != (HTuple(hv_Row==HTuple()).TupleOr(hv_Column==HTuple()))) - { - return; - } - if (0 != (hv_Row==-1)) - { - hv_Row = 12; - } - if (0 != (hv_Column==-1)) - { - hv_Column = 12; - } - // - //Convert the parameter Box to generic parameters. - hv_GenParamName = HTuple(); - hv_GenParamValue = HTuple(); - if (0 != ((hv_Box.TupleLength())>0)) - { - if (0 != (HTuple(hv_Box[0])==HTuple("false"))) - { - //Display no box - hv_GenParamName = hv_GenParamName.TupleConcat("box"); - hv_GenParamValue = hv_GenParamValue.TupleConcat("false"); - } - else if (0 != (HTuple(hv_Box[0])!=HTuple("true"))) - { - //Set a color other than the default. - hv_GenParamName = hv_GenParamName.TupleConcat("box_color"); - hv_GenParamValue = hv_GenParamValue.TupleConcat(HTuple(hv_Box[0])); - } - } - if (0 != ((hv_Box.TupleLength())>1)) - { - if (0 != (HTuple(hv_Box[1])==HTuple("false"))) - { - //Display no shadow. - hv_GenParamName = hv_GenParamName.TupleConcat("shadow"); - hv_GenParamValue = hv_GenParamValue.TupleConcat("false"); - } - else if (0 != (HTuple(hv_Box[1])!=HTuple("true"))) - { - //Set a shadow color other than the default. - hv_GenParamName = hv_GenParamName.TupleConcat("shadow_color"); - hv_GenParamValue = hv_GenParamValue.TupleConcat(HTuple(hv_Box[1])); - } - } - //Restore default CoordSystem behavior. - if (0 != (hv_CoordSystem!=HTuple("window"))) - { - hv_CoordSystem = "image"; - } - // - if (0 != (hv_Color==HTuple(""))) - { - //disp_text does not accept an empty string for Color. - hv_Color = HTuple(); - } - // - DispText(hv_WindowHandle, hv_String, hv_CoordSystem, hv_Row, hv_Column, hv_Color, - hv_GenParamName, hv_GenParamValue); - return; -} - -// Chapter: XLD / Creation -// Short Description: Creates an arrow shaped XLD contour. -void gen_arrow_contour_xld (HObject *ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, - HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth) -{ - - // Local iconic variables - HObject ho_TempArrow; - - // Local control variables - HTuple hv_Length, hv_ZeroLengthIndices, hv_DR; - HTuple hv_DC, hv_HalfHeadWidth, hv_RowP1, hv_ColP1, hv_RowP2; - HTuple hv_ColP2, hv_Index; - - //This procedure generates arrow shaped XLD contours, - //pointing from (Row1, Column1) to (Row2, Column2). - //If starting and end point are identical, a contour consisting - //of a single point is returned. - // - //input parameteres: - //Row1, Column1: Coordinates of the arrows' starting points - //Row2, Column2: Coordinates of the arrows' end points - //HeadLength, HeadWidth: Size of the arrow heads in pixels - // - //output parameter: - //Arrow: The resulting XLD contour - // - //The input tuples Row1, Column1, Row2, and Column2 have to be of - //the same length. - //HeadLength and HeadWidth either have to be of the same length as - //Row1, Column1, Row2, and Column2 or have to be a single element. - //If one of the above restrictions is violated, an error will occur. - // - // - //Init - GenEmptyObj(&(*ho_Arrow)); - // - //Calculate the arrow length - DistancePp(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_Length); - // - //Mark arrows with identical start and end point - //(set Length to -1 to avoid division-by-zero exception) - hv_ZeroLengthIndices = hv_Length.TupleFind(0); - if (0 != (hv_ZeroLengthIndices!=-1)) - { - hv_Length[hv_ZeroLengthIndices] = -1; - } - // - //Calculate auxiliary variables. - hv_DR = (1.0*(hv_Row2-hv_Row1))/hv_Length; - hv_DC = (1.0*(hv_Column2-hv_Column1))/hv_Length; - hv_HalfHeadWidth = hv_HeadWidth/2.0; - // - //Calculate end points of the arrow head. - hv_RowP1 = (hv_Row1+((hv_Length-hv_HeadLength)*hv_DR))+(hv_HalfHeadWidth*hv_DC); - hv_ColP1 = (hv_Column1+((hv_Length-hv_HeadLength)*hv_DC))-(hv_HalfHeadWidth*hv_DR); - hv_RowP2 = (hv_Row1+((hv_Length-hv_HeadLength)*hv_DR))-(hv_HalfHeadWidth*hv_DC); - hv_ColP2 = (hv_Column1+((hv_Length-hv_HeadLength)*hv_DC))+(hv_HalfHeadWidth*hv_DR); - // - //Finally create output XLD contour for each input point pair - { - HTuple end_val45 = (hv_Length.TupleLength())-1; - HTuple step_val45 = 1; - for (hv_Index=0; hv_Index.Continue(end_val45, step_val45); hv_Index += step_val45) - { - if (0 != (HTuple(hv_Length[hv_Index])==-1)) - { - //Create_ single points for arrows with identical start and end point - GenContourPolygonXld(&ho_TempArrow, HTuple(hv_Row1[hv_Index]), HTuple(hv_Column1[hv_Index])); - } - else - { - //Create arrow contour - GenContourPolygonXld(&ho_TempArrow, ((((HTuple(hv_Row1[hv_Index]).TupleConcat(HTuple(hv_Row2[hv_Index]))).TupleConcat(HTuple(hv_RowP1[hv_Index]))).TupleConcat(HTuple(hv_Row2[hv_Index]))).TupleConcat(HTuple(hv_RowP2[hv_Index]))).TupleConcat(HTuple(hv_Row2[hv_Index])), - ((((HTuple(hv_Column1[hv_Index]).TupleConcat(HTuple(hv_Column2[hv_Index]))).TupleConcat(HTuple(hv_ColP1[hv_Index]))).TupleConcat(HTuple(hv_Column2[hv_Index]))).TupleConcat(HTuple(hv_ColP2[hv_Index]))).TupleConcat(HTuple(hv_Column2[hv_Index]))); - } - ConcatObj((*ho_Arrow), ho_TempArrow, &(*ho_Arrow)); - } - } - return; -} - -void Get_Rectangle2_Corner_new (HObject ho_Rectangle, HTuple *hv_out_Row, HTuple *hv_out_Col) -{ - - // Local iconic variables - HObject ho_Rectangle1, ho_Rectangle_XLD1; - - // Local control variables - HTuple hv_Row1, hv_Column1, hv_Phi1, hv_Length11; - HTuple hv_Length21, hv_Col1, hv_corner_row, hv_corner_col; - HTuple hv_rowSortIndex, hv_Exception; - - //********************************************************************** - //Function Name: Get_Rectangle2_Corner - //Author: ºúºº±ø - //Description: »ñȡ¾ØÐÎÇøÓòµĶ¥µã×ø±ê,(4¸öµã) - //Input: - // Rectangle, ¾ØÐεÄRegion, - //output£º - // row---¶¥µãrow×ø±꣬˳ÐòΪ£º×óÉÏ/ÓÒÉÏ/×óÏÂ/ÓÒÏ - // col---¶¥µãcol×ø±꣬˳ÐòΪ£º×óÉÏ/ÓÒÉÏ/×óÏÂ/ÓÒÏ - //verion change log: ºúºº±ø 2023-08-23 V1.1 Create new function - //******************************************************************************** - try - { - SmallestRectangle2(ho_Rectangle, &hv_Row1, &hv_Column1, &hv_Phi1, &hv_Length11, - &hv_Length21); - GenRectangle2(&ho_Rectangle1, hv_Row1, hv_Column1, hv_Phi1, hv_Length11, hv_Length21); - GenRectangle2ContourXld(&ho_Rectangle_XLD1, hv_Row1, hv_Column1, hv_Phi1, hv_Length11, - hv_Length21); - GetContourXld(ho_Rectangle_XLD1, &hv_Row1, &hv_Col1); - hv_corner_row.Clear(); - hv_corner_row.Append(HTuple(hv_Row1[0])); - hv_corner_row.Append(HTuple(hv_Row1[1])); - hv_corner_row.Append(HTuple(hv_Row1[2])); - hv_corner_row.Append(HTuple(hv_Row1[3])); - hv_corner_col.Clear(); - hv_corner_col.Append(HTuple(hv_Col1[0])); - hv_corner_col.Append(HTuple(hv_Col1[1])); - hv_corner_col.Append(HTuple(hv_Col1[2])); - hv_corner_col.Append(HTuple(hv_Col1[3])); - (*hv_out_Row) = HTuple(); - (*hv_out_Col) = HTuple(); - TupleSortIndex(hv_corner_row, &hv_rowSortIndex); - if (0 != (HTuple(hv_corner_col[HTuple(hv_rowSortIndex[0])])1)) - { - TupleStrFirstN(HTuple(hv_Directories[hv_Index]), 1, &hv_Substring); - if (0 != (HTuple(hv_Substring==HTuple("//")).TupleOr(hv_Substring==HTuple("\\\\")))) - { - hv_NetworkDrive[hv_Index] = 1; - } - } - } - } - } - hv_ImageFilesTmp = HTuple(); - { - HTuple end_val56 = (hv_Directories.TupleLength())-1; - HTuple step_val56 = 1; - for (hv_Index=0; hv_Index.Continue(end_val56, step_val56); hv_Index += step_val56) - { - FileExists(HTuple(hv_Directories[hv_Index]), &hv_FileExists); - if (0 != hv_FileExists) - { - ListFiles(HTuple(hv_Directories[hv_Index]), HTuple("files").TupleConcat(hv_Options), - &hv_AllFiles); - hv_ImageFilesTmp = HTuple(); - { - HTuple end_val61 = (hv_Extensions.TupleLength())-1; - HTuple step_val61 = 1; - for (hv_i=0; hv_i.Continue(end_val61, step_val61); hv_i += step_val61) - { - TupleRegexpSelect(hv_AllFiles, ((".*"+HTuple(hv_Extensions[hv_i]))+"$").TupleConcat("ignore_case"), - &hv_Selection); - hv_ImageFilesTmp = hv_ImageFilesTmp.TupleConcat(hv_Selection); - } - } - TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("\\\\").Append("replace_all")), - "/", &hv_ImageFilesTmp); - if (0 != (HTuple(hv_NetworkDrive[hv_Index]))) - { - TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("//").Append("replace_all")), - "/", &hv_ImageFilesTmp); - hv_ImageFilesTmp = "/"+hv_ImageFilesTmp; - } - else - { - TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("//").Append("replace_all")), - "/", &hv_ImageFilesTmp); - } - break; - } - } - } - //Concatenate the output image paths. - (*hv_ImageFiles) = (*hv_ImageFiles).TupleConcat(hv_ImageFilesTmp); - } - } - return; -} - -// Chapter: File / Misc -// Short Description: Parse a filename into directory, base filename, and extension -void parse_filename (HTuple hv_FileName, HTuple *hv_BaseName, HTuple *hv_Extension, - HTuple *hv_Directory) -{ - - // Local control variables - HTuple hv_DirectoryTmp, hv_Substring; - - //This procedure gets a filename (with full path) as input - //and returns the directory path, the base filename and the extension - //in three different strings. - // - //In the output path the path separators will be replaced - //by '/' in all cases. - // - //The procedure shows the possibilities of regular expressions in HALCON. - // - //Input parameters: - //FileName: The input filename - // - //Output parameters: - //BaseName: The filename without directory description and file extension - //Extension: The file extension - //Directory: The directory path - // - //Example: - //basename('C:/images/part_01.png',...) returns - //BaseName = 'part_01' - //Extension = 'png' - //Directory = 'C:\\images\\' (on Windows systems) - // - //Explanation of the regular expressions: - // - //'([^\\\\/]*?)(?:\\.[^.]*)?$': - //To start at the end, the '$' matches the end of the string, - //so it is best to read the expression from right to left. - //The part in brackets (?:\\.[^.}*) denotes a non-capturing group. - //That means, that this part is matched, but not captured - //in contrast to the first bracketed group ([^\\\\/], see below.) - //\\.[^.]* matches a dot '.' followed by as many non-dots as possible. - //So (?:\\.[^.]*)? matches the file extension, if any. - //The '?' at the end assures, that even if no extension exists, - //a correct match is returned. - //The first part in brackets ([^\\\\/]*?) is a capture group, - //which means, that if a match is found, only the part in - //brackets is returned as a result. - //Because both HDevelop strings and regular expressions need a '\\' - //to describe a backslash, inside regular expressions within HDevelop - //a backslash has to be written as '\\\\'. - //[^\\\\/] matches any character but a slash or backslash ('\\' in HDevelop) - //[^\\\\/]*? matches a string od 0..n characters (except '/' or '\\') - //where the '?' after the '*' switches the greediness off, - //that means, that the shortest possible match is returned. - //This option is necessary to cut off the extension - //but only if (?:\\.[^.]*)? is able to match one. - //To summarize, the regular expression matches that part of - //the input string, that follows after the last '/' or '\\' and - //cuts off the extension (if any) after the last '.'. - // - //'\\.([^.]*)$': - //This matches everything after the last '.' of the input string. - //Because ([^.]) is a capturing group, - //only the part after the dot is returned. - // - //'.*[\\\\/]': - //This matches the longest substring with a '/' or a '\\' at the end. - // - TupleRegexpMatch(hv_FileName, ".*[\\\\/]", &hv_DirectoryTmp); - TupleSubstr(hv_FileName, hv_DirectoryTmp.TupleStrlen(), (hv_FileName.TupleStrlen())-1, - &hv_Substring); - TupleRegexpMatch(hv_Substring, "([^\\\\/]*?)(?:\\.[^.]*)?$", &(*hv_BaseName)); - TupleRegexpMatch(hv_Substring, "\\.([^.]*)$", &(*hv_Extension)); - // - // - //Finally all found backslashes ('\\') are converted - //to a slash to get consistent paths - TupleRegexpReplace(hv_DirectoryTmp, (HTuple("\\\\").Append("replace_all")), "/", - &(*hv_Directory)); - return; -} - -void pts_to_best_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Cols, HTuple hv_ActiveNum, - HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2) -{ - - // Local iconic variables - HObject ho_Contour; - - // Local control variables - HTuple hv_Length, hv_Nr, hv_Nc, hv_Dist, hv_Length1; - - //³õʼ»¯ - (*hv_Row1) = 0; - (*hv_Column1) = 0; - (*hv_Row2) = 0; - (*hv_Column2) = 0; - //²úÉúһ¸ö¿յÄֱÏ߶ÔÏó£¬ÓÃÓڱ£´æÄâºϺóµÄֱÏß - GenEmptyObj(&(*ho_Line)); - //¼ÆËã±ßԵÊýÁ¿ - TupleLength(hv_Cols, &hv_Length); - //µ±±ßԵÊýÁ¿²»СÓÚÓÐЧµãÊýʱ½øÐÐÄâºÏ - if (0 != (HTuple(hv_Length>=hv_ActiveNum).TupleAnd(hv_ActiveNum>1))) - { - //halconµÄÄâºÏÊǻùÓÚxldµģ¬ÐèҪ°ѱßԵÁ¬½ӳÉxld - GenContourPolygonXld(&ho_Contour, hv_Rows, hv_Cols); - //smooth_contours_xld (Contour, SmoothedContours, 5) - //ÄâºÏֱÏߡ£ʹÓõÄË㷨ÊÇ'tukey'£¬ÆäËûË㷨Çë²ο¼fit_line_contour_xldµÄÃèÊö²¿·֡£ - //fit_line_contour_xld (Contour, 'tukey', |Rows|/3, |Rows|/3, 5, 2, Row1, Column1, Row2, Column2, Nr, Nc, Dist) - FitLineContourXld(ho_Contour, "tukey", -1, 0, 5, 2, &(*hv_Row1), &(*hv_Column1), - &(*hv_Row2), &(*hv_Column2), &hv_Nr, &hv_Nc, &hv_Dist); - //ÅжÏÄâºϽá¹ûÊǷñÓÐЧ£ºÈç¹ûÄâºϳɹ¦£¬Êý×éÖÐԪËصÄÊýÁ¿´óÓÚ0 - TupleLength(hv_Dist, &hv_Length1); - if (0 != (hv_Length1<1)) - { - return; - } - //¸ù¾ÝÄâºϽá¹û£¬²úÉúֱÏßxld - GenContourPolygonXld(&(*ho_Line), (*hv_Row1).TupleConcat((*hv_Row2)), (*hv_Column1).TupleConcat((*hv_Column2))); - } - - return; -} - -void pts_to_smooth_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Columns, HTuple hv_ActiveNum, - HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2) -{ - - // Local iconic variables - HObject ho_Contour, ho_SmoothedContours1; - - // Local control variables - HTuple hv_Length, hv_Nr, hv_Nc, hv_Dist, hv_Length1; - - - - - //²úÉúһ¸ö¿յÄֱÏ߶ÔÏó£¬ÓÃÓڱ£´æÄâºϺóµÄֱÏß - GenEmptyObj(&(*ho_Line)); - //¼ÆËã±ßԵÊýÁ¿ - TupleLength(hv_Rows, &hv_Length); - //µ±±ßԵÊýÁ¿²»СÓÚÓÐЧµãÊýʱ½øÐÐÄâºÏ - if (0 != (hv_Length>=10)) - { - //halconµÄÄâºÏÊǻùÓÚxldµģ¬ÐèҪ°ѱßԵÁ¬½ӳÉxld - GenContourPolygonXld(&ho_Contour, hv_Rows, hv_Columns); - SmoothContoursXld(ho_Contour, &ho_SmoothedContours1, 15); - //ÄâºÏֱÏߡ£ʹÓõÄË㷨ÊÇ'tukey'£¬ÆäËûË㷨Çë²ο¼fit_line_contour_xldµÄÃèÊö²¿·֡£ - //fit_line_contour_xld (SmoothedContours1, 'tukey', |Rows|/3, |Rows|/3, 5, 2, Row1, Column1, Row2, Column2, Nr, Nc, Dist) - FitLineContourXld(ho_SmoothedContours1, "tukey", -1, 0, 5, 2, &(*hv_Row1), &(*hv_Column1), - &(*hv_Row2), &(*hv_Column2), &hv_Nr, &hv_Nc, &hv_Dist); - - //ÅжÏÄâºϽá¹ûÊǷñÓÐЧ£ºÈç¹ûÄâºϳɹ¦£¬Êý×éÖÐԪËصÄÊýÁ¿´óÓÚ0 - TupleLength(hv_Dist, &hv_Length1); - if (0 != (hv_Length1<1)) - { - return; - } - //¸ù¾ÝÄâºϽá¹û£¬²úÉúֱÏßxld - GenContourPolygonXld(&(*ho_Line), (*hv_Row1).TupleConcat((*hv_Row2)), (*hv_Column1).TupleConcat((*hv_Column2))); - } - return; -} - -void rake (HObject ho_Image, HObject *ho_Regions, HTuple hv_Elements, HTuple hv_DetectHeight, - HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold, HTuple hv_Transition, - HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, HTuple hv_Column2, - HTuple *hv_ResultRow, HTuple *hv_ResultColumn) -{ - - // Local iconic variables - HObject ho_RegionLines, ho_Rectangle, ho_Arrow1; - HObject ho_Cross; - - // Local control variables - HTuple hv_Width, hv_Height, hv_ATan, hv_i, hv_RowC; - HTuple hv_ColC, hv_Distance, hv_RowL2, hv_RowL1, hv_ColL2; - HTuple hv_ColL1, hv_MsrHandle_Measure, hv_RowEdge, hv_ColEdge; - HTuple hv_Amplitude, hv_tRow, hv_tCol, hv_t, hv_Number; - HTuple hv_j; - - //»ñȡͼÏñ³ߴç - GetImageSize(ho_Image, &hv_Width, &hv_Height); - //²úÉúһ¸ö¿ÕÏÔʾ¶ÔÏó£¬ÓÃÓÚÏÔʾ - GenEmptyObj(&(*ho_Regions)); - //³õʼ»¯±ßԵ×ø±êÊý×é - (*hv_ResultRow) = HTuple(); - (*hv_ResultColumn) = HTuple(); - //²úÉúֱÏßxld - GenContourPolygonXld(&ho_RegionLines, hv_Row1.TupleConcat(hv_Row2), hv_Column1.TupleConcat(hv_Column2)); - //´洢µ½ÏÔʾ¶ÔÏó - ConcatObj((*ho_Regions), ho_RegionLines, &(*ho_Regions)); - //¼ÆËãֱÏßÓëxÖáµļнǣ¬ÄæʱÕ뷽ÏòΪÕýÏò¡£ - AngleLx(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_ATan); - - //±ßԵ¼ì²ⷽÏò´¹ֱÓڼì²âֱÏߣºֱÏ߷½ÏòÕýÏòÐýת90¡ãΪ±ßԵ¼ì²ⷽÏò - hv_ATan += HTuple(90).TupleRad(); - - //¸ù¾ݼì²âֱÏ߰´˳Ðò²úÉú²âÁ¿ÇøÓò¾ØÐΣ¬²¢´洢µ½ÏÔʾ¶ÔÏó - { - HTuple end_val18 = hv_Elements; - HTuple step_val18 = 1; - for (hv_i=1; hv_i.Continue(end_val18, step_val18); hv_i += step_val18) - { - //RowC := Row1+(((Row2-Row1)*i)/(Elements+1)) - //ColC := Column1+(Column2-Column1)*i/(Elements+1) - //if (RowC>Height-1 or RowC<0 or ColC>Width-1 or ColC<0) - //continue - //endif - //Èç¹ûֻÓÐһ¸ö²âÁ¿¾ØÐΣ¬×÷Ϊ¿¨³߹¤¾ߣ¬¿í¶ÈΪ¼ì²âֱÏߵij¤¶È - if (0 != (hv_Elements==1)) - { - hv_RowC = (hv_Row1+hv_Row2)*0.5; - hv_ColC = (hv_Column1+hv_Column2)*0.5; - //ÅжÏÊǷ񳬳öͼÏñ,³¬³ö²»¼ì²â±ßԵ - if (0 != (HTuple(HTuple(HTuple(hv_RowC>(hv_Height-1)).TupleOr(hv_RowC<0)).TupleOr(hv_ColC>(hv_Width-1))).TupleOr(hv_ColC<0))) - { - continue; - } - DistancePp(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_Distance); - hv_DetectWidth = hv_Distance; - GenRectangle2ContourXld(&ho_Rectangle, hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, - hv_Distance/2); - } - else - { - //Èç¹ûÓжà¸ö²âÁ¿¾ØÐΣ¬²úÉú¸òâÁ¿¾ØÐÎxld - hv_RowC = hv_Row1+(((hv_Row2-hv_Row1)*(hv_i-1))/(hv_Elements-1)); - hv_ColC = hv_Column1+(((hv_Column2-hv_Column1)*(hv_i-1))/(hv_Elements-1)); - //ÅжÏÊǷ񳬳öͼÏñ,³¬³ö²»¼ì²â±ßԵ - if (0 != (HTuple(HTuple(HTuple(hv_RowC>(hv_Height-1)).TupleOr(hv_RowC<0)).TupleOr(hv_ColC>(hv_Width-1))).TupleOr(hv_ColC<0))) - { - continue; - } - GenRectangle2ContourXld(&ho_Rectangle, hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, - hv_DetectWidth/2); - } - - //°ѲâÁ¿¾ØÐÎxld´洢µ½ÏÔʾ¶ÔÏó - ConcatObj((*ho_Regions), ho_Rectangle, &(*ho_Regions)); - if (0 != (hv_i==1)) - { - //ÔڵÚһ¸ö²âÁ¿¾ØÐλæÖÆһ¸ö¼ýͷxld£¬ÓÃÓÚֻÊDZßԵ¼ì²ⷽÏò - hv_RowL2 = hv_RowC+((hv_DetectHeight/2)*((-hv_ATan).TupleSin())); - hv_RowL1 = hv_RowC-((hv_DetectHeight/2)*((-hv_ATan).TupleSin())); - hv_ColL2 = hv_ColC+((hv_DetectHeight/2)*((-hv_ATan).TupleCos())); - hv_ColL1 = hv_ColC-((hv_DetectHeight/2)*((-hv_ATan).TupleCos())); - gen_arrow_contour_xld(&ho_Arrow1, hv_RowL1, hv_ColL1, hv_RowL2, hv_ColL2, 25, - 25); - //°Ñxld´洢µ½ÏÔʾ¶ÔÏó - ConcatObj((*ho_Regions), ho_Arrow1, &(*ho_Regions)); - } - //²úÉú²âÁ¿¶ÔÏó¾ä±ú - GenMeasureRectangle2(hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, hv_DetectWidth/2, - hv_Width, hv_Height, "nearest_neighbor", &hv_MsrHandle_Measure); - - - //ÉèÖü«ÐÔ - if (0 != (hv_Transition==HTuple("negative"))) - { - hv_Transition = "negative"; - } - else - { - if (0 != (hv_Transition==HTuple("positive"))) - { - - hv_Transition = "positive"; - } - else - { - hv_Transition = "all"; - } - } - //ÉèÖñßԵλÖá£×îǿµãÊǴÓËùÓбßԵÖÐѡÔñ·ù¶Ⱦø¶Ôֵ×î´óµ㣬ÐèҪÉèÖÃΪ'all' - if (0 != (hv_Select==HTuple("first"))) - { - hv_Select = "first"; - } - else - { - if (0 != (hv_Select==HTuple("last"))) - { - - hv_Select = "last"; - } - else - { - hv_Select = "all"; - } - } - //¼ì²â±ßԵ - MeasurePos(ho_Image, hv_MsrHandle_Measure, hv_Sigma, hv_Threshold, hv_Transition, - hv_Select, &hv_RowEdge, &hv_ColEdge, &hv_Amplitude, &hv_Distance); - //Çå³ý²âÁ¿¶ÔÏó¾ä±ú - CloseMeasure(hv_MsrHandle_Measure); - GenCrossContourXld(&ho_Cross, hv_RowEdge, hv_ColEdge, 6, 0.785398); - //ÁÙʱ±äÁ¿³õʼ»¯ - //tRow£¬tCol±£´æÕҵ½ָ¶¨±ßԵµÄ×ø±ê - hv_tRow = 0; - hv_tCol = 0; - //t±£´æ±ßԵµķù¶Ⱦø¶Ôֵ - hv_t = 0; - //Õҵ½µıßԵ±ØÐëÖÁÉÙΪ1¸ö - TupleLength(hv_RowEdge, &hv_Number); - if (0 != (hv_Number<1)) - { - continue; - } - //Óжà¸ö±ßԵʱ£¬ѡÔñ·ù¶Ⱦø¶Ôֵ×î´óµıßԵ - { - HTuple end_val101 = hv_Number-1; - HTuple step_val101 = 1; - for (hv_j=0; hv_j.Continue(end_val101, step_val101); hv_j += step_val101) - { - if (0 != ((HTuple(hv_Amplitude[hv_j]).TupleAbs())>hv_t)) - { - - hv_tRow = HTuple(hv_RowEdge[hv_j]); - hv_tCol = HTuple(hv_ColEdge[hv_j]); - hv_t = HTuple(hv_Amplitude[hv_j]).TupleAbs(); - } - } - } - //°ÑÕҵ½µıßԵ±£´æÔÚÊä³öÊý×é - if (0 != (hv_t>0)) - { - (*hv_ResultRow) = (*hv_ResultRow).TupleConcat(hv_tRow); - (*hv_ResultColumn) = (*hv_ResultColumn).TupleConcat(hv_tCol); - } - } - } - - return; -} - -// Chapter: Graphics / Text -// Short Description: Set font independent of OS -void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold, - HTuple hv_Slant) -{ - - // Local iconic variables - - // Local control variables - HTuple hv_OS, hv_Fonts, hv_Style, hv_Exception; - HTuple hv_AvailableFonts, hv_Fdx, hv_Indices; - - //This procedure sets the text font of the current window with - //the specified attributes. - // - //Input parameters: - //WindowHandle: The graphics window for which the font will be set - //Size: The font size. If Size=-1, the default of 16 is used. - //Bold: If set to 'true', a bold font is used - //Slant: If set to 'true', a slanted font is used - // - GetSystem("operating_system", &hv_OS); - if (0 != (HTuple(hv_Size==HTuple()).TupleOr(hv_Size==-1))) - { - hv_Size = 16; - } - if (0 != ((hv_OS.TupleSubstr(0,2))==HTuple("Win"))) - { - //Restore previous behaviour - hv_Size = (1.13677*hv_Size).TupleInt(); - } - else - { - hv_Size = hv_Size.TupleInt(); - } - if (0 != (hv_Font==HTuple("Courier"))) - { - hv_Fonts.Clear(); - hv_Fonts[0] = "Courier"; - hv_Fonts[1] = "Courier 10 Pitch"; - hv_Fonts[2] = "Courier New"; - hv_Fonts[3] = "CourierNew"; - hv_Fonts[4] = "Liberation Mono"; - } - else if (0 != (hv_Font==HTuple("mono"))) - { - hv_Fonts.Clear(); - hv_Fonts[0] = "Consolas"; - hv_Fonts[1] = "Menlo"; - hv_Fonts[2] = "Courier"; - hv_Fonts[3] = "Courier 10 Pitch"; - hv_Fonts[4] = "FreeMono"; - hv_Fonts[5] = "Liberation Mono"; - } - else if (0 != (hv_Font==HTuple("sans"))) - { - hv_Fonts.Clear(); - hv_Fonts[0] = "Luxi Sans"; - hv_Fonts[1] = "DejaVu Sans"; - hv_Fonts[2] = "FreeSans"; - hv_Fonts[3] = "Arial"; - hv_Fonts[4] = "Liberation Sans"; - } - else if (0 != (hv_Font==HTuple("serif"))) - { - hv_Fonts.Clear(); - hv_Fonts[0] = "Times New Roman"; - hv_Fonts[1] = "Luxi Serif"; - hv_Fonts[2] = "DejaVu Serif"; - hv_Fonts[3] = "FreeSerif"; - hv_Fonts[4] = "Utopia"; - hv_Fonts[5] = "Liberation Serif"; - } - else - { - hv_Fonts = hv_Font; - } - hv_Style = ""; - if (0 != (hv_Bold==HTuple("true"))) - { - hv_Style += HTuple("Bold"); - } - else if (0 != (hv_Bold!=HTuple("false"))) - { - hv_Exception = "Wrong value of control parameter Bold"; - throw HException(hv_Exception); - } - if (0 != (hv_Slant==HTuple("true"))) - { - hv_Style += HTuple("Italic"); - } - else if (0 != (hv_Slant!=HTuple("false"))) - { - hv_Exception = "Wrong value of control parameter Slant"; - throw HException(hv_Exception); - } - if (0 != (hv_Style==HTuple(""))) - { - hv_Style = "Normal"; - } - QueryFont(hv_WindowHandle, &hv_AvailableFonts); - hv_Font = ""; - { - HTuple end_val48 = (hv_Fonts.TupleLength())-1; - HTuple step_val48 = 1; - for (hv_Fdx=0; hv_Fdx.Continue(end_val48, step_val48); hv_Fdx += step_val48) - { - hv_Indices = hv_AvailableFonts.TupleFind(HTuple(hv_Fonts[hv_Fdx])); - if (0 != ((hv_Indices.TupleLength())>0)) - { - if (0 != (HTuple(hv_Indices[0])>=0)) - { - hv_Font = HTuple(hv_Fonts[hv_Fdx]); - break; - } - } - } - } - if (0 != (hv_Font==HTuple(""))) - { - throw HException("Wrong value of control parameter Font"); - } - hv_Font = (((hv_Font+"-")+hv_Style)+"-")+hv_Size; - SetFont(hv_WindowHandle, hv_Font); - return; -} - -#ifndef NO_EXPORT_MAIN -// Main procedure -void action() -{ - - // Local iconic variables - HObject ho_in_image, ho_LineRegion, ho_RegionLines; - HObject ho_RegionLines1, ho_CopyImage1, ho_CopyImage2, ho_CopyImage3; - HObject ho_MultiChannelImage, ho_RegionDilation; - - // Local control variables - HTuple hv_In_Resolution, hv_ImagePath, hv_ImageFiles; - HTuple hv_in_ProductType, hv_WindowHandle, hv_Index, hv_BaseName; - HTuple hv_Extension, hv_Directory, hv_T1, hv_out_standardPar; - HTuple hv_out_Flag, hv_out_disLeftVertical, hv_out_LeftVerticalLinePar; - HTuple hv_out_disLeftLevel, hv_out_LeftLevelLinePar, hv_out_disRightVertical; - HTuple hv_out_RightVerticalLinePar, hv_out_disRightLevel; - HTuple hv_out_RightLevelLinePar, hv_T2, hv_T, hv_index1; - HTuple hv_index2, hv_index3, hv_index4, hv_index5; - - // import(...); only in hdevelop - - //Ïà»ú¾«¶È. - hv_In_Resolution = 0.032; - //ͼÏñ·¾¶ - hv_ImagePath = "C:/Users/86198/Desktop/AÎóÅÐ"; - //ÐòÁл¯ͼÏñ·¾¶ - list_image_files(hv_ImagePath, "default", HTuple(), &hv_ImageFiles); - - //ÓŻ¯ÄÚÈÝ: - //1,185-2ͼÏñͨµÀ²»һÖµÄÎÊÌâ.(¸ÄÆعâ) - //2,185-2µÄAºÍBͨµÀ²úƷ²»һÖÂÎÊÌâ, - //3, ÂÁ°帽½üµıßԵ½ºÈçºνøÐд¦Àí, - - //in_ProductType := '181-1' - hv_in_ProductType = "181-2"; - - //in_ProductType := '185-1' - //in_ProductType := '185-2' - //in_ProductType := '186-1' - //in_ProductType := '186-2' - - - if (HDevWindowStack::IsOpen()) - hv_WindowHandle = HDevWindowStack::GetActive(); - set_display_font(hv_WindowHandle, 20, "mono", "true", "false"); - { - HTuple end_val25 = (hv_ImageFiles.TupleLength())-1; - HTuple step_val25 = 1; - for (hv_Index=0; hv_Index.Continue(end_val25, step_val25); hv_Index += step_val25) - { - ReadImage(&ho_in_image, HTuple(hv_ImageFiles[hv_Index])); - parse_filename(HTuple(hv_ImageFiles[hv_Index]), &hv_BaseName, &hv_Extension, - &hv_Directory); - CountSeconds(&hv_T1); - cal_distanceJiao_4(ho_in_image, hv_in_ProductType, &hv_out_standardPar, &hv_out_Flag, - &hv_out_disLeftVertical, &hv_out_LeftVerticalLinePar, &hv_out_disLeftLevel, - &hv_out_LeftLevelLinePar, &hv_out_disRightVertical, &hv_out_RightVerticalLinePar, - &hv_out_disRightLevel, &hv_out_RightLevelLinePar); - CountSeconds(&hv_T2); - - hv_T = hv_T2-hv_T1; - if (0 != (hv_out_Flag==1)) - { - if (HDevWindowStack::IsOpen()) - ClearWindow(HDevWindowStack::GetActive()); - if (HDevWindowStack::IsOpen()) - DispObj(ho_in_image, HDevWindowStack::GetActive()); - disp_message(hv_WindowHandle, "δץµ½Ïß", "window", 100, 100, "green", "false"); - // stop(...); only in hdevelop - continue; - } - //stop () - GenEmptyRegion(&ho_LineRegion); - //µ÷ÊÔ, »­ÏßÓÃ, - { - HTuple end_val43 = (hv_out_LeftVerticalLinePar.TupleLength())-1; - HTuple step_val43 = 4; - for (hv_index1=0; hv_index1.Continue(end_val43, step_val43); hv_index1 += step_val43) - { - GenRegionLine(&ho_RegionLines, HTuple(hv_out_LeftVerticalLinePar[hv_index1]), - HTuple(hv_out_LeftVerticalLinePar[hv_index1+1]), HTuple(hv_out_LeftVerticalLinePar[hv_index1+2]), - HTuple(hv_out_LeftVerticalLinePar[hv_index1+3])); - Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); - } - } - - { - HTuple end_val48 = (hv_out_LeftVerticalLinePar.TupleLength())-1; - HTuple step_val48 = 4; - for (hv_index2=0; hv_index2.Continue(end_val48, step_val48); hv_index2 += step_val48) - { - GenRegionLine(&ho_RegionLines, HTuple(hv_out_LeftLevelLinePar[hv_index2]), - HTuple(hv_out_LeftLevelLinePar[hv_index2+1]), HTuple(hv_out_LeftLevelLinePar[hv_index2+2]), - HTuple(hv_out_LeftLevelLinePar[hv_index2+3])); - - Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); - } - } - - { - HTuple end_val54 = (hv_out_RightVerticalLinePar.TupleLength())-1; - HTuple step_val54 = 4; - for (hv_index3=0; hv_index3.Continue(end_val54, step_val54); hv_index3 += step_val54) - { - GenRegionLine(&ho_RegionLines, HTuple(hv_out_RightVerticalLinePar[hv_index3]), - HTuple(hv_out_RightVerticalLinePar[hv_index3+1]), HTuple(hv_out_RightVerticalLinePar[hv_index3+2]), - HTuple(hv_out_RightVerticalLinePar[hv_index3+3])); - - Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); - } - } - - { - HTuple end_val60 = (hv_out_RightLevelLinePar.TupleLength())-1; - HTuple step_val60 = 4; - for (hv_index4=0; hv_index4.Continue(end_val60, step_val60); hv_index4 += step_val60) - { - GenRegionLine(&ho_RegionLines, HTuple(hv_out_RightLevelLinePar[hv_index4]), - HTuple(hv_out_RightLevelLinePar[hv_index4+1]), HTuple(hv_out_RightLevelLinePar[hv_index4+2]), - HTuple(hv_out_RightLevelLinePar[hv_index4+3])); - Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); - } - } - - { - HTuple end_val65 = (hv_out_standardPar.TupleLength())-1; - HTuple step_val65 = 4; - for (hv_index5=0; hv_index5.Continue(end_val65, step_val65); hv_index5 += step_val65) - { - - GenRegionLine(&ho_RegionLines1, HTuple(hv_out_standardPar[hv_index5]), HTuple(hv_out_standardPar[hv_index5+1]), - HTuple(hv_out_standardPar[hv_index5+2]), HTuple(hv_out_standardPar[hv_index5+3])); - - Union2(ho_LineRegion, ho_RegionLines1, &ho_LineRegion); - } - } - - CopyImage(ho_in_image, &ho_CopyImage1); - CopyImage(ho_in_image, &ho_CopyImage2); - CopyImage(ho_in_image, &ho_CopyImage3); - Compose3(ho_CopyImage1, ho_CopyImage2, ho_CopyImage3, &ho_MultiChannelImage); - DilationCircle(ho_LineRegion, &ho_RegionDilation, 5.5); - OverpaintRegion(ho_MultiChannelImage, ho_RegionDilation, ((HTuple(255).Append(0)).Append(0)), - "fill"); - - if (HDevWindowStack::IsOpen()) - DispObj(ho_MultiChannelImage, HDevWindowStack::GetActive()); - disp_message(hv_WindowHandle, hv_out_disLeftVertical*hv_In_Resolution, "window", - 100, 100, "green", "false"); - disp_message(hv_WindowHandle, hv_out_disLeftLevel*hv_In_Resolution, "window", - 100, 300, "green", "false"); - - disp_message(hv_WindowHandle, hv_out_disRightVertical*hv_In_Resolution, "window", - 100, 700, "green", "false"); - disp_message(hv_WindowHandle, hv_out_disRightLevel*hv_In_Resolution, "window", - 100, 900, "green", "false"); - // stop(...); only in hdevelop - } - } - - // stop(...); only in hdevelop - - -} - - - - -#endif - - diff --git a/src/mission/581-Ruke/581-Ruke.cpp b/src/mission/581-Ruke/581-Ruke.cpp deleted file mode 100644 index 2c76968..0000000 --- a/src/mission/581-Ruke/581-Ruke.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Ruke.h> - -mission* createMission() { - return new _581_Ruke(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/581-Ruke/581-Ruke.h b/src/mission/581-Ruke/581-Ruke.h deleted file mode 100644 index 2a6b620..0000000 --- a/src/mission/581-Ruke/581-Ruke.h +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include - -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; - -#pragma endregion - -class _581_Ruke : public mission { -public: - _581_Union_triggerTemplate ruke_cam1_3; - _581_Union_triggerTemplate ruke_cam2_1; - _581_Union_triggerTemplate ruke_cam3_3; - _581_Union_triggerTemplate ruke_cam4_1; - detParams _params; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - ruke_cam1_3.init("Camera1", "入壳相机1下", 18000, 2, 3, &_params, _serviceManager, bridge, generalAlgoTest); - ruke_cam2_1.init("Camera2", "入壳相机2左", 18200, 2, 1,& _params, _serviceManager, bridge, generalAlgoTest); - ruke_cam3_3.init("Camera3", "入壳相机3上", 18400, 2, 3, &_params, _serviceManager, bridge, generalAlgoTest); - ruke_cam4_1.init("Camera4", "入壳相机4右", 18600, 2, 1, &_params, _serviceManager, bridge, generalAlgoTest); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp deleted file mode 100644 index 1a09e77..0000000 --- a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include <581_RuanLianJie_majiatiejiao.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} - -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h deleted file mode 100644 index c53f7c7..0000000 --- a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h +++ /dev/null @@ -1,284 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class RuanLianJie_majiatiejiao { -public: - -}; -#if 0 -bool top_tiejiaojianece(std::shared_ptr data, RuanLianJie_majiatiejiao* _detParams, sx_581_address address) { - try{ -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - data->oriImgs[0] = cv::imread("D:\\testImage\\Camera1.bmp", -1); - QByteArray plcResult = "2"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - HDevEngineCpp::HDevProcedure proc("_4_Inspection_Packaging_tape"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HObject in_Image; - in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.Execute();//执行halcon程序 - - HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDeTails; - out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle"); - out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle"); - //out_NgDeTails = procedureCall.GetOutputCtrlParamTuple("out_NgDeTails"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - - int flag = out_Flag.D(); - std::string NgDeTails = out_NgDeTails.ToString(); - plcResult = "1"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - if (flag == 1) - { - int out_GlueRectangle_L = out_GlueRectangle.Length(); - for (auto i = 0; i < out_GlueRectangle_L / 4; i++) - cv::rectangle(Paint, - cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1], - out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]), - cv::Scalar(0, 255, 0), 5); - textPainter.putText(Paint, - "OK", - cv::Point(0, 50), cv::Scalar(0, 255, 0)); - } - else - { - int out_ErrRectangle_L = out_ErrRectangle.Length(); - for (auto i = 0; i < out_ErrRectangle_L / 4; i++) - cv::rectangle(Paint, - cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1], - out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]), - cv::Scalar(0, 255, 0), 5); - textPainter.putText(Paint, - "NG", - cv::Point(0, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - } - plcResult = "1"; - sourceImg.release(); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; -} -#endif -bool tiejiaojianece(std::shared_ptr data, RuanLianJie_majiatiejiao * _detParams, sx_581_address address) { - try { -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - //data->oriImgs[0] = cv::imread("D:\\testImage\\" + data->cameraKeyName + ".bmp",-1); - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - HDevEngineCpp::HDevProcedure proc("_3_Inspection_Packaging_Tape"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HObject in_Image; - in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.Execute();//执行halcon程序 - - HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDetails; - out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle"); - out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle"); - out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - - int flag = out_Flag.D(); - std::string NgDeTails = gbkToUtf8(out_NgDetails.ToString().Text()); - plcResult = "1"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - if (flag == 1) - { - int out_GlueRectangle_L = out_GlueRectangle.Length(); - for (auto i = 0; i < out_GlueRectangle_L / 4; i++) - cv::rectangle(Paint, - cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1], - out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]), - cv::Scalar(0, 255, 0), 5); - textPainter.putText(Paint, - "OK", - cv::Point(0, 50), cv::Scalar(0, 255, 0)); - } - else - { - int out_ErrRectangle_L = out_ErrRectangle.Length(); - for (auto i = 0; i < out_ErrRectangle_L / 4; i++) - cv::rectangle(Paint, - cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1], - out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]), - cv::Scalar(0, 0, 255), 10); - textPainter.putText(Paint,"NG",cv::Point(0, 50), cv::Scalar(0, 0, 255)); - textPainter.putText(Paint, NgDeTails, cv::Point(0, 550), cv::Scalar(0, 0, 255)); - plcResult = "2"; - } - if(data->service->_paramSyncManager->get("通用设置","强制OK",false).toBool()) - plcResult = "1"; - sourceImg.release(); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 0, 255)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool()) - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - return true; -} -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_1; - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_2; - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_3; - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_4; - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_1; - _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_2; - - RuanLianJie_majiatiejiao DetParams; - //RuanLianJie_majiatiejiao lvDetParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - dingbu_1.init("Camera1", "马甲贴胶检测-A面-顶部相机-相机1", { { 5000, 1,{5010},"5002","5006",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-顶部相机-相机1"); - dingbu_2.init("Camera2", "马甲贴胶检测-B面-顶部相机-相机1", { { 5100, 1,{5110},"5102","5106",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-顶部相机-相机1"); - dibu_1.init("Camera3", "马甲贴胶检测-A面-底部相机-相机1", { { 5200, 1,{5210},"5202","5206",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机1"); - dibu_2.init("Camera4", "马甲贴胶检测-A面-底部相机-相机2", { { 5300, 1,{5310},"5302","5306",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机2"); - dibu_3.init("Camera5", "马甲贴胶检测-B面-底部相机-相机1", { { 5400, 1,{5410},"5402","5406",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机1"); - dibu_4.init("Camera6", "马甲贴胶检测-B面-底部相机-相机2", { { 5500, 1,{5510},"5502","5506",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机2"); - - - -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt b/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp deleted file mode 100644 index 8202c43..0000000 --- a/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp +++ /dev/null @@ -1,424 +0,0 @@ -#include <581_Ruanlianjie_hanqian_hanhou.h> -void exceptionResume(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - -} -void exceptionResume(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - -} -bool HanQianDingWei(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address){ - try - { - bool zuoLJPtoGaiBanEnable = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离判定启用", false).toBool(); - double zuoLJPtoGaiBanMaxThreshold = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离(MAX)", 1.8).toDouble(); - double zuoLJPtoGaiBanMinThreshold = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离(MIN)", 0.0).toDouble(); - - bool youLJPtoGaiBanEnable = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离判定启用", false).toBool(); - double youLJPtoGaiBanMaxThreshold = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离(MAX)", 1.8).toDouble(); - double youLJPtoGaiBanMinThreshold = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离(MIN)", 0.0).toDouble(); - - QByteArray plcResult = "1"; - //data->oriImgs[0] = cv::imread("D://60A01MB5601FB2P246404_Camera1_0_00-43-53.bmp",-1); - cv::Mat sourceImg = data->oriImgs[0]; - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - HDevEngineCpp::HDevProcedure proc("_3_HQDW_Inspection"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - - HTuple in_Resolution(0.0349425), in_FilePath("./halconFiles/"); - HObject inputImage = MatToHObject(sourceImg); - - procedureCall.SetInputIconicParamObject("in_Image", inputImage); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute();//执行halcon程序 - HTuple out_ColorType; - HTuple out_Distance; - HTuple out_CCDistance; - HTuple make; - HObject out_DisplayImage; - //out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 - out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出控制类变量 - //out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 - out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 - make = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage");//获取输出控制类变量 - int flag = make.D(); - - // Output(HTuple): out_ColorType, 1, 铜; 2,铝 - - //正确的应该左边铝 右边铜 - double value1_1 = 0, value1_2 = 0, value2_1 = 0, value2_2 = 0; - bool jiXingEnable = data->service->_paramSyncManager->get("焊前定位", "焊前极性判定启用", false).toBool(); - if (flag == 1) - { - //circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5); - //for (int i = 0; i < 2 ; i++) - //{ - // cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), - // cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - // cv::Scalar(0, 255, 0), 10); - //} - bool isNg = false; - TextRendererZH textPainter(Paint.cols, Paint.rows, 200); - Paint = HObject2Mat(out_DisplayImage); - if (out_Distance.Length() == 3) { - value1_1 = out_Distance[1].D(); - value1_2 = out_Distance[2].D(); - - textPainter.putText(Paint, "铜极+铝极连接片中心距离:" + std::to_string(out_Distance[0].D()) + "mm", cv::Point(0, sourceImg.rows - 950), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "电芯上水平边缘和注液孔的中心圆的距离:" + std::to_string(out_Distance[1].D()) + "mm", cv::Point(0, sourceImg.rows - 750), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "电芯下水平边缘和注液孔的中心圆的距离:" + std::to_string(out_Distance[2].D()) + "mm", cv::Point(0, sourceImg.rows - 550), cv::Scalar(0, 255, 0)); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance[0].D())); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr+2) + "_" + QByteArray::number(out_Distance[1].D())); - - data->sqlVec.insert({ "电芯上水平边缘和注液孔的中心圆的距离", out_Distance[1].D() }); - data->sqlVec.insert({ "电芯下水平边缘和注液孔的中心圆的距离", out_Distance[2].D() }); - } - if (out_CCDistance.Length() == 2) { - value2_1 = out_CCDistance[0].D(); - if (zuoLJPtoGaiBanMaxThreshold < value2_1 || zuoLJPtoGaiBanMinThreshold > value2_1) {//NG - textPainter.putText(Paint, "左侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_1) + "mm", cv::Point(0, sourceImg.rows - 350), cv::Scalar(0, 0, 255)); - if (zuoLJPtoGaiBanEnable == true) - isNg = true; - } - else//OK - textPainter.putText(Paint, "左侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_1) + "mm", cv::Point(0, sourceImg.rows - 350), cv::Scalar(0, 255, 0)); - - value2_2 = out_CCDistance[1].D(); - if (youLJPtoGaiBanMaxThreshold < value2_2 || youLJPtoGaiBanMinThreshold > value2_2) {//NG - textPainter.putText(Paint, "右侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_2) + "mm", cv::Point(0, sourceImg.rows - 150), cv::Scalar(0, 0, 255)); - if(youLJPtoGaiBanEnable == true) - isNg = true; - } - else - textPainter.putText(Paint, "右侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_2) + "mm", cv::Point(0, sourceImg.rows - 150), cv::Scalar(0, 255, 0)); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(out_CCDistance[0].D())); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(out_Distance[1].D())); - - data->sqlVec.insert({ "左侧连接片圆心和盖板圆心的距离", out_CCDistance[0].D() }); - data->sqlVec.insert({ "右侧连接片圆心和盖板圆心的距离", out_CCDistance[1].D() }); - } - - TextRendererZH textPainter2(Paint.cols, Paint.rows, 600); - int left = out_ColorType[0].D(); - //结果判定,铜在左边,铝在右边 - if (left == 2) - textPainter2.putText(Paint,"铜",cv::Point(0, 1500), cv::Scalar(0, 255, 0)); - else if (left == 1) - textPainter2.putText(Paint,"铝",cv::Point(0, 1500), cv::Scalar(0, 0, 255)); - else - textPainter2.putText(Paint,"异常",cv::Point(0, 1500), cv::Scalar(0, 0, 255)); - - int right = out_ColorType[1].D(); - if (right == 2) - textPainter2.putText(Paint,"铜",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 0, 255)); - else if (right == 1) - textPainter2.putText(Paint,"铝",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 255, 0)); - else - textPainter2.putText(Paint,"异常",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 0, 255)); - - if ((left == 1 || right == 2) && jiXingEnable) - isNg = true; - - TextRendererZH textPainter3(Paint.cols, Paint.rows, 800); - if(isNg == true){ - textPainter3.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->halconOK = false; - } - else { - textPainter3.putText(Paint, "OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - } - } - else - { - TextRendererZH textPainter4(Paint.cols, Paint.rows, 500); - textPainter4.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255));//调机 - plcResult = "2"; - data->halconOK = false; - } - if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool()) - plcResult = "1"; - data->resultImgs.push_back(Paint); - sourceImg.release(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测失败"); - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - return false; -} - -bool HanHou2D_halconEvaluate(std::shared_ptr data, const cv::Mat& sourceImg,const cv::Mat& segImg, cv::Mat& Paint, double& hanHouTongXingDu, int times,QMutex* mutex) { - double tongXingDuLimitHigh = data->service->_paramSyncManager->get("焊后", "焊后同心度mm(上限)", 1.8).toDouble(); - double tongXingDuLimitLow = data->service->_paramSyncManager->get("焊后", "焊后同心度mm(下限)", 0).toDouble(); - bool tongXingDuLimitEnable = data->service->_paramSyncManager->get("焊后", "焊后同心度判定启用", true).toBool(); - HDevEngineCpp::HDevProcedure proc("_3_Cal_HY_CC_Distance"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - - HObject in_Image = MatToHObject(sourceImg); - HObject in_ImageSeg = MatToHObject(segImg); - HalconCpp::HTuple in_FliePath("./halconFiles/"), in_Resolution(0.013736); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputIconicParamObject("in_ImageSeg", in_ImageSeg); - procedureCall.SetInputCtrlParamTuple("in_FliePath", in_FliePath); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.Execute();//执行halcon程序 - HalconCpp::HTuple out_CCDistance, out_Circle, out_Flag, out_NgTails; - out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 - out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails");//获取输出控制类变量 - int flag = out_Flag.D(); - bool isNg = false; - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - QMutexLocker locker(mutex); - if (flag == 1){ - - - double CCDistance = out_CCDistance.D(); - textPainter.putText(Paint, "焊印同心度:" + std::to_string(CCDistance), cv::Point(0, 50), cv::Scalar(0, 255, 0)); - - cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 15); - cv::circle(Paint, cv::Point(out_Circle[4].D(), out_Circle[3].D()), out_Circle[5].D(), cv::Scalar(0, 255, 0), 15); - if (CCDistance > tongXingDuLimitHigh || CCDistance < tongXingDuLimitLow){ - textPainter.putText(Paint, "同心度NG", cv::Point(10, 450), cv::Scalar(0, 0, 255)); - data->halconOK = false; - if(tongXingDuLimitEnable == true) - isNg = true; - } - } - else{ - textPainter.putText(Paint, "焊印抓取NG", cv::Point(10, 150), cv::Scalar(0, 0, 255)); - textPainter.putText(Paint, gbkToUtf8(out_NgTails.ToString().Text()), cv::Point(10, 450), cv::Scalar(0, 0, 255)); - if (tongXingDuLimitEnable == true) - isNg = true; - data->halconOK = false; - } - return isNg; -} -bool HanHou2D_handleAiEvaluate(std::shared_ptr data, hanHouJianCe* _detParams,const cv::Mat& sourceImg, cv::Mat& Paint,QMutex* mutex,cv::Point paintOffset) { - double hanZhaFillterWidth = data->service->_paramSyncManager->get("焊后", "焊渣过滤值宽mm(上限)", 0.1).toDouble()/ 0.013736; - double hanZhaFillterHeight = data->service->_paramSyncManager->get("焊后", "焊渣过滤值高mm(上限)", 0.1).toDouble()/ 0.013736; - bool hanZhaEnable = data->service->_paramSyncManager->get("焊后", "焊渣判定启用", false).toBool(); - - cv::Mat forSeg; - cv::resize(sourceImg, forSeg, cv::Size(), 0.5, 0.5); - - cv::Mat SegResult = ~_detParams->seg_rljHanZha->Evaluate(forSeg); - std::vector> contours; - cv::findContours(SegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - std::vector PaintRects; - bool isNg = false;; - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width > hanZhaFillterWidth || rect.height > hanZhaFillterHeight) { - cv::Mat img = cutImg2Cls(rect, forSeg); - bool clsIsNg = false; - int clsRes = _detParams->cls_rljHanZha->Evaluate(img); - if (clsRes == 1) - clsIsNg = true; - if (clsIsNg == true) { - rect.x *= 2; rect.y *= 2; rect.width *= 2; rect.height *= 2; - PaintRects.push_back(rect); - isNg = true; - } - data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",img }); - } - } - QMutexLocker locker(mutex); - for (auto& rect : PaintRects) { - cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); - } - return isNg; -} -bool HanHouJianCe2D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address){ - try - { - - QString sqlText1 = "焊后同心度结果"; - QString sqlText2 = "焊后铜极同心度"; - QString sqlText3 = "焊后铝极同心度"; - QString sqlText4 = "焊后2dCT"; - data->oriImgs.clear(); - data->oriImgs.push_back(cv::imread("D:\\testImage\\rlj_hh_t.bmp",-1)); - data->oriImgs.push_back(cv::imread("D:\\testImage\\rlj_hh_t.bmp", -1)); - if (data->oriImgs.size() <= 1) { - exceptionResume(data, _detParams, address, "图片数量不满足"); - return true; - } - cv::Mat Paint1, Paint2; - data->oriImgs[0].copyTo(Paint1); - data->oriImgs[1].copyTo(Paint2); - if (Paint1.channels() == 1) { - cvtColor(Paint1, Paint1, cv::COLOR_GRAY2BGR); - } - if (Paint2.channels() == 1) { - cvtColor(Paint2, Paint2, cv::COLOR_GRAY2BGR); - } - QMutex mutex1, mutex2; - HanHou2D_handleAiEvaluate(data, _detParams, data->oriImgs[0], Paint1, &mutex1, cv::Point(0,0)); - QByteArray plcResult = "1"; - double hanHouTongXingDu1 = -1; - double hanHouTongXingDu2 = -1; - cv::Mat forSeg1, forSeg2; - double resizeRate = 0.25; - cv::resize(data->oriImgs[0], forSeg1, cv::Size(), resizeRate, resizeRate); - cv::Mat seg1 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg1); - data->segOriginImgs.push_back(seg1); - cv::Rect tongRect = findMaxAreaContour(~seg1); - //cv::Point tongCenter(tongRect.x + tongRect.width / 2, tongRect.y + tongRect.height / 2); - - cv::resize(data->oriImgs[1], forSeg2, cv::Size(), resizeRate, resizeRate); - cv::Mat seg2 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg2); - data->segOriginImgs.push_back(seg2); - cv::Rect lvRect = findMaxAreaContour(~seg2); - //cv::Point lvCenter(lvRect.x + lvRect.width / 2, lvRect.y + lvRect.height / 2); - - - auto futrue1 = std::async(std::launch::async, &HanHou2D_halconEvaluate, data, data->oriImgs[0], seg1, std::ref(Paint1), std::ref(hanHouTongXingDu1), 0, &mutex1); - auto futrue2 = std::async(std::launch::async, &HanHou2D_halconEvaluate, data, data->oriImgs[1], seg2, std::ref(Paint2), std::ref(hanHouTongXingDu2), 2, &mutex2); - - - //auto futrue3 = std::async(std::launch::async, &HanHou2D_handleAiEvaluate, data, _detParams, data->oriImgs[0], std::ref(Paint1), &mutex1); - //auto futrue4 = std::async(std::launch::async, &HanHou2D_handleAiEvaluate, data, _detParams, data->oriImgs[1], std::ref(Paint2), &mutex2); - - auto tongClsImg = cutImg2Cls(tongRect, forSeg1, cv::Size(256, 256)); - data->clsOriginImgs.push_back({ "HY",tongClsImg }); - - auto lvClsImg = cutImg2Cls(lvRect, forSeg2, cv::Size(256, 256)); - int lvClsRes = _detParams->cls_hanYinLv->Evaluate(lvClsImg); - data->clsOriginImgs.push_back({ "HY",lvClsImg }); - - futrue1.wait(); - futrue2.wait(); - bool isNg1 = futrue1.get(), isNg2 = futrue2.get(); - - //futrue3.wait(); - //futrue4.wait(); - - //futrue3.get(); - //futrue4.get(); - - TextRendererZH textPainter(Paint2.cols, Paint2.rows, 100); - if (lvClsRes == 1) { - textPainter.putText(Paint2, "CLS-NG", cv::Point(0, 350), cv::Scalar(0, 0, 255)); - if (data->service->_paramSyncManager->get("焊后", "焊印CLS判定启用", true).toBool()) { - isNg2 = true; - } - - } - else - textPainter.putText(Paint2, "CLS-OK", cv::Point(0, 350), cv::Scalar(0, 255, 0)); - - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(hanHouTongXingDu1)); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(hanHouTongXingDu2)); - - - - if (isNg1 == true || isNg2 == true) {//判断存图 - data->halconOK = false; - } - - if (isNg1 == false && isNg2 == false) {//都OK发1 - plcResult = "1"; - } - else if (isNg1 == true && isNg2 == false)//第一次NG发2 - plcResult = "2"; - else if (isNg1 == false && isNg2 == true)//第二次NG发3 - plcResult = "3"; - else if (isNg1 == true && isNg2 == true)//两次都NG发4 - plcResult = "4"; - else//为了DEBUG - plcResult = "5"; - //plcResult = "1"; - cv::Mat PaintSum; - cv::vconcat(Paint1, Paint2, PaintSum); - data->resultImgs.push_back(PaintSum); - if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool()) - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult); - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测失败"); - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - return false; - -} - -bool HanHouJianCe3D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address) { - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - std::vector < std::string> defects = { }; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return false; - } - - cv::Mat Paint; - QMutex paintMutex; - clock_t start, finish; - start = clock(); - cv::Mat src1 = data->oriImgs[0]; - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0)); - //cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - //data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测失败"); - return false; - - -} - - -mission* createMission() { - return new _581_Ruanlianjie_hanqian_hanhou(); -} -void destroyMission(mission* _mission) { - delete _mission; -} diff --git a/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h deleted file mode 100644 index ec4c3d1..0000000 --- a/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -using namespace HDevEngineCpp; -using namespace HalconCpp; -class hanQianDingWeiParams { - -}; -class hanHouJianCe { -public: - handdleAI::pSegmentation* seg_rljHanYinZhuaQu = nullptr; - handdleAI::pSegmentation* seg_rljHanZha = nullptr; - handdleAI::pClassification* cls_rljHanZha = nullptr; - handdleAI::pClassification* cls_hanYinLv = nullptr; -}; - -bool HanQianDingWei(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address); -bool HanHouJianCe2D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address); -bool HanHouJianCe3D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address); - -class _581_Ruanlianjie_hanqian_hanhou : public mission { -public: - - _581_SX_Single_triggerTemplate dingwei_1; - _581_SX_Single_triggerTemplate dingwei_2; - - _581_SX_Single_triggerTemplate jiance_2d_1; - _581_SX_Single_triggerTemplate jiance_2d_2; - _581_SX_Single_triggerTemplate jiance_3d_1; - _581_SX_Single_triggerTemplate jiance_3d_2; - - hanQianDingWeiParams hanqiandingweiparams; - std::vectorhanhoujiance2dparams = std::vector(2); - hanHouJianCe hanhoujiance3dparams; - - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - - if (initOnce == false) { - - /*hanhoujiance2dparams[0].seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanYinZhuaQu.BHD", 64, 0); - hanhoujiance2dparams[1].seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanYinZhuaQu.BHD", 64, 1);*/ - - hanhoujiance2dparams[0].seg_rljHanZha = handdleAI::CreateSegObjS("./handleAiModels/rlj/seg_rljHanZha.BHD", 64, 0); - //hanhoujiance2dparams[1].seg_rljHanZha = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanZha.BHD", 64, 1); - - hanhoujiance2dparams[0].cls_rljHanZha = handdleAI::CreateClsObjV3("./handleAiModels/rlj/cls_rljHanZha.BHD", 0, 1); - //hanhoujiance2dparams[1].cls_rljHanZha = handdleAI::CreateClsObjV3("./handleAiModels/cls_rljHanZha.BHD", 1, 1); - - //hanhoujiance2dparams[0].cls_hanYinLv = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinLv.BHD", 0, 1); - //hanhoujiance2dparams[1].cls_hanYinLv = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinLv.BHD", 1, 1); - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 - dingwei_1.init("Camera1", "焊前定位-相机1(前)", { { 4900, 1,{4910},"4902","4904",4930} }, 1, &hanqiandingweiparams, _serviceManager, bridge, HanQianDingWei,"焊前定位CCD"); - dingwei_2.init("Camera2", "焊前定位-相机2(后)", { { 5800, 1,{5810},"5802","5804",5830} }, 1, &hanqiandingweiparams, _serviceManager, bridge, HanQianDingWei,"焊前定位CCD"); - - jiance_2d_1.init("Camera3", "焊后检测2D-相机1(前)", { { 5400, 1,{5410},"5402","5404",5430} }, 2, &hanhoujiance2dparams[0], _serviceManager, bridge, HanHouJianCe2D, "焊后检测CCD"); - jiance_3d_1.init("Camera4", "焊后检测3D-相机1(前)", { { 5500, 1,{5510},"5502","5504",5530} }, 1, &hanhoujiance3dparams, _serviceManager, bridge, HanHouJianCe3D,"焊后检测CCD"); - jiance_2d_2.init("Camera5", "焊后检测2D-相机2(后)", { { 5600, 1,{5610},"5602","5604",5630} }, 2, &hanhoujiance2dparams[1], _serviceManager, bridge, HanHouJianCe2D, "焊后检测CCD"); - jiance_3d_2.init("Camera6", "焊后检测3D-相机2(后)", { { 5700, 1,{5710},"5702","5704",5730} }, 1, &hanhoujiance3dparams, _serviceManager, bridge, HanHouJianCe3D,"焊后检测CCD"); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt b/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.cpp b/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.cpp deleted file mode 100644 index 0d966f3..0000000 --- a/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include <581_YiCiZhuYe_canye.h> - -void exceptionResume(std::shared_ptr data, canyeParams* _detParams, sx_581_address address,QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode)<< why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -bool yizhuCanYe(std::shared_ptr data, canyeParams* _detParams, sx_581_address address){ - - try - { - if (!_detParams->DOGLIVE) - { - exceptionResume(data, _detParams, address,"未插加密狗"); - return true; - } - else - { - QByteArray plcResult = "1"; - QString detResult = "OK"; - cv::Mat sourceImg = data->oriImgs[0]; - //sourceImg = cv::imread("D://readSnEmpty13-12-30-14Camera1_13-12-32-38_Count0.bmp"); - cv::Mat Paint; - sourceImg.copyTo(Paint); - - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - QString okNgSaveText = "OK"; - { - cv::Mat workImg; - cv::resize(sourceImg, workImg, cv::Size(), 0.25, 0.25); - cv::Rect rect1; - /////////////定位 ////////////////// - //cv::resize(workImg, workImg, cv::Size(), 0.25, 0.25); - cv::Mat dingWeiResultImg = ~_detParams->segDingWei->Evaluate(workImg); - cv::Rect dingWeiRect = findMaxAreaContour(dingWeiResultImg); - if (dingWeiRect.x == 0 && dingWeiRect.y == 0 || dingWeiRect.width < 10 || dingWeiRect.height < 10) { - exceptionResume(data, _detParams, address, "定位注液孔失败"); - return true; - } - cv::Point2f center(dingWeiRect.x + dingWeiRect.width / 2, dingWeiRect.y + dingWeiRect.height / 2); - cv::Mat centerImg; - cv::Rect cutArea = cv::Rect(center.x - 64, center.y - 64, 128, 128); - workImg(cutArea).copyTo(centerImg); - //////////////////////////////////// - int res = 0; - res = _detParams->clsCanYe->Evaluate(centerImg); - data->segOriginImgs.push_back(centerImg); - if (res == 0){ - - cv::putText(Paint, "OK", cv::Point(100, 500), 1,20,cv::Scalar(0, 255, 0), 10); - cv::rectangle(Paint, cv::Rect(cutArea.x * 4, cutArea.y * 4, cutArea.width * 4, cutArea.height * 4), cv::Scalar(0, 255, 0), 3); - } - else{ - - cv::putText(Paint, "NG", cv::Point(100, 500), 1, 20, cv::Scalar(0, 255, 0), 10); - cv::rectangle(Paint, cv::Rect(cutArea.x * 4, cutArea.y * 4, cutArea.width * 4, cutArea.height * 4), cv::Scalar(0, 0, 255), 3); - plcResult = "2"; - data->aiDetOK = false; - } - } - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - data->resultImgs.push_back(Paint); - return true; - } - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address,"检测程序异常"); - return true; -} - -bool erzhuCanYe(std::shared_ptr data, canyeParams* _detParams, sx_581_address address) -{ - QByteArray plcResult = "1"; - QByteArray data1 = "1"; - QByteArray data2 = "1"; - QString detResult = "OK"; - cv::Mat sourceImg = data->oriImgs[0]; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - //绘制结果 - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, detResult.toStdString(), cv::Point(4000, 50), cv::Scalar(0, 255, 0)); - - //数据发送 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 0) + "_" + data1);//数据1 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + data2);//数据1 - data->aiDetOK = true; - data->resultImgs.push_back(Paint); - - return true; -} - -mission* createMission() { - return new _581_YiCiZhuYe_canye(); -} -void destroyMission(mission* _mission) { - delete _mission; -} - diff --git a/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h b/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h deleted file mode 100644 index f1b5230..0000000 --- a/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class canyeParams { -public: - handdleAI::pSegmentation* segDingWei = nullptr; - handdleAI::pSegmentation* segDanYe = nullptr; - handdleAI::pClassification* clsCanYe = nullptr; - bool YiZhu = true; - bool DOGLIVE = true; -}; - -bool yizhuCanYe(std::shared_ptr data, canyeParams* _detParams, sx_581_address address); -bool erzhuCanYe(std::shared_ptr data, canyeParams* _detParams, sx_581_address address); - -class _581_YiCiZhuYe_canye : public mission { -public: - _581_SX_Single_triggerTemplate< canyeParams> cam_1; - _581_SX_Single_triggerTemplate< canyeParams> cam_2; - _581_SX_Single_triggerTemplate< canyeParams> cam_3; - std::vector < canyeParams> canyeDetParams = std::vector < canyeParams>(3); - bool initOnce = false; - void onConfigReloaded() { - //HDevEngineCpp::HDevEngine myEngine; - //myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - if (initOnce == false) { - for (auto¶m : canyeDetParams) { - if (param.DOGLIVE == false) - continue; - param.segDingWei = handdleAI::CreateSegObjS("./handleaiModels/yiCiZhuYe/pSeg_DingWei.BHD", 16, 0); - param.segDanYe = handdleAI::CreateSegObjS("./handleaiModels/yiCiZhuYe/pSeg_CanYe.BHD", 16, 0); - param.clsCanYe = handdleAI::CreateClsObjV3("./handleaiModels/yiCiZhuYe/pCls_CanYe.BHD", 0, 1); - } - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 - - cam_1.init("Camera1", "残液检测-相机1", { { 1900, 1,{1800},"1910","1920"} }, 1, &canyeDetParams[0], _serviceManager, bridge, yizhuCanYe); - cam_2.init("Camera2", "残液检测-相机2", { { 1901, 1,{1830},"1911","1921"} }, 1, &canyeDetParams[1], _serviceManager, bridge, yizhuCanYe); - cam_3.init("Camera3", "残液检测-相机3", { { 1902, 1,{1850},"1912","1922"} }, 1, &canyeDetParams[2], _serviceManager, bridge, yizhuCanYe); - -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/581_YiCiZhuYe_canye/CMakeLists.txt b/src/mission/581_YiCiZhuYe_canye/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/581_YiCiZhuYe_canye/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/601/601_RLJ_DingGai/601_RLJ_DingGai.cpp b/src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.cpp new file mode 100644 index 0000000..f5c5c76 --- /dev/null +++ b/src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.cpp @@ -0,0 +1,483 @@ +#include <601_RLJ_DingGai.h> + +bool ALGO_maJiaReRong(std::shared_ptr data, maJiaParam* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + data->service->_missionResultHandle->addSqlData("123", { {"s",13} }); + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto sourceImg = data->getOriImg(0); + switch (address.triggerValue) { + case 1: + sourceImg = cv::imread("D:\\testImage\\601\\majia (1).bmp", -1); + break; + case 2: + sourceImg = cv::imread("D:\\testImage\\601\\majia (2).bmp", -1); + break; + } + sourceImg(cv::Rect(1700, 700, 2200, 2200)).copyTo(sourceImg); + if (sourceImg.rows == 100) { + cv::Mat Paint; + sourceImg.copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + cv::Mat Paint; + HDevEngineCpp::HDevProcedure proc("MeltingPoint_Inspection_3_1"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image1, in_Image2, out_DisplayImage; + + in_Image1 = MatToHObject(sourceImg); + HalconCpp::HTuple out_PointArea, out_ColorType, out_Flag, out_CCDistance, in_Resolution(0.03816); + + procedureCall.SetInputIconicParamObject("in_Image1", in_Image1); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.Execute();//执行halcon程序 + out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage");//获取输出控制类变量 + out_PointArea = procedureCall.GetOutputCtrlParamTuple("out_PointArea");//获取输出控制类变量 + out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + + Paint = HObject2Mat(out_DisplayImage); + + int flag = out_Flag.D(); + QByteArray plcResult = "1"; + bool isNG = false; + TextRendererZH textPainter(Paint.cols, Paint.rows, 250); + if (flag == 1) + { + int Area1 = out_PointArea[0].D(); + int Area2 = out_PointArea[1].D(); + int Area3 = out_PointArea[2].D(); + int Area4 = out_PointArea[3].D(); + textPainter.putText(Paint, "同心度:" + std::to_string(out_CCDistance.D()), cv::Point(50, 50), cv::Scalar(0, 255, 0)); + if (out_CCDistance.D() > data->service->_paramSyncManager->get("马甲热熔", "同心度上限",2.0).toDouble()) { + + textPainter.putText(Paint, "同心度NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); + isNG = true; + data->halconOK = false; + } + } + else + { + textPainter.putText(Paint, "热熔点NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); + isNG = true; + data->halconOK = false; + } + + if (address.triggerValue == 2) {//TONG OK + textPainter.putText(Paint, "铜", cv::Point(50, 350), cv::Scalar(0, 255, 0)); + } + else if (address.triggerValue == 1) {//LV OK + textPainter.putText(Paint, "铝", cv::Point(50, 350), cv::Scalar(0, 255, 0)); + } + + //if (triggerSign == "D5200_2" || triggerSign == "D5300_2") { + // text1 = "马甲铜极性"; + // text2 = "马甲铜同心度"; + //} + //else if (triggerSign == "D5200_1" || triggerSign == "D5300_1") { + // text1 = "马甲铝极性"; + // text2 = "马甲铝同心度"; + // //firstResult = "0"; + //} + + if (address.triggerValue == 1){ + _detParams->lastResult = (isNG == false) ? "1" : "2"; + } + if (address.triggerValue == 2){ + if (isNG == true && _detParams->lastResult == "2")//均NG + plcResult = "4"; + else if (isNG == false && _detParams->lastResult == "2")//第一次NG + plcResult = "2"; + else if (isNG == true && _detParams->lastResult == "2")//第二次NG + plcResult = "3"; + else if (isNG == false && _detParams->lastResult == "1")//均OK + plcResult = "1"; + + _detParams->lastResult = "1";//复位结果 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//发送结果 + } + plcResult = "2"; + if (plcResult == "1") + data->service->_missionResultHandle->toBarChart(data->SNcode, false, { }); + else + data->service->_missionResultHandle->toBarChart(data->SNcode, true, { "热熔NG" }); + //data2 = QByteArray::number(out_CCDistance.D()); + cv::resize(Paint, Paint, cv::Size(), 0.25, 0.25); + + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} +bool ALGO_hanQianDingWei(std::shared_ptr data, detParams* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto sourceImg = data->getOriImg(0); + //sourceImg = cv::imread("D:\\testImage\\601\\hanqian.bmp", -1); + if (sourceImg.rows == 100) { + cv::Mat Paint; + sourceImg.copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + cv::Mat Paint; + HDevEngineCpp::HDevProcedure proc("HQDW_Color_Inspection"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + + HObject inputImage = MatToHObject(sourceImg); + HTuple in_Resolution(0.040766), in_FilePath("./halconFiles/"); + + + double HeightLeft_jsonvlaue = data->service->_paramSyncManager->get("焊前定位", "焊前左侧Y向高度差", 2.0).toDouble(); + double HeightRight_jsonvlaue = data->service->_paramSyncManager->get("焊前定位", "焊前右侧Y向高度差", 2.0).toDouble(); + double SlantAngle_jsonvlaue = data->service->_paramSyncManager->get("焊前定位", "焊前盖板上下边缘膜的角度", 0.6).toDouble(); + + procedureCall.SetInputIconicParamObject("in_Image", inputImage); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); + procedureCall.Execute();//执行halcon程序 + HTuple out_ColorType, out_Distance, make, out_SlantAngle, out_Height;; + HObject out_DisplayImage; + //out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 + out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出控制类变量 + //out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 + out_Height = procedureCall.GetOutputCtrlParamTuple("out_Height");//获取输出控制类变量 + out_SlantAngle = procedureCall.GetOutputCtrlParamTuple("out_SlantAngle");//获取输出控制类变量 + make = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage");//获取输出控制类变量 + int flag = make.D(); + QString tmpFlag = "1"; + // Output(HTuple): out_ColorType, 1, 铜; 2,铝 + + //正确的应该左边铝 右边铜 + + QByteArray plcResult; + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + if (flag == 1) + { + + int HeightLeftFlag = 1; + int HeightRightFlag = 1; + int AlgelFlag = 1; + Paint = HObject2Mat(out_DisplayImage); + + textPainter.putText(Paint, "膜上边到注液孔:" + std::to_string(out_Distance[0].D()), cv::Point(800, 50), cv::Scalar(0, 255, 0)); + textPainter.putText(Paint, "膜下边到注液孔:" + std::to_string(out_Distance[1].D()), cv::Point(800, 350), cv::Scalar(0, 255, 0)); + if (out_Height[0].D() > HeightLeft_jsonvlaue) + { + HeightLeftFlag = 2; + textPainter.putText(Paint, "左侧Y向高度差:" + std::to_string(out_Height[0].D()), cv::Point(800, 650), cv::Scalar(0, 0, 255)); + } + else + textPainter.putText(Paint, "左侧Y向高度差:" + std::to_string(out_Height[0].D()), cv::Point(800, 650), cv::Scalar(0, 255, 0)); + + if (out_Height[1].D() > HeightRight_jsonvlaue) + { + HeightRightFlag = 2; + textPainter.putText(Paint, "右侧Y向高度差:" + std::to_string(out_Height[1].D()), cv::Point(800, 950), cv::Scalar(0, 0, 255)); + } + else + textPainter.putText(Paint, "右侧Y向高度差:" + std::to_string(out_Height[1].D()), cv::Point(800, 950), cv::Scalar(0, 255, 0)); + if (out_SlantAngle.D() > SlantAngle_jsonvlaue) + { + AlgelFlag = 2; + textPainter.putText(Paint, "盖板上下边缘膜的角度:" + std::to_string(out_SlantAngle.D()), cv::Point(800, 1250), cv::Scalar(0, 0, 255)); + } + else + textPainter.putText(Paint, "盖板上下边缘膜的角度:" + std::to_string(out_SlantAngle.D()), cv::Point(800, 1250), cv::Scalar(0, 255, 0)); + int left = out_ColorType[0].D(); + if (left == 2) + textPainter.putText(Paint, "铜", cv::Point(0, 3100), cv::Scalar(0, 0, 255)); + else if (left == 1) + textPainter.putText(Paint, "铝", cv::Point(0, 3100), cv::Scalar(0, 255, 0)); + else + textPainter.putText(Paint, "异常", cv::Point(0, 3100), cv::Scalar(0, 0, 255)); + + int right = out_ColorType[1].D(); + if (right == 2) + textPainter.putText(Paint, "铜", cv::Point(Paint.cols - 1000, 3100), cv::Scalar(0, 255, 0)); + else if (right == 1) + textPainter.putText(Paint, "铝", cv::Point(Paint.cols - 1000, 3100), cv::Scalar(0, 0, 255)); + else + textPainter.putText(Paint, "异常", cv::Point(Paint.cols - 1000, 3100), cv::Scalar(0, 0, 255)); + //结果判定 + if (left == 2 || right == 1 || HeightRightFlag == 2 || HeightLeftFlag == 2 || AlgelFlag == 2){ + + textPainter.putText(Paint, "NG", cv::Point(100, 150), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + else{ + + textPainter.putText(Paint, "OK", cv::Point(100, 150), cv::Scalar(0, 255, 0)); + } + + } + else{ + + textPainter.putText(Paint, "NG1", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + + if(plcResult == "2") + data->service->_missionResultHandle->toBarChart(data->SNcode, true, { "焊前NG" }); + else + data->service->_missionResultHandle->toBarChart(data->SNcode, false, { }); + //data2 = QByteArray::number(out_CCDistance.D()); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果 + cv::resize(Paint, Paint, cv::Size(), 0.25, 0.25); + + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} +bool ALGO_dingGaiKeMa(std::shared_ptr data, keMaParam* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto sourceImg = data->getOriImg(0); + /* switch (address.triggerValue) { + case 1: + sourceImg = cv::imread("D:\\testImage\\601\\fbf (1).png", -1); + break; + case 2: + sourceImg = cv::imread("D:\\testImage\\601\\fbf (2).png", -1); + break; + case 3: + sourceImg = cv::imread("D:\\testImage\\601\\fbf (3).png", -1); + break; + }*/ + if (sourceImg.rows == 100) { + cv::Mat Paint; + sourceImg.copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + QByteArray plcResult = "1"; + + cv::Mat Paint; + double Resolution = 0.015478; + if (address.triggerValue == 2)//刻码 + { + //#if 0 + HDevEngineCpp::HDevProcedure proc("Cal_FBF_Distance_3_1");; + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + HObject in_Image = MatToHObject(sourceImg); + HalconCpp::HTuple in_Resolution(Resolution), in_FilePath("./halconFiles/"); + procedureCall.SetInputIconicParamObject("in_Image", in_Image); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); + procedureCall.Execute();//执行halcon程序 + HalconCpp::HTuple out_LinePoint, out_Circle, out_Flag, out_Distance; + out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 + out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 + _detParams->keMaResult = "1"; + TextRendererZH resTextPainter(Paint.cols, Paint.rows, 500); + double upDistanceLimitHigh = data->service->_paramSyncManager->get("刻码", "上间距上限", 11.9).toDouble(); + double upDistanceLimitLow = data->service->_paramSyncManager->get("刻码", "上间距下限", 5.9).toDouble(); + double rightDistanceLimitHigh = data->service->_paramSyncManager->get("刻码", "右间距上限", 33.2).toDouble(); + double rightDistanceLimitLow = data->service->_paramSyncManager->get("刻码", "右间距下限", 27.2).toDouble(); + if (out_Flag.D() == 1) + { + int crossLineLength = 50; + for (int i = 0; i < out_LinePoint.Length() / 4; i++) + { + cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), + cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), + cv::Scalar(0, 255, 0), 10); + } + double distance = out_Distance[0].D(); + distance -= out_Circle[2].D() * Resolution;//CHEAT!!! + circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5); + TextRendererZH textPainter(Paint.cols, Paint.rows, 200); + { + //data1 = QByteArray::number(distance); + std::string text = "上间距:" + std::to_string(distance); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint,text,cv::Point(50, 50), cv::Scalar(0, 255, 0)); + } + double distance2 = out_Distance[1].D();//二维码的宽度值 + { + //data2 = QByteArray::number(distance2); + std::string text = "二维码的宽度值:" + std::to_string(distance2); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 600), cv::Scalar(0, 255, 0)); + } + double distance3 = out_Distance[2].D();//二维码下方字符串的宽度值 + { + std::string text = "二维码下字符垂直高度:" + std::to_string(distance3); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(100, 800), cv::Scalar(0, 255, 0)); + } + double distance4 = out_Distance[3].D();//二维码左侧字符串的高度值 + { + std::string text = "二维码左字符水平宽度:" + std::to_string(distance4); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 950), cv::Scalar(0, 255, 0)); + } + double distance5 = out_Distance[4].D();//二维码右侧到电芯右侧边缘距离 + { + //data2 = QByteArray::number(distance2); + std::string text = "右间距:" + std::to_string(distance5); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 350), cv::Scalar(0, 255, 0)); + } + if (distance > upDistanceLimitHigh || distance < upDistanceLimitLow) + { + std::string text = "上间距NG"; + textPainter.putText(Paint, text, cv::Point(2500, 50), cv::Scalar(0, 0, 255)); + _detParams->keMaResult = "2"; + data->halconOK = false; + } + if (distance5 > rightDistanceLimitHigh || distance5 < rightDistanceLimitLow) + { + std::string text = "右间距NG"; + textPainter.putText(Paint, text, cv::Point(2500, 350), cv::Scalar(0, 0, 255)); + _detParams->keMaResult = "2"; + data->halconOK = false; + } + + } + else{ + + qDebug() << __FUNCTION__ << "line:" << __LINE__ << "二维码error"; + resTextPainter.putText(Paint, "NG1", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + _detParams->keMaResult = "2"; + data->halconOK = false; + } + + Paint.copyTo(_detParams->TP2Paint); + plcResult = _detParams->keMaResult; + } + else if (address.triggerValue == 1){ + + //JiZhuResult1 = "1"; + //plcResult = keMaResult; + sourceImg.copyTo(_detParams->TP1IMG); + //sourceImg.copyTo(Paint); + } + else if (address.triggerValue == 3)//极柱 + { + Paint = cv::Mat(_detParams->TP1IMG.rows, _detParams->TP1IMG.cols * 3, CV_8UC1); + _detParams->TP1IMG.copyTo(Paint(cv::Rect(0, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); + sourceImg.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + _detParams->TP2Paint.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols * 2, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); + cv::Mat PaintPart2 = Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)); + HDevEngineCpp::HDevProcedure proc("Cal_JZ_Distance_3");; + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image1, in_Image2; + in_Image1 = MatToHObject(_detParams->TP1IMG); + in_Image2 = MatToHObject(sourceImg); + HalconCpp::HTuple in_FilePath(" "), in_Resolution(Resolution); + procedureCall.SetInputIconicParamObject("in_Image1", in_Image1); + procedureCall.SetInputIconicParamObject("in_Image2", in_Image2); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); + procedureCall.Execute();//执行halcon程序 + HalconCpp::HTuple out_Edgedistance, out_Distance, out_LinePoint, out_Flag; + out_Edgedistance = procedureCall.GetOutputCtrlParamTuple("out_Edgedistance");//获取输出控制类变量 + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 + out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + TextRendererZH resTextPainter(Paint.cols, Paint.rows, 500); + if (out_Flag.D() == 1) + { + for (int i = 0; i < 4; i++) + { + cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), + cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), + cv::Scalar(0, 255, 0), 15); + } + for (int i = 4; i < 8; i++) + { + cv::line(PaintPart2, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), + cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), + cv::Scalar(0, 255, 0), 15); + } + double Distance = out_Distance.D(); + TextRendererZH textPainter(Paint.cols, Paint.rows, 200); + //Paint + { + std::string text = "垂直间距:" + std::to_string(out_Edgedistance[0].D()); + //data3 = QByteArray::number(out_Edgedistance[0].D()); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 50), cv::Scalar(0, 255, 0)); + } + { + //data4 = QByteArray::number(out_Edgedistance[1].D()); + std::string text = "水平间距:" + std::to_string(out_Edgedistance[1].D()); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 300), cv::Scalar(0, 255, 0)); + } + { + //data5 = QByteArray::number(out_Edgedistance[2].D()); + std::string text = "垂直间距:" + std::to_string(out_Edgedistance[2].D()); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(PaintPart2, text, cv::Point(50, 50), cv::Scalar(0, 255, 0)); + } + { + //data6 = QByteArray::number(out_Edgedistance[3].D()); + std::string text = "水平间距:" + std::to_string(out_Edgedistance[3].D()); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(PaintPart2, text, cv::Point(50, 300), cv::Scalar(0, 255, 0)); + } + plcResult = _detParams->keMaResult; + + } + else + { + resTextPainter.putText(Paint, "NG1", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + } + cv::resize(Paint, Paint, cv::Size(), 0.25, 0.25); + + data->insertResultImg(Paint); + } + if (plcResult == "2") + data->service->_missionResultHandle->toBarChart(data->SNcode, true, { "刻码NG" }); + else + data->service->_missionResultHandle->toBarChart(data->SNcode, false, { }); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//发送结果 + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} + +mission* createMission() { + return new _581_YiCiZhuYe_canye(); +} +void destroyMission(mission* _mission) { + delete _mission; +} + diff --git a/src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.h b/src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.h new file mode 100644 index 0000000..513f5c9 --- /dev/null +++ b/src/mission/601/601_RLJ_DingGai/601_RLJ_DingGai.h @@ -0,0 +1,137 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +struct maJiaParam { + QByteArray lastResult = "1"; +}; +struct hanQianDingWeiSubresult { + double toLeft = -1;//铝(负)极的包膜距离(mm) + double Out_Vale_L_centerUp = -1;//铝(负)极连接片中心的和上极耳水平边缘距离(mm) + double Out_Vale_L_centerDown = -1;//铝(负)极连接片中心的和下极耳水平边缘距离(mm) + double extremumValue = -1; + + cv::Point circleCenter; + double radius = 1; + std::vector lines; + + bool algoFailed = false; +}; +class zhongHanHanQianParams { +public: + QMutex* mutex = new QMutex(); + QQueue resultQueue; + QQueue mats; + ~zhongHanHanQianParams() { + delete mutex; + } + + int waitMs = 3000; + void insertImg(HObject& input) { + QMutexLocker locker(mutex); + if (mats.size() > 0) { + qWarning() << "焊前定位有遗留的图像,已清除"; + mats.clear(); + } + mats.enqueue(input);//发送检测数据到主线程 + } + bool waitImage(HObject& out) { + int cnt = 0; + while (mats.size() == 0 && cnt < waitMs) { + QThread::msleep(2); + cnt += 2; + } + if (mats.size() != 0) { + QMutexLocker locker(mutex); + out = mats.dequeue(); + return true; + } + return false; + } + void insertResult(hanQianDingWeiSubresult input) { + QMutexLocker locker(mutex); + if (resultQueue.size() > 0) { + qWarning() << "焊前定位有遗留的结果,已清除"; + resultQueue.clear(); + } + resultQueue.enqueue(input);//发送检测数据到主线程 + } + bool waitResult(hanQianDingWeiSubresult& out) { + int cnt = 0; + while (resultQueue.size() == 0 && cnt < waitMs) { + QThread::msleep(2); + cnt += 2; + } + if (resultQueue.size() != 0) { + QMutexLocker locker(mutex); + out = resultQueue.dequeue(); + resultQueue.clear(); + return true; + } + return false; + } +}; +struct lieHengParam { + handdleAI::pSegmentation* seg; + handdleAI::pClassification* cls; +}; +struct keMaParam { + QByteArray keMaResult = "1"; + cv::Mat TP1IMG; + cv::Mat TP2Paint; +}; + +bool ALGO_maJiaReRong(std::shared_ptr data, maJiaParam* _detParams, sx_581_address address); +bool ALGO_hanQianDingWei(std::shared_ptr data, detParams* _detParams, sx_581_address address); +bool ALGO_dingGaiKeMa(std::shared_ptr data, keMaParam* _detParams, sx_581_address address); +class _581_YiCiZhuYe_canye : public mission { +public: + + _581_SX_Single_triggerTemplate< maJiaParam> maJia1; + _581_SX_Single_triggerTemplate< maJiaParam> maJia2; + _581_SX_Single_triggerTemplate< keMaParam> kema1; + _581_SX_Single_triggerTemplate< keMaParam> kema2; + _581_SX_Single_triggerTemplate< detParams> hanQianDingWei; + + detParams _detParams; + maJiaParam _maJiaParam1; + maJiaParam _maJiaParam2; + keMaParam _keMaParam1; + keMaParam _keMaParam2; + bool initOnce = false; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.UnloadAllProcedures(); + myEngine.SetProcedurePath(""); + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_628_1.hdpl"); + if (initOnce == false) { + + initOnce = true; + } + } + bool initCustom() { +#pragma region 注册触发器回调 + hanQianDingWei.init("Camera1", "焊前定位", { { 4900, 1,{4910},"4902","4906"} }, 1, &_detParams, _serviceManager, bridge, ALGO_hanQianDingWei); + + maJia1.init("Camera2", "马甲热熔-相机1", { { 5200, 1,{5210},"5202","5204",5206},{ 5200, 2,{5210},"5202","5204",5206} }, 1, &_maJiaParam1, _serviceManager, bridge, ALGO_maJiaReRong); + maJia2.init("Camera3", "马甲热熔-相机2", { { 5300, 1,{5310},"5302","5304",5306},{ 5300, 2,{5310},"5302","5304",5306} }, 1, &_maJiaParam2, _serviceManager, bridge, ALGO_maJiaReRong); + + kema1.init("Camera4", "防爆阀-相机1", { { 5000, 1,{5010},"5002","5004"},{ 5000, 2,{5010},"5002","5004"},{ 5000, 3,{5010},"5002","5004"} }, 1, &_keMaParam1, _serviceManager, bridge, ALGO_dingGaiKeMa); + kema2.init("Camera5", "防爆阀-相机2", { { 5100, 1,{5110},"5102","5104"},{ 5100, 2,{5110},"5102","5104"},{ 5100, 3,{5110},"5102","5104"} }, 1, &_keMaParam2, _serviceManager, bridge, ALGO_dingGaiKeMa); + + + +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581-Mfd_djy_sd/CMakeLists.txt b/src/mission/601/601_RLJ_DingGai/CMakeLists.txt similarity index 100% rename from src/mission/581-Mfd_djy_sd/CMakeLists.txt rename to src/mission/601/601_RLJ_DingGai/CMakeLists.txt diff --git a/src/mission/601/601_RLJ_HH/601_RLJ_HH.cpp b/src/mission/601/601_RLJ_HH/601_RLJ_HH.cpp new file mode 100644 index 0000000..3acaa68 --- /dev/null +++ b/src/mission/601/601_RLJ_HH/601_RLJ_HH.cpp @@ -0,0 +1,155 @@ +#include <601_RLJ_HH.h> + +void halconEvaluate(cv::Mat sourceImg, cv::Mat segImg, cv::Mat& Paint, bool& isNg, QByteArray& hanHouTongXingDu, int times, std::shared_ptr data, hanHou2dParam* _detParams) { + HDevEngineCpp::HDevProcedure proc("Cal_HY_CC_Distance_3_1"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image = MatToHObject(sourceImg); + HObject in_ImageSeg = MatToHObject(segImg); + HalconCpp::HTuple in_FliePath("./halconFiles/"), in_Resolution(0.013736); + procedureCall.SetInputIconicParamObject("in_Image", in_Image); + procedureCall.SetInputIconicParamObject("in_ImageSeg", in_ImageSeg); + procedureCall.SetInputCtrlParamTuple("in_FliePath", in_FliePath); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.Execute();//执行halcon程序 + HalconCpp::HTuple out_CCDistance, out_Circle, out_Flag; + out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 + out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + int flag = out_Flag.D(); + isNg = false; + TextRendererZH textPainter(Paint.cols, Paint.rows, 600); + if (flag == 1){ + double CCDistance = out_CCDistance.D(); + hanHouTongXingDu = QByteArray::number(CCDistance); + textPainter.putText(Paint, "焊印同心度:" + std::to_string(CCDistance), cv::Point(0, 50), cv::Scalar(0, 255, 0)); + + cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 15); + cv::circle(Paint, cv::Point(out_Circle[4].D(), out_Circle[3].D()), out_Circle[5].D(), cv::Scalar(0, 255, 0), 15); + if (CCDistance > 3) { + textPainter.putText(Paint, "同心度NG" + std::to_string(CCDistance), cv::Point(0, 150), cv::Scalar(0, 0, 255)); + isNg = true; + } + + } + else{ + textPainter.putText(Paint, "焊印抓取NG", cv::Point(0, 150), cv::Scalar(0, 0, 255)); + isNg = true; + } +} +void HandleAIEvaluate(cv::Mat sourceImg, cv::Mat& Paint, bool& isNg, int times, std::shared_ptr data, hanHou2dParam* _detParams) { + isNg = false; + cv::Mat forSeg; + cv::resize(sourceImg, forSeg, cv::Size(), 0.5, 0.5); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + cv::Mat segImg = ~_detParams->seg_rljHanZha->Evaluate(forSeg); + std::vector>contours;//点集 + cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); // 寻找白色区域并储存为点集 + std::vector> clsImgs; + for (int i = 0; i < contours.size(); i++){//遍历点集 + cv::Rect rect = cv::boundingRect(contours[i]);//最小外接矩形 + + if (rect.height > 30 || rect.width > 30) {// 过滤 只有都大于10像素才进检测 + cv::Mat clsImage = cutImg2Cls(rect, forSeg);//切图 + int clsResult = _detParams->cls_rljHanZha->Evaluate(clsImage);//cls检测 得出的是int型 从0开始 + + if (clsResult == 0){ + //rectangle(Paint,cv::Rect{ rect,x,rect .y,rect .width,rect .height}, cv::Scalar(0, 0, 255), 2, 8, 0); + //drawContours(Paint, contours, i, cv::Scalar(0, 255, 255, 1)); + } + else + { + //isNg = true; + rectangle(Paint, cv::Rect{ rect.x,rect.y,rect.width,rect.height }, cv::Scalar(0, 0, 255), 2, 8, 0); + drawContours(Paint, contours, i, cv::Scalar(0, 0, 255, 1)); + } + clsImgs.push_back({ std::to_string(clsResult),clsImage }); + } + } + data->insertClsOriginImg(clsImgs); + cv::resize(Paint, Paint, cv::Size(), 2, 2); +} +bool hanhou2D(std::shared_ptr data, hanHou2dParam* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 2) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto img2D1 = data->getOriImg(0); + auto img2D2 = data->getOriImg(1); + img2D1 = cv::imread("D:\\testImage\\601\\ORI_T.bmp", -1); + img2D2 = cv::imread("D:\\testImage\\601\\ORI_L.bmp", -1); + cv::Mat Paint1, Paint2; + img2D1.copyTo(Paint1); + img2D2.copyTo(Paint2); + if (Paint1.channels() == 1) { + cvtColor(Paint1, Paint1, cv::COLOR_GRAY2BGR); + cvtColor(Paint2, Paint2, cv::COLOR_GRAY2BGR); + } + QByteArray plcResult = "1"; + QByteArray hanHouTongXingDu1 = "-1"; + QByteArray hanHouTongXingDu2 = "-1"; + QString imgSaveText = "NG"; + bool isNg1 = false, isNg2 = false; + bool isNg3 = false, isNg4 = false; + cv::Mat forSeg1, forSeg2; + double resizeRate = 0.25; + cv::resize(img2D1, forSeg1, cv::Size(), resizeRate, resizeRate); + //cv::Mat seg1 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg1); + cv::Mat seg1 = cv::imread("D:\\testImage\\601\\SEG_T.bmp", -1); + data->insertSegOriginImg(seg1); + data->insertSegOriginImg(forSeg1); + + cv::resize(img2D2, forSeg2, cv::Size(), resizeRate, resizeRate); + //cv::Mat seg2 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg2); + cv::Mat seg2 = cv::imread("D:\\testImage\\601\\SEG_L.bmp", -1); + data->insertSegOriginImg(seg2); + data->insertSegOriginImg(forSeg2); + qDebug() << "h start"; + auto futrue1 = std::async(std::launch::async, &halconEvaluate, + img2D1, seg1, std::ref(Paint1), std::ref(isNg1), std::ref(hanHouTongXingDu1), 0, data, _detParams); + auto futrue2 = std::async(std::launch::async, &halconEvaluate, + img2D2, seg2, std::ref(Paint2), std::ref(isNg2), std::ref(hanHouTongXingDu2), 2, data, _detParams); + futrue1.wait(); + futrue2.wait(); + qDebug() << "hz Start"; + //auto futrue3 = std::async(std::launch::async, &HandleAIEvaluate, + // img2D1, std::ref(Paint1), std::ref(isNg3), 0, data, _detParams); + //auto futrue4 = std::async(std::launch::async, &HandleAIEvaluate, + // img2D2, std::ref(Paint2), std::ref(isNg4), 2, data, _detParams); + //futrue3.wait(); + //futrue4.wait(); + cv::Mat PaintSum; + cv::vconcat(Paint1, Paint2, PaintSum); + qDebug() << "hz End"; + if (isNg1 == false && isNg2 == false) {//都OK发1 + plcResult = "1"; + imgSaveText = "OK"; + } + else if (isNg1 == true && isNg2 == false)//第一次NG发2 + plcResult = "2"; + else if (isNg1 == false && isNg2 == true)//第二次NG发3 + plcResult = "3"; + else if (isNg1 == true && isNg2 == true)//两次都NG发4 + plcResult = "4"; + else//为了DEBUG + plcResult = "5"; + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//发送结果 + data->insertResultImg(PaintSum); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} + +mission* createMission() { + return new _581_YiCiZhuYe_canye(); +} +void destroyMission(mission* _mission) { + delete _mission; +} + diff --git a/src/mission/601/601_RLJ_HH/601_RLJ_HH.h b/src/mission/601/601_RLJ_HH/601_RLJ_HH.h new file mode 100644 index 0000000..0b81570 --- /dev/null +++ b/src/mission/601/601_RLJ_HH/601_RLJ_HH.h @@ -0,0 +1,63 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion + + +struct hanHou2dParam { + handdleAI::pSegmentation* seg_rljHanYinZhuaQu; + handdleAI::pSegmentation* seg_rljHanZha; + handdleAI::pClassification* cls_rljHanZha; +}; +bool hanhou2D(std::shared_ptr data, hanHou2dParam* _detParams, sx_581_address address); + +class _581_YiCiZhuYe_canye : public mission { +public: + + _581_SX_Single_triggerTemplate< hanHou2dParam> hanhou_2d_1; + _581_SX_Single_triggerTemplate< hanHou2dParam> hanhou_2d_2; + + _581_SX_Single_triggerTemplate< detParams> hanhou_3d_1; + _581_SX_Single_triggerTemplate< detParams> hanhou_3d_2; + + detParams _detParams; + hanHou2dParam _hanHou2dParam1; + hanHou2dParam _hanHou2dParam2; + bool initOnce = false; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_628_1.hdpl"); + if (initOnce == false) { + /*_hanHou2dParam1.seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./model/seg-rljHanYinZhuaQu.BHD", 16, 0); + _hanHou2dParam1.seg_rljHanZha = handdleAI::CreateSegObjS("./model/seg_rljHanZha.BHD", 16, 0); + _hanHou2dParam1.cls_rljHanZha = handdleAI::CreateClsObjV3("./model/cls_rljHanZha.BHD.BHD", 0, 1); + + _hanHou2dParam2.seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./model/seg-rljHanYinZhuaQu.BHD", 16, 0); + _hanHou2dParam2.seg_rljHanZha = handdleAI::CreateSegObjS("./model/seg_rljHanZha.BHD", 16, 0); + _hanHou2dParam2.cls_rljHanZha = handdleAI::CreateClsObjV3("./model/cls_rljHanZha.BHD.BHD", 0, 1);*/ + + initOnce = true; + } + } + bool initCustom() { +#pragma region 注册触发器回调 + hanhou_2d_1.init("Camera1", "焊后2D-相机1", { { 5400, 1,{5410},"5402","5404"} }, 2, &_hanHou2dParam1, _serviceManager, bridge, hanhou2D); + hanhou_2d_2.init("Camera2", "焊后2D-相机2", { { 5500, 1,{5510},"5502","5504"} }, 2, &_hanHou2dParam2, _serviceManager, bridge, hanhou2D); + + hanhou_3d_1.init("Camera3", "焊后3D-相机1", { { 5600, 1,{5610},"5602","5504"} }, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); + hanhou_3d_2.init("Camera4", "焊后3D-相机2", { { 5700, 1,{5710},"5702","5534"} }, 1, &_detParams, _serviceManager, bridge, generalAlgoTest); + +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581-Mfd_yh_mh_hh/CMakeLists.txt b/src/mission/601/601_RLJ_HH/CMakeLists.txt similarity index 100% rename from src/mission/581-Mfd_yh_mh_hh/CMakeLists.txt rename to src/mission/601/601_RLJ_HH/CMakeLists.txt diff --git a/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.cpp b/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.cpp new file mode 100644 index 0000000..bdb74f7 --- /dev/null +++ b/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.cpp @@ -0,0 +1,478 @@ +#include <601_ZH_Dibu.h> +bool hanQianCeLiang_Main(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address) { + try { + QByteArray plcResult = "1"; + //cv::Mat sourceImg = cv::imread("D:\\testImage\\T.bmp", -1); + cv::Mat sourceImg = data->getOriImg(0); + sourceImg = cv::imread("D:\\testimg\\ORI0_60A01MB5601F8PJ009974_60A01MB5601F8PJ010051_DA3442418_0_01-08-48-98.png", -1); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HDevEngineCpp::HDevProcedure proc("Cal_ZH_LJP_Distance"); + HDevProcedureCall procedureCall(proc); + + HalconCpp::HObject ho_Image_T; + HalconCpp::HObject ho_Image_L; + HalconCpp::HTuple in_FilePath = "./halconFiles/"; + ho_Image_T = MatToHObject(sourceImg); + //等待副线程传入图像 + bool getImgResult = _detParams->waitImage(ho_Image_L); + + procedureCall.SetInputIconicParamObject("in_Image1", ho_Image_T); + procedureCall.SetInputIconicParamObject("in_Image2", ho_Image_L); + procedureCall.SetInputCtrlParamTuple("in_Resolution", 0.038); + procedureCall.SetInputCtrlParamTuple("in_FilePath", "./halconFiles/"); + procedureCall.Execute();//执行halcon程序 + + HalconCpp::HTuple out_Distance; + HalconCpp::HTuple out_LinePoint; + HalconCpp::HTuple out_Circle; + HalconCpp::HTuple out_Flag; + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 + out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 + out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + + int flag = out_Flag.D(); + TextRendererZH textPainter(Paint.cols, Paint.rows, 280); + QByteArray xinBaoJianJu = "-1", jiPianJianJu = "-1"; + if (flag == 1) + { + double Out_Vale_T = out_Distance[0].D(); + double Out_Vale_T_cenretUp = out_Distance[1].D(); + double Out_Vale_T_centerDown = out_Distance[2].D(); + + double Out_Vale_L = out_Distance[3].D(); + double Out_Vale_L_centerUp = out_Distance[4].D(); + double Out_Vale_L_centerDown = out_Distance[5].D(); + + double extremum_Value = out_Distance[6].D(); + + //发送到另一算法线程 + hanQianDingWeiSubresult _calResult; + //_calResult.circle = cv::Point(out_Circle[1].D(), out_Circle[0].D()); + _calResult.circleCenter = cv::Point(out_Circle[4].D(), out_Circle[3].D()); + _calResult.radius = out_Circle[5].D(); + _calResult.toLeft = Out_Vale_L; + _calResult.extremumValue = extremum_Value; + _calResult.Out_Vale_L_centerUp = Out_Vale_L_centerUp; + _calResult.Out_Vale_L_centerDown = Out_Vale_L_centerDown; + + for (int i = 0; i < 4 * 8; i++) + _calResult.lines.push_back(out_LinePoint[i].D()); + _detParams->insertResult(_calResult); + + xinBaoJianJu = QByteArray::number(Out_Vale_T); + { + std::string text = "芯包间距:" + std::to_string(Out_Vale_T); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 50), cv::Scalar(0, 255, 0)); + } + + jiPianJianJu = QByteArray::number(extremum_Value); + { + std::string text = "极间距:" + std::to_string(extremum_Value); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 550), cv::Scalar(0, 255, 0)); + } + double Vale_T_cenretUp = data->service->_paramSyncManager->get("焊前", "终焊焊前检测铜极中心和上边缘距离差(下限)", 1).toDouble(); + if ((13 - Vale_T_cenretUp) < Out_Vale_T_cenretUp && Out_Vale_T_cenretUp < (13 + Vale_T_cenretUp)) + { + std::string text = " 铜极中心和上边缘距离:" + std::to_string(Out_Vale_T_cenretUp); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 2500), cv::Scalar(0, 255, 0)); + } + else + { + std::string text = " 铜极中心和上边缘距离:" + std::to_string(Out_Vale_T_cenretUp); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 2500), cv::Scalar(0, 0, 255)); + data->halconOK = false; + plcResult = "2"; + } + + double Vale_T_cenretDown = data->service->_paramSyncManager->get("焊前", "终焊焊前检测铜极中心和下边缘距离差(下限)", 1).toDouble(); + if ((13 - Vale_T_cenretDown) < Out_Vale_T_centerDown && Out_Vale_T_centerDown < (13 + Vale_T_cenretDown)) + { + std::string text = " 铜极中心和下边缘距离:" + std::to_string(Out_Vale_T_centerDown); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 3000), cv::Scalar(0, 255, 0)); + } + else + { + std::string text = " 铜极中心和下边缘距离:" + std::to_string(Out_Vale_T_centerDown); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 3000), cv::Scalar(0, 0, 255)); + data->halconOK = false; + plcResult = "2"; + } + + for (int i = 0; i < 4; i++) + { + cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), + cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), + cv::Scalar(0, 255, 0), 20); + } + cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 15); + } + else { + hanQianDingWeiSubresult _calResult; + _calResult.algoFailed = true; + _detParams->insertResult(_calResult); + textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + data->halconOK = false; + } + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + xinBaoJianJu + "," + jiPianJianJu);//结果反馈 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + data->halconOK = false; + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2,-1,-1");//结果反馈 + return true; +} +bool hanQianCeLiang_Sub(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address) { + try { + //测试算法用 + QByteArray plcResult = "1"; + + //cv::Mat sourceImg = cv::imread("D:\\testImage\\L.bmp", -1); + cv::Mat sourceImg = data->getOriImg(0); + sourceImg = cv::imread("D:\\testimg\\ORI0_60A01MB5601F8PJ009974_60A01MB5601F8PJ010051_DA3273535_0_01-08-48-98.png", -1); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HObject image = MatToHObject(sourceImg); + //发送图片 + _detParams->insertImg(image); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 120); + //等待结果 + hanQianDingWeiSubresult _calResult; + bool waitResultResult = _detParams->waitResult(_calResult); + + if (waitResultResult == false) { + data->halconOK = false; + textPainter.putText(Paint, "NG:TimeOut", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + plcResult = "2"; + data->insertResultImg(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2,-1,-1");//结果反馈 + return false; + } + QByteArray xinBaoJianJu = "-1", jiPianJianJu = "-1"; + if (_calResult.algoFailed == false) { + xinBaoJianJu = QByteArray::number(_calResult.toLeft); + { + std::string text = "芯包间距:" + std::to_string(_calResult.toLeft); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 50), cv::Scalar(0, 255, 0)); + } + + jiPianJianJu = QByteArray::number(_calResult.extremumValue); + { + std::string text = "极间距:" + std::to_string(_calResult.extremumValue); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 550), cv::Scalar(0, 255, 0)); + } + double Vale_T_cenretUp = data->service->_paramSyncManager->get("焊前", "终焊焊前检测铝极中心和上边缘距离差(下限)", 1).toDouble(); + if ((13 - Vale_T_cenretUp) < _calResult.Out_Vale_L_centerUp && _calResult.Out_Vale_L_centerUp < (13 + Vale_T_cenretUp)) + { + std::string text = " 铜极中心和上边缘距离:" + std::to_string(_calResult.Out_Vale_L_centerUp); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 2500), cv::Scalar(0, 255, 0)); + } + else + { + std::string text = " 铜极中心和上边缘距离:" + std::to_string(_calResult.Out_Vale_L_centerUp); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 2500), cv::Scalar(0, 0, 255)); + data->halconOK = false; + plcResult = "2"; + } + + double Vale_T_cenretDown = data->service->_paramSyncManager->get("焊前", "终焊焊前检测铝极中心和下边缘距离差(下限)", 1).toDouble(); + if ((13 - Vale_T_cenretDown) < _calResult.Out_Vale_L_centerDown && _calResult.Out_Vale_L_centerDown < (13 + Vale_T_cenretDown)) + { + std::string text = " 铜极中心和下边缘距离:" + std::to_string(_calResult.Out_Vale_L_centerDown); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 3000), cv::Scalar(0, 255, 0)); + } + else + { + std::string text = " 铜极中心和下边缘距离:" + std::to_string(_calResult.Out_Vale_L_centerDown); + text = text.substr(0, text.find(".") + 4) + "mm"; + textPainter.putText(Paint, text, cv::Point(50, 3000), cv::Scalar(0, 0, 255)); + data->halconOK = false; + plcResult = "2"; + } + + for (int i = 0; i < 4; i++) + { + cv::line(Paint, cv::Point(_calResult.lines[i * 4 + 1], _calResult.lines[i * 4]), + cv::Point(_calResult.lines[i * 4 + 3], _calResult.lines[i * 4 + 2]), + cv::Scalar(0, 255, 0), 20); + } + cv::circle(Paint, cv::Point(_calResult.circleCenter.x, _calResult.circleCenter.y), _calResult.radius, cv::Scalar(0, 255, 0), 15); + } + else { + data->halconOK = false; + textPainter.putText(Paint, "NG:algoError", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + plcResult = "2"; + } + + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + xinBaoJianJu + "," + jiPianJianJu);//结果反馈 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + data->halconOK = false; + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2,-1,-1");//结果反馈 + return true; +} + +bool tieJiaoJianCe(std::shared_ptr data, detParams* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto sourceImg = data->getOriImg(0); + if(data->cameraKeyName == "Camera3" || data->cameraKeyName == "Camera5" || data->cameraKeyName == "Camera7") + sourceImg = cv::imread("D:\\testImg\\ORI0_60A01MB5601FAHC349438_60A01MB5601FAHC349437_DA3273471_0_01-54-42-61.png", -1); + else + sourceImg = cv::imread("D:\\testImg\\ORI0_60A01MB5601FAHC349438_60A01MB5601FAHC349437_DA3442575_0_01-54-42-78.png", -1); + if (sourceImg.rows == 100) { + cv::Mat Paint; + sourceImg.copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HDevEngineCpp::HDevProcedure proc("Cal_HY_Cover_Distance_Back_3_1"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HalconCpp::HObject in_Image; + //HalconCpp::HTuple in_Product = ("Al"); + HalconCpp::HTuple in_ProductType; + in_ProductType[0] = ("Al"); + in_ProductType[1] = ("yellow"); + //nlohmann::json m_json = readJsonFromPath("./config/ZhongHanConfig.json"); + int color_value = data->service->_paramSyncManager->get("终焊", "贴胶胶纸颜色(1蓝色 2黄色)", 1).toInt(); + if (color_value != 1) + in_ProductType[1] = ("yellow"); + else + in_ProductType[1] = ("blue"); + HalconCpp::HTuple in_Resolution(0.02727); + HalconCpp::HTuple in_FilePath = "./halconFiles/"; + HalconCpp::HTuple in_DIF_Value = 13; + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + if (data->cameraKeyName == "Camera5" || data->cameraKeyName == "Camera7") { + in_ProductType[0] = ("Gu"); + textPainter.putText(Paint, "铜", cv::Point(50, 1600), cv::Scalar(0, 0, 255)); + } + else + textPainter.putText(Paint, "铝", cv::Point(50, 1600), cv::Scalar(0, 0, 255)); + in_Image = MatToHObject(sourceImg); + procedureCall.SetInputIconicParamObject("in_Image", in_Image);// + procedureCall.SetInputCtrlParamTuple("in_ProductType", in_ProductType);// + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution);// + procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);// + procedureCall.SetInputCtrlParamTuple("in_DIF_Value", in_DIF_Value);// + procedureCall.Execute();//执行halcon程序 + HalconCpp::HTuple out_Distance, out_Circle, out_LinePoint, out_Flag, out_GluePosition; + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance"); + out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); + out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint"); + out_GluePosition = procedureCall.GetOutputCtrlParamTuple("out_GluePosition"); + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + QByteArray plcResult = "1"; + if (out_Flag.D() == 1) { + double distance1 = out_Distance[0].D(); + if (distance1 <= 12) {//NG + textPainter.putText(Paint, "上边缘和连接片圆心距:" + std::to_string(distance1), cv::Point(1400, 0), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + else { + textPainter.putText(Paint, "上边缘和连接片圆心距:" + std::to_string(distance1), cv::Point(1400, 0), cv::Scalar(0, 255, 0)); + } + double distance2 = out_Distance[1].D(); + if (distance2 <= 12) {//NG + textPainter.putText(Paint, "下边缘和连接片圆心距:" + std::to_string(distance2), cv::Point(1400, 200), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + else { + textPainter.putText(Paint, "下边缘和连接片圆心距:" + std::to_string(distance2), cv::Point(1400, 200), cv::Scalar(0, 255, 0)); + } + + circle(Paint, + cv::Point(out_Circle[1].D(), out_Circle[0].D()), + out_Circle[2].D(), cv::Scalar(0, 255, 0), 5); + cv::line(Paint, + cv::Point(out_LinePoint[1].D(), out_LinePoint[0].D()), + cv::Point(out_LinePoint[3].D(), out_LinePoint[2].D()), + cv::Scalar(0, 255, 0), 5 + ); + cv::line(Paint, + cv::Point(out_LinePoint[5].D(), out_LinePoint[4].D()), + cv::Point(out_LinePoint[7].D(), out_LinePoint[6].D()), + cv::Scalar(0, 255, 0), 5 + ); + int out_GluePosition_L = out_GluePosition.Length(); + for (auto i = 0; i < out_GluePosition_L / 4; i++) + { + cv::Mat mat; + sourceImg( + cv::Rect(out_GluePosition[i * 4].D(), + out_GluePosition[i * 4 + 1].D(), + out_GluePosition[i * 4 + 2].D(), + out_GluePosition[i * 4 + 3].D())).copyTo(mat); + data->insertSegOriginImg(mat); + } + } + + if (out_Flag.D() == 1) { + textPainter.putText(Paint, "有贴胶", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + plcResult = "1"; + } + else { + textPainter.putText(Paint, "无贴胶", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + plcResult = "2"; + data->halconOK = false; + } + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//发送结果 + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} + +void aiEvaluate(const cv::Mat& input, lieHengParam* _detParams, cv::Mat& Paint, bool& isNG){ + cv::Mat forSeg; + //input.copyTo(forSeg); + cv::resize(input, forSeg, cv::Size(), 0.25, 0.25); + cv::Mat segRes = ~_detParams->seg->Evaluate(forSeg); + //cv::resize(segRes, segRes, cv::Size(),4,4); + std::vector>contours; + cv::findContours(segRes, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + TextRendererZH textPainter(Paint.cols, Paint.rows, 50); + for (auto& contour : contours) { + cv::Rect rect = cv::boundingRect(contour); + rect.x *= 4; rect.y * 4; rect.width *= 4; rect.height *= 4; + if (rect.width < 600 || rect.height < 350) + continue; + cv::Mat clsImg = cutImg2Cls(rect, input); + int claResult = _detParams->cls->Evaluate(clsImg); + switch (claResult) + { + case 0://OK + cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3); + break; + case 1://NG + cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); + textPainter.putText(Paint, "NG", cv::Point(rect.x, rect.y), cv::Scalar(0, 0, 255)); + isNG = true; + break; + } + } + +} +bool diBuLieHeng(std::shared_ptr data, lieHengParam* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + auto oriImgs = data->getOriImgVec(); + oriImgs[0] = cv::imread("D:\\testImg\\ORI1_60A01MB5601FAED757502_DA3442391_0_00-57-18-67.png", -1); + if (oriImgs[0].rows == 100) { + cv::Mat Paint; + oriImgs[0].copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + + cv::Mat Paint; + QMutex paintMutex; + clock_t start, finish; + start = clock(); + cv::Mat src1 = oriImgs[0]; + if (src1.channels() != 3) + cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); + else + src1.copyTo(Paint); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 600); + + + QByteArray plcResult = "1"; + bool isNG = false; + aiEvaluate(src1, _detParams,Paint, isNG); + if (isNG == true) + { + textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 255, 0)); + plcResult = "2"; + } + + else + textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 0, 255)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + //data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//发送结果 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果 + return false; +} + +mission* createMission() { + return new _581_YiCiZhuYe_canye(); +} +void destroyMission(mission* _mission) { + delete _mission; +} + diff --git a/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.h b/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.h new file mode 100644 index 0000000..d6564f0 --- /dev/null +++ b/src/mission/601/601_ZH_Dibu/601_ZH_Dibu.h @@ -0,0 +1,170 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +struct hanQianDingWeiSubresult { + double toLeft = -1;//铝(负)极的包膜距离(mm) + double Out_Vale_L_centerUp = -1;//铝(负)极连接片中心的和上极耳水平边缘距离(mm) + double Out_Vale_L_centerDown = -1;//铝(负)极连接片中心的和下极耳水平边缘距离(mm) + double extremumValue = -1; + + cv::Point circleCenter; + double radius = 1; + std::vector lines; + + bool algoFailed = false; +}; +class zhongHanHanQianParams { +public: + QMutex* mutex = new QMutex(); + QQueue resultQueue; + QQueue mats; + ~zhongHanHanQianParams() { + delete mutex; + } + + int waitMs = 3000; + void insertImg(HObject& input) { + QMutexLocker locker(mutex); + if (mats.size() > 0) { + qWarning() << "焊前定位有遗留的图像,已清除"; + mats.clear(); + } + mats.enqueue(input);//发送检测数据到主线程 + } + bool waitImage(HObject& out) { + int cnt = 0; + while (mats.size() == 0 && cnt < waitMs) { + QThread::msleep(2); + cnt += 2; + } + if (mats.size() != 0) { + QMutexLocker locker(mutex); + out = mats.dequeue(); + return true; + } + return false; + } + void insertResult(hanQianDingWeiSubresult input) { + QMutexLocker locker(mutex); + if (resultQueue.size() > 0) { + qWarning() << "焊前定位有遗留的结果,已清除"; + resultQueue.clear(); + } + resultQueue.enqueue(input);//发送检测数据到主线程 + } + bool waitResult(hanQianDingWeiSubresult& out) { + int cnt = 0; + while (resultQueue.size() == 0 && cnt < waitMs) { + QThread::msleep(2); + cnt += 2; + } + if (resultQueue.size() != 0) { + QMutexLocker locker(mutex); + out = resultQueue.dequeue(); + resultQueue.clear(); + return true; + } + return false; + } +}; +struct lieHengParam { + handdleAI::pSegmentation* seg; + handdleAI::pClassification* cls; +}; +bool retrunSignal(std::shared_ptr data, detParams* _detParams, sx_581_address address) { + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); + return true; +} +bool hanQianCeLiang_Main(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address); +bool hanQianCeLiang_Sub(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address); + +bool tieJiaoJianCe(std::shared_ptr data, detParams* _detParams, sx_581_address address); +bool diBuLieHeng(std::shared_ptr data, lieHengParam* _detParams, sx_581_address address); +class _581_YiCiZhuYe_canye : public mission { +public: + _581_SX_Single_triggerTemplate< zhongHanHanQianParams> hanQianDingWei1; + _581_SX_Single_triggerTemplate< zhongHanHanQianParams> hanQianDingWei2; + + _581_SX_Single_triggerTemplate< lieHengParam> lieHeng_dibu90_1; + _581_SX_Single_triggerTemplate< lieHengParam> lieHeng_dibu90_4; + + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu90_1; + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu90_4; + + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu90_1; + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu90_4; + + _581_SX_Single_triggerTemplate< detParams> lieHeng_dibu45_2; + _581_SX_Single_triggerTemplate< detParams> lieHeng_dibu45_3; + _581_SX_Single_triggerTemplate< detParams> lieHeng_dibu45_5; + _581_SX_Single_triggerTemplate< detParams> lieHeng_dibu45_6; + + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu45_2; + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu45_3; + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu45_5; + _581_SX_Single_triggerTemplate< detParams> lieXi_dibu45_6; + + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu45_2; + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu45_3; + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu45_5; + _581_SX_Single_triggerTemplate< detParams> tieJiao_dibu45_6; + + detParams _detParams; + zhongHanHanQianParams _ZH_HQDW_Param; + lieHengParam _lieHengParam1; + lieHengParam _lieHengParam2; + bool initOnce = false; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_628_1.hdpl"); + if (initOnce == false) { + _lieHengParam1.seg = handdleAI::CreateSegObjS("./handleaiModels/seg-zhongHanHanHouDiBu.BHD", 1, 0); + _lieHengParam1.cls = handdleAI::CreateClsObjV3("./handleaiModels/cls-zhongHanHanHouDiBu.BHD", 0, 1); + + _lieHengParam2.seg = handdleAI::CreateSegObjS("./handleaiModels/seg-zhongHanHanHouDiBu.BHD", 1, 1); + _lieHengParam2.cls = handdleAI::CreateClsObjV3("./handleaiModels/cls-zhongHanHanHouDiBu.BHD", 1, 1); + + initOnce = true; + } + } + bool initCustom() { +#pragma region 注册触发器回调 + hanQianDingWei1.init("Camera1", "焊前定位-铜", { { 5060, 1,{5070,5100},"5062","5064",5066} }, 1, &_ZH_HQDW_Param, _serviceManager, bridge, hanQianCeLiang_Main, "焊前定位CCD"); + hanQianDingWei2.init("Camera2", "焊前定位-铝", { { 5090, 1,{5070,5100},"5092","5094",5096} }, 1, &_ZH_HQDW_Param, _serviceManager, bridge, hanQianCeLiang_Sub, "焊前定位CCD"); + + tieJiao_dibu90_1.init("Camera3", "反面贴胶-相机1", { { 5500, 1,{5530,5480},"5502","5504"} }, 1, &_detParams, _serviceManager, bridge, tieJiaoJianCe, "贴胶检测CCD"); + tieJiao_dibu45_2.init("virtualCamera02", "贴胶底部45_2", { { 5510, 1,{5530,5480},"5512","5514"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + tieJiao_dibu45_3.init("virtualCamera03", "贴胶底部45_3", { { 5520, 1,{5530,5480},"5522","5524"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + tieJiao_dibu90_4.init("Camera4", "反面贴胶-相机4", { { 5530, 1,{5530,5480},"5532","5534"} }, 1, &_detParams, _serviceManager, bridge, tieJiaoJianCe, "贴胶检测CCD"); + tieJiao_dibu45_5.init("virtualCamera05", "贴胶底部45_5", { { 5540, 1,{5530,5480},"5542","5544"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + tieJiao_dibu45_6.init("virtualCamera06", "贴胶底部45_6", { { 5550, 1,{5530,5480},"5552","5554"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + + lieHeng_dibu90_1.init("Camera5", "裂痕检测-相机1", { { 5200, 1,{5120,5140},"5202","5204"} }, 1, &_lieHengParam1, _serviceManager, bridge, diBuLieHeng, "底部检测CCD"); + lieHeng_dibu45_2.init("virtualCamera12", "裂痕底部45_2", { { 5210, 1,{5120,5140},"5212","5214"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieHeng_dibu45_3.init("virtualCamera13", "裂痕底部45_3", { { 5220, 1,{5120,5140},"5222","5224"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieHeng_dibu90_4.init("Camera6", "裂痕检测-相机4", { { 5230, 1,{5120,5140},"5232","5234"} }, 1, &_lieHengParam2, _serviceManager, bridge, diBuLieHeng, "底部检测CCD"); + lieHeng_dibu45_5.init("virtualCamera15", "裂痕底部45_5", { { 5240, 1,{5120,5140},"5242","5244"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieHeng_dibu45_6.init("virtualCamera16", "裂痕底部45_6", { { 5250, 1,{5120,5140},"5252","5254"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + + lieXi_dibu90_1.init("Camera7", "正面贴胶-相机1", { { 5280, 1,{5160,5180},"5282","5284"} }, 1, &_detParams, _serviceManager, bridge, tieJiaoJianCe, "贴胶检测CCD"); + lieXi_dibu45_2.init("virtualCamera22", "裂隙底部45_2", { { 5290, 1,{5160,5180},"5292","5294"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieXi_dibu45_3.init("virtualCamera23", "裂隙底部45_3", { { 5300, 1,{5160,5180},"5302","5304"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieXi_dibu90_4.init("Camera8", "正面贴胶-相机4", { { 5310, 1,{5160,5180},"5312","5314"} }, 1, &_detParams, _serviceManager, bridge, tieJiaoJianCe, "贴胶检测CCD"); + lieXi_dibu45_5.init("virtualCamera25", "裂隙底部45_5", { { 5320, 1,{5160,5180},"5322","5334"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + lieXi_dibu45_6.init("virtualCamera26", "裂隙底部45_6", { { 5330, 1,{5160,5180},"5332","5334"} }, 1, &_detParams, _serviceManager, bridge, retrunSignal); + +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581-Ruke/CMakeLists.txt b/src/mission/601/601_ZH_Dibu/CMakeLists.txt similarity index 100% rename from src/mission/581-Ruke/CMakeLists.txt rename to src/mission/601/601_ZH_Dibu/CMakeLists.txt diff --git a/src/mission/952/CMakeLists.txt b/src/mission/601/CMakeLists.txt similarity index 100% rename from src/mission/952/CMakeLists.txt rename to src/mission/601/CMakeLists.txt diff --git a/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.cpp b/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.cpp deleted file mode 100644 index bc56747..0000000 --- a/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include <602_RuanLianJie_dinggai.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} - -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.h b/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.h deleted file mode 100644 index 1282e7f..0000000 --- a/src/mission/602_RuanLianJie_dinggai/602_RuanLianJie_dinggai.h +++ /dev/null @@ -1,394 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class RuanLianJie_dinnggai { -public: - handdleAI::pSegmentation* segDingwei1 = nullptr; - handdleAI::pSegmentation* seg = nullptr; - handdleAI::pClassification* cls = nullptr; - cv::Mat TP1IMG, TP2Paint; -}; -QByteArray keMaResult = "0"; -QByteArray okNgSaveText = "OK"; -cv::Rect getImageLocateRect(cv::Mat& src, handdleAI::pSegmentation* seg, double bounus = 0.1) { - cv::Mat tmpImg; - cv::resize(src, tmpImg, cv::Size(), bounus, bounus); - cv::Mat ouput = ~seg->Evaluate(tmpImg); - cv::Rect rect = findMaxAreaContour(ouput); - rect.x /= bounus; rect.y /= bounus; - rect.width /= bounus; rect.height /= bounus; - return rect; -} - -bool dinggaijiance(std::shared_ptr data, RuanLianJie_dinnggai* _detParams, sx_581_address address) { - try { -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - if(address.triggerValue == 1) - data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", - 1); - if (address.triggerValue == 2) - data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-32.bmp", -1); - if (address.triggerValue == 3) - data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", -1); - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; - double Resolution = 0.01424; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - if (address.triggerValue == 2) - { - HDevEngineCpp::HDevProcedure proc("_3_Cal_FBF_Distance");; - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, 8); - HObject in_Image = MatToHObject(sourceImg); - HalconCpp::HTuple in_Resolution(Resolution), in_FilePath("./halconFiles/"); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute();//执行halcon程序 - HalconCpp::HTuple out_LinePoint, out_Circle, out_Flag, out_Distance,out_NgTails; - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 - out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 - out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails");//获取输出控制类变量 - keMaResult = "1"; - if (out_Flag.D() == 1) - { - int crossLineLength = 50; - TextRendererZH textPainter(Paint.cols, Paint.rows, 140); - for (int i = 0; i < out_LinePoint.Length() / 4; i++) - { - cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 10); - } - double distance = out_Distance[0].D(); - distance -= out_Circle[2].D() * Resolution;//CHEAT!!! - circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5); - { - //data1 = QByteArray::number(distance); - std::string text = "二维码与防爆阀相对位置:" + std::to_string(distance); - text = text.substr(0, text.find(".") + 4) + "mm"; - - textPainter.putText(Paint, - (text).c_str(), - cv::Point(100, 500), cv::Scalar(0, 255, 0)); - } - double distance2 = out_Distance[1].D();//二维码的宽度值 - { - QByteArray::number(distance2); - std::string text = "二维码与防爆阀间距:" + std::to_string(distance2); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(Paint, - (text).c_str(), - cv::Point(100, 650), cv::Scalar(0, 255, 0)); - } - double distance3 = out_Distance[2].D();//二维码下方字符串的宽度值 - { - std::string text = "二维码的宽度值:" + std::to_string(distance3); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(Paint, - (text).c_str(), - cv::Point(100, 800), cv::Scalar(0, 255, 0)); - } - //double distance4 = out_Distance[3].D();//二维码左侧字符串的高度值 - //{ - // std::string text = "二维码左字符水平宽度:" + std::to_string(distance4); - // text = text.substr(0, text.find(".") + 4) + "mm"; - // putTextHusky(Paint, - // utf8_to_gbk(text).c_str(), - // cv::Point(100, 950), cv::Scalar(0, 255, 0), 140); - //} - //double distance5 = out_Distance[4].D();//二维码右侧到电芯右侧边缘距离 - //{ - // data2 = QByteArray::number(distance2); - // std::string text = "右间距:" + std::to_string(distance5); - // text = text.substr(0, text.find(".") + 4) + "mm"; - // putTextHusky(Paint, - // utf8_to_gbk(text).c_str(), - // cv::Point(50, 350), cv::Scalar(0, 255, 0), 280); - //} - if (distance > 11.9 || distance < 5.9) - { - std::string text = "上间距NG"; - TextRendererZH textPainter1(Paint.cols, Paint.rows, 280); - textPainter1.putText(Paint, - (text).c_str(), - cv::Point(50, 50), cv::Scalar(0, 0, 255)); - keMaResult = "2"; - okNgSaveText = "NG"; - } - /* if (distance5 > 33.2 || distance5 < 27.2) - { - std::string text = "右间距NG"; - putTextHusky(Paint, - utf8_to_gbk(text).c_str(), - cv::Point(2500, 350), cv::Scalar(0, 0, 255), 280); - keMaResult = "2"; - okNgSaveText = "NG"; - }*/ - - } - else - { - qDebug() << __FUNCTION__ << "line:" << __LINE__ << "二维码error"; - TextRendererZH textPainter2(Paint.cols, Paint.rows, 500); - auto ngDetail = gbkToUtf8(out_NgTails.ToString().Text()); - textPainter2.putText(Paint, ngDetail, cv::Point(0, 50), cv::Scalar(0, 0, 255)); - keMaResult = "2"; - okNgSaveText = "NG"; - } - //#endif - Paint.copyTo(_detParams->TP2Paint); - } - - else if (address.triggerValue == 1) - { - okNgSaveText = "OK"; - keMaResult = "1"; - sourceImg.copyTo(_detParams->TP1IMG); - } - - else if (address.triggerValue == 3) - { - Paint = cv::Mat(_detParams->TP1IMG.rows, _detParams->TP1IMG.cols * 3, CV_8UC1); - _detParams->TP1IMG.copyTo(Paint(cv::Rect(0, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); - sourceImg.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, 8); - _detParams->TP2Paint.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols * 2, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows))); - cv::Mat PaintPart2 = Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)); - HDevEngineCpp::HDevProcedure proc("_3_Cal_JZ_Distance");; - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HObject in_Image1, in_Image2; - in_Image1 = MatToHObject(_detParams->TP1IMG); - in_Image2 = MatToHObject(sourceImg); - HalconCpp::HTuple in_FilePath(" "), in_Resolution(Resolution); - procedureCall.SetInputIconicParamObject("in_Image1", in_Image1); - procedureCall.SetInputIconicParamObject("in_Image2", in_Image2); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute();//执行halcon程序 - HalconCpp::HTuple out_Edgedistance, out_Distance, out_LinePoint, out_Flag; - out_Edgedistance = procedureCall.GetOutputCtrlParamTuple("out_Edgedistance");//获取输出控制类变量 - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - if (out_Flag.D() == 1) - { - for (int i = 0; i < 4; i++) - { - cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 15); - } - for (int i = 4; i < 8; i++) - { - cv::line(PaintPart2, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 15); - } - double Distance = out_Distance.D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 280); - //Paint - { - std::string text = "垂直间距:" + std::to_string(out_Edgedistance[0].D()); - //data3 = QByteArray::number(out_Edgedistance[0].D()); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(Paint, - (text).c_str(), - cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - { - //data4 = QByteArray::number(out_Edgedistance[1].D()); - std::string text = "水平间距:" + std::to_string(out_Edgedistance[1].D()); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(Paint, - (text).c_str(), - cv::Point(50, 300), cv::Scalar(0, 255, 0)); - } - { - //data5 = QByteArray::number(out_Edgedistance[2].D()); - std::string text = "垂直间距:" + std::to_string(out_Edgedistance[2].D()); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(PaintPart2, - (text).c_str(), - cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - { - //data6 = QByteArray::number(out_Edgedistance[3].D()); - std::string text = "水平间距:" + std::to_string(out_Edgedistance[3].D()); - text = text.substr(0, text.find(".") + 4) + "mm"; - textPainter.putText(PaintPart2, - (text).c_str(), - cv::Point(50, 300), cv::Scalar(0, 255, 0)); - } - /*{ - std::string text = "极柱间距:" + std::to_string(Distance); - text = text.substr(0, text.find(".") + 4) + "mm"; - putTextHusky(Paint, - utf8_to_gbk(text).c_str(), - cv::Point(50, 550), cv::Scalar(0, 0, 255), 280); - putTextHusky(PaintPart2, - utf8_to_gbk(text).c_str(), - cv::Point(50, 550), cv::Scalar(0, 0, 255), 280); - }*/ - - } - else - { - TextRendererZH textPainter1(Paint.cols, Paint.rows, 500); - textPainter1.putText(Paint, "NG,vv", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - okNgSaveText = "NG"; - } - plcResult = keMaResult; - plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - return true; - } - sourceImg.release(); - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; -} -bool majiarerong(std::shared_ptr data, RuanLianJie_dinnggai * _detParams, sx_581_address address) { - try { -#if 0 - -#else - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4)+ "_1");//铝热熔面积 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数 - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//铝热熔面积 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数 - return true; -} - -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_1; - _581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_2; - _581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_3; - _581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_4; - - - - RuanLianJie_dinnggai DetParams1; - RuanLianJie_dinnggai DetParams2; - RuanLianJie_dinnggai DetParams3; - RuanLianJie_dinnggai DetParams4; - - - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - - } - bool initCustom() { -#pragma region 注册触发器回调 - dibu_1.init("Camera1", "顶盖检测刻码后-相机1", { { 5000, 1,{5010},"5002","5004",-1},{ 5000, 2,{5010},"5002","5004",-1},{ 5000, 3,{5010},"5002","5004",5030} }, 1, &DetParams1, _serviceManager, bridge, dinggaijiance, "防爆阀CCD"); - dibu_2.init("Camera2", "顶盖检测刻码后-相机2", { { 5100, 1,{5110},"5102","5104",-1},{ 5100, 2,{5110},"5102","5104",-1},{ 5100, 3,{5110},"5102","5104",5130} }, 1, &DetParams2, _serviceManager, bridge, dinggaijiance, "防爆阀CCD"); - dibu_3.init("Camera3", "马甲热熔检测-相机1", { { 5200, 1,{5210},"5202","5204",5230 }}, 1, &DetParams3, _serviceManager, bridge, majiarerong, "马甲热熔CCD"); - dibu_4.init("Camera4", "马甲热熔检测-相机2", { { 5300, 1,{5310},"5302","5304",5330} }, 1, &DetParams4, _serviceManager, bridge, majiarerong, "马甲热熔CCD"); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/602_RuanLianJie_dinggai/CMakeLists.txt b/src/mission/602_RuanLianJie_dinggai/CMakeLists.txt deleted file mode 100644 index 29a2ad1..0000000 --- a/src/mission/602_RuanLianJie_dinggai/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -# 获取获取当前目录名 -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/952_15_Q_2D3D.cpp b/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp deleted file mode 100644 index 3308a80..0000000 --- a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#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 deleted file mode 100644 index df223f1..0000000 --- a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D.h +++ /dev/null @@ -1,355 +0,0 @@ -#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(_serviceManager->_paramSyncManager->getGroup(1), "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 deleted file mode 100644 index 3d4b053..0000000 --- a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#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 deleted file mode 100644 index 70c8441..0000000 --- a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/952_15_Q_2D3D.h +++ /dev/null @@ -1,491 +0,0 @@ -#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 deleted file mode 100644 index 76bbff3..0000000 --- a/src/mission/952/952_15_Q_2D3D/952_15_Q_2D3D/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 deleted file mode 100644 index 29a2ad1..0000000 --- a/src/mission/952/952_15_Q_2D3D/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -# 获取获取当前目录名 -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 deleted file mode 100644 index 3a3b330..0000000 --- a/src/mission/952/952_15_Q_2D3D/backend.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "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 deleted file mode 100644 index be4130e..0000000 --- a/src/mission/952/952_15_Q_2D3D/externalData.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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 deleted file mode 100644 index 8136a14..0000000 --- a/src/mission/952/952_15_Q_2D3D/setting.json +++ /dev/null @@ -1,623 +0,0 @@ -{ - "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/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp b/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp deleted file mode 100644 index 73ba8cd..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp +++ /dev/null @@ -1,233 +0,0 @@ -#include <581-BaoMo-Cam1213.h> - -struct halconResult { - double resultX = -99; - double resultY = -99; -}; -halconResult dituo(std::shared_ptr data,cv::Mat& src, cv::Mat& Paint,bool isLeft) { - halconResult result; - try { - cv::Mat srcHalf; - cv::resize(src, srcHalf, cv::Size(0, 0), 0.5, 0.5); - if (srcHalf.channels() != 3) - cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR); - else - srcHalf.copyTo(Paint); - TextRendererZH textPainter(Paint.cols, Paint.rows, 50); - - HalconCpp::HObject in_Image = MatToHObject(src); - HDevEngineCpp::HDevProcedure proc("_4_TD_BlueCover_Inspection"); - HDevProcedureCall procedureCall(proc); - - //vs+halcon联调debug - /*HDevEngineCpp::HDevEngine myEngine; - myEngine.StartDebugServer(); - procedureCall.SetWaitForDebugConnection(true);*/ - - HTuple in_Par, in_FilePath("./halconFiles/"); - in_Par[0] = data->service->_paramSyncManager->get("底托检测", "宽度阈值(mm)", 150).toInt(); - in_Par[1] = data->service->_paramSyncManager->get("底托检测", "高度阈值(mm)", 150).toInt(); - in_Par[2] = data->service->_paramSyncManager->get("底托检测", "面积阈值(mm)", 300).toInt(); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Par", in_Par); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute(); - HTuple out_X = procedureCall.GetOutputCtrlParamTuple("out_X"); - HTuple out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails"); - int outFlag = out_Flag.D(); - //handleAiFuture.wait(); - //_result = handleAiFuture.get(); - if (outFlag == 1) { - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - else { - data->halconOK = false; - int L = out_Y.Length(); - for (int i = 0; i < out_Y.Length() / 2 - 1; i++) { - Paint.at(cv::Point(out_X[i * 2 + 1].D(), out_Y[i * 2 + 1].D()) / 2) = cv::Vec3b(0, 0, 255); - /* cv::circle(Paint, cv::Point(out_X[i * 2 + 1].D(), out_Y[i * 2].D()) / 2, 1, - cv::Scalar(0, 0, 255), 1);*/ - } - std::string ngDetails = out_NgDetails.ToString().Text(); - result.resultX = out_X.D(); - result.resultY = out_Y.D(); - if (isLeft == true) { - textPainter.putText(Paint, "缺陷长度:" + std::to_string(result.resultX) + "mm", cv::Point(700, 800), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "缺陷宽度:" + std::to_string(result.resultY) + "mm", cv::Point(700, 850), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(700, 900), cv::Scalar(0, 0, 255)); - } - else { - textPainter.putText(Paint, "缺陷长度:" + std::to_string(result.resultX) + "mm", cv::Point(50, 800), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "缺陷宽度:" + std::to_string(result.resultY) + "mm", cv::Point(50, 850), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(50, 900), cv::Scalar(0, 0, 255)); - } - } - } - CATCH_EXCEPTIONS - return result; -} -bool ALGO_BaoMoHouDiBu_test(std::shared_ptr data, baoMoHouDiBuDetParams* _detParams, yh_581_address address) { - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - std::vector < std::string> defects; - - data->oriImgs.clear(); - data->oriImgs.push_back(cv::imread("D://testImage/dituo_1.bmp", -1)); - data->oriImgs.push_back(cv::imread("D://testImage/dituo_2.bmp", -1)); - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 2) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - data->resultImgs.push_back(Paint); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - return false; - } - - cv::Mat Paint,Paint1,Paint2; - bool leftFirst = address.triggerAddr == 20200; - auto feature1 = std::async(std::launch::async,dituo, data, std::ref(data->oriImgs[0]), std::ref(Paint1),leftFirst); - auto feature2 = std::async(std::launch::async, dituo, data, std::ref(data->oriImgs[1]), std::ref(Paint2),~leftFirst); - feature1.wait(); - halconResult hResult1 = feature1.get(); - - feature2.wait(); - halconResult hResult2 = feature2.get(); - cv::hconcat(Paint1, Paint2, Paint); - - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(hResult1.resultX));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(hResult1.resultY));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(hResult2.resultX));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(hResult2.resultY));//发送结果 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果 - data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects); - data->resultImgs.push_back(Paint); - } - CATCH_EXCEPTIONS - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果 - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - data->resultImgs.push_back(Paint); - return true; -} -bool ALGO_BaoMoHouDiBu(std::shared_ptr data, baoMoHouDiBuDetParams* _detParams, yh_581_address address) { - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - std::vector < std::string> defects; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 2) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - data->resultImgs.push_back(Paint); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - data->resultImgs.push_back(Paint); - return false; - } - - cv::Mat Paint; - clock_t start, finish; - start = clock(); - - cv::Mat src1 = data->oriImgs[0]; - cv::Mat srcHalf; - cv::resize(src1, srcHalf, cv::Size(0, 0), 0.5, 0.5); - if (srcHalf.channels() != 3) - cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR); - else - srcHalf.copyTo(Paint); - TextRendererZH textPainter(Paint.cols, Paint.rows, 50); - HalconCpp::HObject in_Image = MatToHObject(src1); - //vs+halcon联调debug - HDevEngineCpp::HDevProcedure proc("_4_TD_BlueCover_Inspection"); - HDevProcedureCall procedureCall(proc); - - /*HDevEngineCpp::HDevEngine myEngine; - myEngine.StartDebugServer(); - procedureCall.SetWaitForDebugConnection(true);*/ - - HTuple in_Par, in_FilePath("./halconFiles/"); - in_Par[0] = data->service->_paramSyncManager->get("底托检测","宽度阈值(mm)", 150).toInt(); - in_Par[1] = data->service->_paramSyncManager->get("底托检测", "高度阈值(mm)", 150).toInt(); - in_Par[2] = data->service->_paramSyncManager->get("底托检测", "面积阈值(mm)", 300).toInt(); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Par", in_Par); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute(); - HTuple out_X = procedureCall.GetOutputCtrlParamTuple("out_X"); - HTuple out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails"); - int outFlag = out_Flag.D(); - //handleAiFuture.wait(); - //_result = handleAiFuture.get(); - double resultX = -99, resultY = -99; - if (outFlag == 1) { - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - else { - data->halconOK = false; - for (int i = 0; i < out_Y.Length() / 2 - 1; i++) { - cv::circle(Paint, cv::Point(out_X[i * 2 + 1].D(), out_Y[i * 2].D()) / 2, 1, - cv::Scalar(0, 0, 255), 1); - } - std::string ngDetails = out_NgDetails.ToString().Text(); - resultX = out_X.D(); - resultY = out_Y.D(); - if (address.triggerAddr == 20200 || address.triggerAddr == 20402) { - textPainter.putText(Paint, "缺陷长度:" + std::to_string(resultX) + "mm", cv::Point(700, 800), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "缺陷宽度:" + std::to_string(resultY) + "mm", cv::Point(700, 850), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(700, 900), cv::Scalar(0, 0, 255)); - } - else { - textPainter.putText(Paint, "缺陷长度:" + std::to_string(resultX) + "mm", cv::Point(50, 800), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "缺陷宽度:" + std::to_string(resultY) + "mm", cv::Point(50, 850), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(50, 900), cv::Scalar(0, 0, 255)); - } - } - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(resultX));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(resultY));//发送结果 - data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects); - data->resultImgs.push_back(Paint); - } - CATCH_EXCEPTIONS - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(-99));//发送结果 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果 - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - data->resultImgs.push_back(Paint); - return true; -} - -mission* createMission() { - return new _581_BaoMo(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.h b/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.h deleted file mode 100644 index ada0fbc..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.h +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include -#include -#include -using namespace HDevEngineCpp; - -class baoMoHouDiBuDetParams { -public: - -}; -static bool ALGO_BaoMoHouDiBu_test(std::shared_ptr data, baoMoHouDiBuDetParams* _detParams, yh_581_address address); -static bool ALGO_BaoMoHouDiBu(std::shared_ptr data, baoMoHouDiBuDetParams* _detParams, yh_581_address address); - - -class _581_BaoMo : public mission { -public: - using baoMoHouDiBuTrigger = _581_Single_triggerTemplate; - baoMoHouDiBuTrigger _station_1; - baoMoHouDiBuTrigger _station_2; - - baoMoHouDiBuDetParams _baoMoHouDiBuDetParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - - _station_1.init("Camera1","包膜后底托位置度检测-左-相机12",20200,1,2, &_baoMoHouDiBuDetParams,_serviceManager,bridge, ALGO_BaoMoHouDiBu_test); - _station_2.init("Camera2", "包膜后底托位置度检测-右-相机13",20400,1,2,&_baoMoHouDiBuDetParams, _serviceManager, bridge, ALGO_BaoMoHouDiBu_test); -#pragma endregion - return true; - } - - - //9600 -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam1213/CMakeLists.txt b/src/mission/BaoMo/581-BaoMo-Cam1213/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1213/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp deleted file mode 100644 index 01c0853..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#include <581-BaoMo-Cam1234.h> - -void exceptionResume(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - //if (data->service->_paramSyncManager->get("强制OK", false).toBool()) - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - //else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} - -cv::Rect extractRegion(cv::Mat& src,int binary_threshold = 50) { - cv::Mat binary; - threshold(src, binary, binary_threshold, 255, cv::THRESH_BINARY); - cv::dilate(binary, binary, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5))); - std::vector> contours; - findContours(binary, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - - double maxArea = 0; - int maxAreaIdx = -1; - for (size_t i = 0; i < contours.size(); i++) { - double area = contourArea(contours[i]); - if (area > maxArea) { - maxArea = area; - maxAreaIdx = i; - } - } - cv::Rect boundingRect = cv::boundingRect(contours[maxAreaIdx]); - return boundingRect; -} -int index = 0; -bool BaoMoQianShangDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - ///////////////////取图//处理////////////////// - try { - //data->oriImgs[0] = cv::imread("D:\\testImg\\Camera1.bmp"); - cv::Mat src = data->oriImgs[0]; - - //////////////////////检测////////////////////// - cv::Mat afterDingWei; - { - cv::Mat forDingWei; - cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1); - cv::Mat segResult = ~_detParams->dingwei_seg->Evaluate(forDingWei); - auto rect = findMaxAreaContour(segResult); - rect.x *= 10; rect.y *= 10; rect.width *= 10; rect.height *= 10; - if (rect.width < 4000 || rect.height < 4000) { - exceptionResume(data, _detParams, address, "定位失败"); - return true; - } - src(rect).copyTo(afterDingWei); - } - cv::resize(afterDingWei, afterDingWei, cv::Size(), 0.5, 0.5); - cv::Mat Paint; - if (afterDingWei.channels() == 1) - cv::cvtColor(afterDingWei, Paint, cv::COLOR_GRAY2RGB); - else - afterDingWei.copyTo(Paint); - - data->segOriginImgs.push_back(afterDingWei); - cv::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - std::vector>contours; - cv::findContours(segResult, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - bool isNg = false; - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width < 60 || rect.height < 60) - continue; - std::vector clsImgs = cutImg2ClsVec(rect, afterDingWei); - bool clsIsNg = false; - for (auto& clsImg : clsImgs) { - int clsResult = _detParams->baomodamian_cls->Evaluate(clsImg); - if (clsResult == 2) - clsIsNg = true; - } - if (clsIsNg == true) - cv::drawContours(Paint, contours, i, cv::Scalar(0, 0, 255), 3); - - for (auto& clsImg : clsImgs) - data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",clsImg }); - } - - data->resultImgs.push_back(Paint); - if (isNg == true) - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - else - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测异常"); - return true; - -} - -bool BaoMoQianXiaDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) { - - QString date = QDateTime::currentDateTime().toString("yyyy_MM_dd_HH_mm_ss_").toUtf8() + QString::number(index++); - data->SNcode = date.toStdString(); - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - index++; - ///////////////////取图//处理////////////////// - try { - //data->oriImgs[0] = cv::imread("D:\\testImg\\Camera2.bmp"); - cv::Mat src = data->oriImgs[0]; - - //////////////////////检测////////////////////// - cv::Mat afterDingWei; - { - cv::Mat forDingWei; - cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1); - cv::Mat segResult = ~_detParams->dingwei_seg->Evaluate(forDingWei); - auto rect = findMaxAreaContour(segResult); - rect.x *= 10; rect.y *= 10; rect.width *= 10; rect.height *= 10; - if (rect.width < 4000 || rect.height < 4000) { - exceptionResume(data, _detParams, address, "定位失败"); - return true; - } - src(rect).copyTo(afterDingWei); - } - cv::resize(afterDingWei, afterDingWei, cv::Size(), 0.5, 0.5); - cv::Mat Paint; - if (afterDingWei.channels() == 1) - cv::cvtColor(afterDingWei, Paint, cv::COLOR_GRAY2RGB); - else - afterDingWei.copyTo(Paint); - data->segOriginImgs.push_back(afterDingWei); - cv::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - std::vector>contours; - cv::findContours(segResult, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - bool isNg = false; - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width < 60 || rect.height < 60) - continue; - std::vector clsImgs = cutImg2ClsVec(rect, afterDingWei); - bool clsIsNg = false; - for (auto& clsImg : clsImgs) { - int clsResult = _detParams->baomodamian_cls->Evaluate(clsImg); - if (clsResult == 2) - clsIsNg = true; - } - if (clsIsNg == true) - cv::drawContours(Paint, contours, i, cv::Scalar(0, 0, 255), 3); - - for (auto& clsImg : clsImgs) - data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",clsImg }); - } - - data->resultImgs.push_back(Paint); - if(isNg == true) - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - else - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测异常"); - return true; - -} -mission* createMission() { - return new _581_BaoMo_Cam1234(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h deleted file mode 100644 index 5c3def1..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -using namespace HDevEngineCpp; - -class baoMoQianDaMianDetParams { -public: - handdleAI::pSegmentation* dingwei_seg = nullptr; - handdleAI::pSegmentation* baomodamian_seg = nullptr; - handdleAI::pClassification* baomodamian_cls = nullptr; -}; - - - -bool BaoMoQianShangDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address); -bool BaoMoQianXiaDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address); -class _581_BaoMo_Cam1234 : public mission { -public: - using baoMoQianDaMianTrigger = _581_Union_triggerTemplate; - baoMoQianDaMianTrigger _shangdamian_1; - baoMoQianDaMianTrigger _xiadamian_2; - std::vector _baoMoQianDaMianDetParams = std::vector< baoMoQianDaMianDetParams>(2); - - using generalTrigger = _581_Union_triggerTemplate; - generalTrigger _station_3; - generalTrigger _station_4; - detParams _detParams; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - - if (initOnce == false) { - _baoMoQianDaMianDetParams[0].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMianDingWei_Seg.BHD", 64, 0); - _baoMoQianDaMianDetParams[1].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMianDingWei_Seg.BHD", 0, 1); - - _baoMoQianDaMianDetParams[0].baomodamian_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 0); - _baoMoQianDaMianDetParams[1].baomodamian_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 1); - - _baoMoQianDaMianDetParams[0].baomodamian_cls = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 0, 1); - _baoMoQianDaMianDetParams[1].baomodamian_cls = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 1, 1); - - initOnce = true; - } - - - } - bool initCustom() { -#pragma region 注册触发器回调 - _shangdamian_1.init("Camera1","包膜前外观检测大面相机1(上大面)", 18000,2, 1, &_baoMoQianDaMianDetParams[0], _serviceManager, bridge, BaoMoQianShangDaMian); - _xiadamian_2.init("Camera2", "包膜前外观检测大面相机2(下大面)", 18200,2, 1, &_baoMoQianDaMianDetParams[1], _serviceManager, bridge, BaoMoQianXiaDaMian); - - _station_3.init("Camera3", "包膜前产品边缘检测大面-外-相机3(下大面顶盖侧)", 18400,2, 2, &_detParams,_serviceManager,bridge, generalAlgoTest); - _station_4.init("Camera4", "包膜前产品边缘检测大面-内-相机4(下大面底部侧)", 18600 ,2, 2, &_detParams, _serviceManager, bridge, generalAlgoTest); -#pragma endregion - return true; - } - void reloadAlgo(QByteArray& byteArray) { - - } - - //9600 -}; - - - -#pragma once \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam1234/CMakeLists.txt b/src/mission/BaoMo/581-BaoMo-Cam1234/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.cpp b/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.cpp deleted file mode 100644 index a9252aa..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-BaoMo-Cam5678.h> - -mission* createMission() { - return new _581_BaoMo(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h b/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h deleted file mode 100644 index d215e71..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h +++ /dev/null @@ -1,264 +0,0 @@ -#include -#include - -struct _581_BaoMoResult -{ - bool result = true; - std::vector < std::string> defects; -}; -class baoMoHouDaMianDetParams { -public: - handdleAI::pSegmentation* dingwei_seg = nullptr; - handdleAI::pSegmentation* seg = nullptr; - handdleAI::pClassification* cls = nullptr; -}; -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -#pragma region 算法 - -std::vector BaoMoHou_DaMianAi(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, - baoMoHouDaMianDetParams* _detParams) { - if (_detParams->seg == nullptr || _detParams->cls == nullptr) - return {}; - std::vector defects; - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - bool huaShangNg = false; - cv::Mat segImg = ~_detParams->seg->Evaluate(src); - std::vector> contours; - cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); - bool isOK = true; - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width < 100 || rect.height < 100) continue; // 过滤掉小轮廓 - auto clsImgs = cutImg2ClsVec(rect, src, cv::Size(128, 128)); - bool clsIsNg = false; - for (auto& clsImg : clsImgs) { - int clsResult = _detParams->cls->Evaluate(clsImg); - if (clsResult == 1) { - clsIsNg = true; - huaShangNg = true; - } - data->clsOriginImgs.push_back({ "CLS",clsImg }); - } - if (clsIsNg == true) { - cv::Scalar color = cv::Scalar(0, 0, 255); - isOK = false; - cv::drawContours(Paint, contours, i, color, 2); - textPainter.putText(Paint, "NG", cv::Point(rect.x + 10, rect.y - 20), color); - } - } - if (huaShangNg == true) - defects.push_back("划伤"); - return defects; -} -static bool BaoMoHou_ShangDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams, yh_581_address address) -{ - try { - //data->oriImgs[0] = cv::imread("D://testImage//Camera1.bmp", -1); - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - /*if (data->oriImgs[0].rows == 150) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return false; - }*/ - - cv::Mat Paint; - //QMutex paintMutex; - clock_t start, finish; - start = clock(); - - cv::Mat src1 = data->oriImgs[0]; - cv::Mat srcHalf; - cv::resize(src1, srcHalf, cv::Size(0, 0), 0.5, 0.5); - if (srcHalf.channels() != 3) - cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR); - else - srcHalf.copyTo(Paint); - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - //std::future > handleAiFuture = std::async(std::launch::async, BaoMoHou_DaMianAi, data, srcHalf, Paint, _detParams); - HalconCpp::HObject in_Image = MatToHObject(src1); - HDevEngineCpp::HDevProcedure proc("_4_Cal_Long_Coatingcover_Dist"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_xResolution", HTuple(0.0308812)); - procedureCall.SetInputCtrlParamTuple("in_yResolution", HTuple(0.029527)); - procedureCall.Execute(); - HTuple out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance"); - HTuple out_Line = procedureCall.GetOutputCtrlParamTuple("out_Line"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - int outFlag = out_Flag.D(); - double batteryWidth = -99, batteryHeight = -99, moDaoDingGai = -99; - // handleAiFuture.wait(); - //auto defects = handleAiFuture.get(); - if (outFlag == 1) { - //out_Distance[0]: 电芯宽度 < / c> - // * out_Distance[1] : 电芯高度< / c> - // * out_Distance[2] : 上端盖到膜的距离< / c> - // * out_Distance[3] : 中端盖到膜的距离< / c> - // * out_Distance[4] : 下端盖到膜的距离 < / c> - textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[0].D()) + "mm", cv::Point(50, 150), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[1].D()) + "mm", cv::Point(50, 350), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "上端盖到膜的距离:" + std::to_string(out_Distance[2].D()) + "mm", cv::Point(50, 550), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[3].D()) + "mm", cv::Point(50, 750), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[4].D()) + "mm", cv::Point(50, 950), cv::Scalar(0, 255, 0)); - for (int i = 0; i < out_Line.Length() / 4 - 1; i++) { - cv::line(Paint, cv::Point(out_Line[i * 4 + 1].D(), out_Line[i * 4].D()), - cv::Point(out_Line[i * 4 + 3].D(), out_Line[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 5); - } - } - else { - data->halconOK = false; - textPainter.putText(Paint, "OK", cv::Point(50, 300), cv::Scalar(0, 255, 0)); - } - - data->resultImgs.push_back(Paint); - //data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) - + "_" + QByteArray::number(batteryWidth) - + "_" + QByteArray::number(batteryHeight) - + "_" + QByteArray::number(moDaoDingGai)); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - return true; - } - CATCH_EXCEPTIONS - generalExceptionResume(data, address, "NG"); -} - -static bool BaoMoHou_XiaDaMianSiJiao(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams, yh_581_address address) -{ - try { - //data->oriImgs[0] = cv::imread("D://testImage//Camera2.bmp", -1); - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - cv::Mat Paint; - //QMutex paintMutex; - clock_t start, finish; - start = clock(); - - cv::Mat src = data->oriImgs[0]; - if (src.channels() != 3) - cv::cvtColor(src, Paint, cv::COLOR_GRAY2BGR); - else - src.copyTo(Paint); - //定位高>800 宽>6000的 - std::vector dingWeiImgs; - std::vector rects; - { - cv::Mat forDingWei; - cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1); - cv::Mat dingweiSegResult = ~_detParams->dingwei_seg->Evaluate(forDingWei); - std::vector> contours; - cv::findContours(dingweiSegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - rect.width = rect.width * 10 + 10; - rect.height = rect.height * 10 + 10; - rect.x = rect.x * 10 - 10; - rect.y = rect.y * 10 - 10; - - if (rect.width > 5500, rect.height > 700) { - dingWeiImgs.push_back(src(rect).clone()); - cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3); - rects.push_back(rect); - } - } - - } - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - if (dingWeiImgs.size() != 2)qDebug() << "图片不满足2" ; - for (int imgIndex = 0; imgIndex < dingWeiImgs.size(); imgIndex++) { - cv::Mat forSeg; - cv::resize(dingWeiImgs[imgIndex], forSeg, cv::Size(), 0.5, 0.5); - - auto SegResult = ~_detParams->seg->Evaluate(forSeg); - std::vector> contours; - cv::findContours(SegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width > 50 || rect.height > 50) { - auto clsImgs = cutImg2ClsVec(rect, forSeg); - bool clsIsNg = false; - for (auto& clsImg : clsImgs) { - int clsResult = _detParams->cls->Evaluate(clsImg); - if (clsResult == 2) - clsIsNg = true; - } - if (clsIsNg == true) - cv::drawContours(Paint, contours, i, cv::Scalar(0, 0, 255), 3); - - for (auto& clsImg : clsImgs) - data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",clsImg }); - - cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); - } - } - } - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, "OK", cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123"); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123"); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - return true; - } - CATCH_EXCEPTIONS - generalExceptionResume(data, address, "OK"); -} - -#pragma endregion - -class _581_BaoMo : public mission { -public: - using baoMoHouShangDaMianTrigger = _581_Single_triggerTemplate; - baoMoHouShangDaMianTrigger _station_1;//shangdamian - baoMoHouShangDaMianTrigger _station_3;//shangdamian - - using baoMoHouXiaDaMianTrigger = _581_Single_triggerTemplate; - baoMoHouXiaDaMianTrigger _station_2;//xiadamian - baoMoHouXiaDaMianTrigger _station_4;//xiadamian - - std::vector _baoMoHouDaMianDetParams = std::vector< baoMoHouDaMianDetParams>(4); - detParams _detParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - } - bool initCustom() { - -#pragma region 注册触发器回调 - - _station_1.init("Camera1", "包膜后大面外观检测-左上-相机5(上大面1)",18800,1,1, &_baoMoHouDaMianDetParams[0], _serviceManager, bridge, BaoMoHou_ShangDaMian); - _station_3.init("Camera3", "包膜后大面外观检测-右上-相机7(上大面2)", 19200, 1, 1, &_baoMoHouDaMianDetParams[1], _serviceManager, bridge, BaoMoHou_ShangDaMian); - - _station_2.init("Camera2", "包膜后大面外观检测-左下-相机6(下大面四角1)", 19000, 1, 1, &_baoMoHouDaMianDetParams[2], _serviceManager, bridge, BaoMoHou_XiaDaMianSiJiao); - _station_4.init("Camera4", "包膜后大面外观检测-右下-相机8(下大面四角2)",19400, 1,1, &_baoMoHouDaMianDetParams[3], _serviceManager, bridge, BaoMoHou_XiaDaMianSiJiao); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam5678/CMakeLists.txt b/src/mission/BaoMo/581-BaoMo-Cam5678/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam5678/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.cpp b/src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.cpp deleted file mode 100644 index 2977872..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include <581-BaoMo-Cam91011.h> - -mission* createMission() { - return new _581_BaoMo(); -} -void destroyMission(mission* _mission) { - delete _mission; -} - -std::vector < std::string> _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, - baoMoHouDaMianDetParams* _detParams) { - std::vector < std::string> aireuslt; - TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - bool huaShangNg = false; - cv::Mat segImg = ~_detParams->seg->Evaluate(src); - std::vector> contours; - cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); - bool isOK = true; - for (int i = 0; i < contours.size(); i++) { - cv::Rect rect = cv::boundingRect(contours[i]); - if (rect.width < 100 && rect.height < 100) continue; // 过滤掉小轮廓 - auto clsImgs = cutImg2ClsVec(rect, src, cv::Size(256, 256)); - bool clsIsNg = false; - for (auto& clsImg : clsImgs) { - if (_detParams->cls->Evaluate(clsImg) == 1) { // 假设1表示NG - int clsResult = _detParams->cls2->Evaluate(clsImg); - if (clsResult == 1) { - clsIsNg = true; - huaShangNg = true; - //data->clsOriginImgs.push_back({ std::to_string(i),clsImg }); - } - } - } - cv::Scalar color = cv::Scalar(0, 255, 0); - if (clsIsNg == true) { - color = cv::Scalar(0, 0, 255); - isOK = false; - cv::drawContours(Paint, contours, i, color, 2); - textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), cv::Scalar(0, 255, 0)); - } - //else { - // cv::Mat imgTmp; - // QMutexLocker locker(paintMutex); - // imgTmp.copyTo(Paint(rect)); - // cv::rectangle(Paint, rect, color, 3); - //} - - //putTextZH(Paint, "NG", cv::Point(rect.x + 10, rect.y - 20), 25, color); - } - if (huaShangNg == true) - aireuslt.push_back("划伤"); - return aireuslt; -} -void exceptionResume(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -bool halconAlgo1_BaoMoHouCeMian_HouDu(std::shared_ptr data, yh_581_address address, cv::Mat& src, cv::Mat& Paint, QMutex* mutex, std::vector < std::string> defects) { - bool isOK = false; - double Width = -1; - HalconCpp::HObject in_Image = MatToHObject(src); - HDevEngineCpp::HDevProcedure proc("_4_Cal_Short_Coatingcover_Dist"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_xResolution", HTuple(0.0308812)); - procedureCall.SetInputCtrlParamTuple("in_yResolution", HTuple(0.029527)); - procedureCall.Execute(); - HTuple out_Width = procedureCall.GetOutputCtrlParamTuple("out_Width"); - HTuple out_Line = procedureCall.GetOutputCtrlParamTuple("out_Line"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - int outFlag = out_Flag.D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - - double limitHigh = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "最大宽度阈值(MAX)", 200).toFloat(); - double limitLow = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "最小宽度阈值(MIN)", 0).toFloat(); - - if (outFlag == 1) { - QMutexLocker locker(mutex); - for (int i = 0; i < out_Line.Length() / 4; i++) { - cv::line(Paint, cv::Point(out_Line[i * 4 + 1].D(), out_Line[i * 4].D()) / 2, - cv::Point(out_Line[i * 4 + 3].D(), out_Line[i * 4 + 2].D()) / 2, - cv::Scalar(0, 255, 0), 5); - } - Width = out_Width.D(); - - if (limitHigh > Width && limitLow < Width) { - textPainter.putText(Paint, "电芯厚度:" + std::to_string(Width) + "mm", cv::Point(50, 450), cv::Scalar(0, 255, 0)); - isOK = true; - } - else { - textPainter.putText(Paint, "电芯厚度:" + std::to_string(Width) + "mm", cv::Point(50, 450), cv::Scalar(0, 0, 255)); - textPainter.putText(Paint, "厚度判定不良", cv::Point(50, 350), cv::Scalar(0, 0, 255)); - defects.push_back("厚度判定不良"); - } - } - else { - QMutexLocker locker(mutex); - textPainter.putText(Paint, "电芯厚度检测异常", cv::Point(50, 250), cv::Scalar(0, 0, 255)); - data->halconOK = false; - } - - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(Width)); - return isOK; -} -bool halconAlgo1_BaoMoHouCeMian_PoSun(std::shared_ptr data, yh_581_address address, cv::Mat& src, cv::Mat& Paint, QMutex* mutex, std::vector < std::string> defects) { - QMutexLocker locker(mutex); - bool isOK = false; - try { - HalconCpp::HObject in_Image = MatToHObject(src); - HalconCpp::HObject test; - cv::Mat img = HObject2Mat(test); - cv::resize(img, img, cv::Size(), 0.5, 0.5); - HTuple in_Parameters; - in_Parameters[0] = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "灰度管控阈值", 230).toInt(); - in_Parameters[1] = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "缺陷像素数量管控阈值(pix)", 300000).toInt(); - in_Parameters[2] = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "缺陷的宽度管控阈值(pix)", 600).toInt(); - in_Parameters[3] = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "缺陷的高度管控阈值(pix)", 60).toInt(); - - HDevEngineCpp::HDevProcedure proc("_4_TR_TL_BlueCover_Inspection"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Parameters", in_Parameters); - procedureCall.Execute(); - HObject out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails"); - - int outFlag = out_Flag.D(); - Paint = HObject2Mat(out_DisplayImage); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - - if (outFlag == 1) { - textPainter.putText(Paint, "破损检测OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - isOK = true; - } - else { - textPainter.putText(Paint, "破损检测NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - std::string ngDetailStr = gbkToUtf8(out_NgDetails.ToString().Text()); - textPainter.putText(Paint, ngDetailStr.substr(1, ngDetailStr.length() - 2), cv::Point(50, 150), cv::Scalar(0, 0, 255)); - data->halconOK = false; - } - return isOK; - } - CATCH_EXCEPTIONS - cv::resize(src, Paint, cv::Size(), 0.5, 0.5); - if (src.channels() == 1) - cv::cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - else - src.copyTo(Paint); - return isOK; -} -bool ALGO_BaoMoHouCeMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams,yh_581_address address){ - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - std::vector < std::string> defects; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - cv::Mat Paint; - clock_t start, finish; - start = clock(); - - //data->oriImgs[0] = cv::imread("D:/04QCB82602000JFB5000019N_Camera2_0.bmp", -1); - // - - cv::Mat src = data->oriImgs[0]; - QMutex mutex; - - std::future handleAiFuture1 = std::async(std::launch::async, halconAlgo1_BaoMoHouCeMian_PoSun, data, address, std::ref(src), std::ref(Paint), &mutex, std::ref(defects)); - std::future handleAiFuture2 = std::async(std::launch::async, halconAlgo1_BaoMoHouCeMian_HouDu, data, address, std::ref(src), std::ref(Paint), &mutex, std::ref(defects)); - - handleAiFuture1.wait(); - bool res1 = handleAiFuture1.get(); - - handleAiFuture2.wait(); - bool res2 = handleAiFuture2.get(); - //if (res1 == false || res2 == false) { - - //} - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "检测异常"); - return true; -} \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.h b/src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.h deleted file mode 100644 index d5b8006..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam91011/581-BaoMo-Cam91011.h +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -class baoMoHouDaMianDetParams { -public: - handdleAI::pSegmentation* seg; - handdleAI::pClassification* cls; - handdleAI::pClassification* cls2; -}; -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; - - -static bool ALGO_BaoMoHouCeMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams,yh_581_address address); -#pragma endregion - -class _581_BaoMo : public mission { -public: - _581_Union_triggerTemplate _station_1; - _581_Union_triggerTemplate _station_2; - - _581_Union_triggerTemplate _station_3; - - std::vector < baoMoHouDaMianDetParams> _baoMoHouDaMianDetParams = std::vector < baoMoHouDaMianDetParams>(2); - detParams _detParams; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - if (initOnce == false) { - //for (auto& param : _baoMoHouDaMianDetParams) { - // param.seg = handdleAI::CreateSegObjS("./handleaiModels/yiCiZhuYe/pSeg_DingWei.BHD", 16, 0); - // param.cls = handdleAI::CreateClsObjV3("./handleaiModels/yiCiZhuYe/pSeg_CanYe.BHD", 16, 0); - // param.cls2 = handdleAI::CreateClsObjV3("./handleaiModels/yiCiZhuYe/pCls_CanYe.BHD", 0, 1); - //} - initOnce = true; - } - } - bool initCustom() { - -#pragma region 注册触发器回调 - - _station_1.init("Camera1","包膜后侧面贴胶错位检测-外-相机9",19600,2,1,&_baoMoHouDaMianDetParams[0], _serviceManager, bridge, ALGO_BaoMoHouCeMian); - _station_2.init("Camera2", "包膜后侧面贴胶错位检测-内-相机10",19800,2,1, &_baoMoHouDaMianDetParams[1], _serviceManager, bridge, ALGO_BaoMoHouCeMian); - - _station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)",20000,2,1, &_detParams, _serviceManager, bridge, generalAlgoTest); -#pragma endregion - return true; - } - void reloadAlgo(QByteArray& byteArray) { - - } - - //9600 - -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/BaoMo/581-BaoMo-Cam91011/CMakeLists.txt b/src/mission/BaoMo/581-BaoMo-Cam91011/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/BaoMo/581-BaoMo-Cam91011/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/BaoMo/CMakeLists.txt b/src/mission/BaoMo/CMakeLists.txt deleted file mode 100644 index f9a95fd..0000000 --- a/src/mission/BaoMo/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# 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/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp b/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp deleted file mode 100644 index 13e314c..0000000 --- a/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Dgh-CB-1.h> - -mission* createMission() { - return new _581_Dgh(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h b/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h deleted file mode 100644 index 0ed8884..0000000 --- a/src/mission/DGH/581-Dgh-CB-1/581-Dgh-CB-1.h +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include -#include -#include -#include - -#pragma region 算法 - -using namespace HDevEngineCpp; - -#pragma endregion -void exceptionResume(std::shared_ptr data, detParams* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1,1,1,1,1,1,1,1,1,1,1,1,1,1"); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -static bool yuHanQian3D(std::shared_ptr data, detParams* _detParams, yh_581_address address) { - try { - double heightThreshold = data->service->_paramSyncManager->get("预焊前", "高度/台阶差最大阈值",0.3).toDouble(); - double widthThreshold = data->service->_paramSyncManager->get("预焊前", "缝隙值最大阈值", 0.1).toDouble(); - //data->oriImgs.clear(); - //data->oriImgs.push_back(cv::imread("D://readSnEmpty16-02-21-96_Camera4_0.tiff", -1)); - //data->oriImgs.push_back(cv::imread("D://readSnEmpty16-02-21-96_Camera4_1.tiff", -1)); - if (data->oriImgs.size() < 2) { - exceptionResume(data, _detParams, address, "NG"); - return true; - } - cv::Mat heightImg = data->oriImgs[1]; - cv::Mat lumImg = data->oriImgs[0]; - cv::Mat Paint; - - HalconCpp::HObject in_imageH = MatToHObject(heightImg); - HalconCpp::HObject in_imageLum = MatToHObject(lumImg); - HDevEngineCpp::HDevProcedure proc("_6_detect_gap_width_height"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_imageH", in_imageH); - procedureCall.SetInputIconicParamObject("in_imageLum", in_imageLum); - - procedureCall.SetInputCtrlParamTuple("in_xResolution", 0.005); - procedureCall.SetInputCtrlParamTuple("in_yResolution", data->service->_paramSyncManager->get("3D设置", "3D相机Y方向精度",0.177).toFloat()); - procedureCall.SetInputCtrlParamTuple("in_zResolution", 0.0008); - if(address.triggerAddr == 18000 || address.triggerAddr == 18002 || address.triggerAddr == 18400 || address.triggerAddr == 18402) - procedureCall.SetInputCtrlParamTuple("in_Location", "Right"); - else - procedureCall.SetInputCtrlParamTuple("in_Location", "Left"); - procedureCall.Execute(); - HObject out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage"); - - HTuple out_MaxHeight = procedureCall.GetOutputCtrlParamTuple("out_MaxHeight"); - HTuple out_MaxWidth = procedureCall.GetOutputCtrlParamTuple("out_MaxWidth"); - HTuple out_ResultRow = procedureCall.GetOutputCtrlParamTuple("out_ResultRow"); - HTuple out_ResultColumn = procedureCall.GetOutputCtrlParamTuple("out_ResultColumn"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - HTuple out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails"); - HTuple out_DisplayRows = procedureCall.GetOutputCtrlParamTuple("out_DisplayRows"); - HTuple out_DisplayCols = procedureCall.GetOutputCtrlParamTuple("out_DisplayCols"); - int flag = out_Flag.D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 75); - Paint = HObject2Mat(out_DisplayImage); - textPainter.putText(Paint, data->SNcode, cv::Point(1600,50), cv::Scalar(0, 255, 0)); - bool isOK = true; - QByteArray gaoDuChaSendText, fengXiSendText; - if (flag == 1) { - int yStart = -25; - for (int i = 0; i < 4 && i < out_DisplayRows.Length(); i++) { - double MaxHeight = std::abs(out_MaxHeight[i].D()); - double MaxWidth = std::abs(out_MaxWidth[i].D()); - - cv::Point displayPos( 1000, out_DisplayRows[i].D() - 50); - textPainter.putText(Paint, "检测区域" + std::to_string(i + 1) + ":", displayPos, cv::Scalar(0, 255, 0)); - - displayPos.x += 280; - if (std::abs(MaxHeight) > std::abs(heightThreshold)) { - textPainter.putText(Paint, "高度/台阶差" + QString::number(MaxHeight, 'f', 3).toStdString() +"mm", displayPos, cv::Scalar(0, 0, 255)); - isOK = false; - } - else - textPainter.putText(Paint, "高度/台阶差" + QString::number(MaxHeight, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 255, 0)); - - displayPos.x += 600; - if (std::abs(MaxWidth) > std::abs(widthThreshold)) { - textPainter.putText(Paint, "缝隙值" + QString::number(MaxWidth, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 0, 255)); - isOK = false; - } - else - textPainter.putText(Paint, "缝隙值" + QString::number(MaxWidth, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 255, 0)); - if (i != 2) { - gaoDuChaSendText += QByteArray::number(MaxHeight) + ","; - fengXiSendText += QByteArray::number(MaxWidth) + ","; - } - } - } - else { - gaoDuChaSendText = "-1,-1,-1,"; - fengXiSendText = "-1,-1,-1,"; - std::string ngDetailStr = gbkToUtf8(out_NgTails.ToString().Text()); - textPainter.putText(Paint, ngDetailStr.substr(1, ngDetailStr.length() - 2), cv::Point(50, 450), cv::Scalar(0, 0, 255)); - for (int i = 0; i < out_ResultRow.Length(); i++) { - cv::circle(Paint, cv::Point(out_ResultRow[i].D(), out_ResultColumn[i].D()),1, cv::Scalar(0, 0, 255), 1); - } - data->halconOK = false; - isOK = false; - } - QByteArray plcResult = "1"; - if (isOK == false) { - textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->halconOK = false; - } - else - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) - plcResult = "1"; - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeFloat("D" - + QByteArray::number(address.valueOffsetAddr) + "_" - + fengXiSendText + "1,1," - + gaoDuChaSendText + plcResult + "," + plcResult + "," + plcResult + "," + plcResult +"," + plcResult + "," + plcResult);//数值1 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "NG"); - return true; -} -class _581_Dgh : public mission { -public: - using generalTrigger = _581_Union_triggerTemplate; - generalTrigger dgh_cb_yh_3d_1; - generalTrigger dgh_cb_yh_3d_2; - generalTrigger dgh_cb_yh_3d_3; - generalTrigger dgh_cb_yh_3d_4; - - generalTrigger dgh_cb_mh_3d_1; - generalTrigger dgh_cb_mh_3d_2; - generalTrigger dgh_cb_mh_3d_3; - generalTrigger dgh_cb_mh_3d_4; - detParams _params; - - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - dgh_cb_yh_3d_1.init("Camera1", "长边预焊前3D-1", 18000,2,1, &_params, _serviceManager, bridge, yuHanQian3D); - dgh_cb_yh_3d_1.address[1].valueOffsetAddr += 20; - dgh_cb_yh_3d_2.init("Camera2", "长边预焊前3D-2", 18200,2,1, &_params, _serviceManager, bridge, yuHanQian3D); - dgh_cb_yh_3d_2.address[1].valueOffsetAddr += 20; - dgh_cb_yh_3d_3.init("Camera3", "长边预焊前3D-3", 18400,2,1, &_params, _serviceManager, bridge, yuHanQian3D); - dgh_cb_yh_3d_3.address[1].valueOffsetAddr += 20; - dgh_cb_yh_3d_4.init("Camera4", "长边预焊前3D-4", 18600,2,1, &_params, _serviceManager, bridge, yuHanQian3D); - dgh_cb_yh_3d_4.address[1].valueOffsetAddr += 20; - - dgh_cb_mh_3d_1.init("Camera5", "长边满焊前3D-1", 19600,2,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_cb_mh_3d_1.address[1].valueOffsetAddr += 20; - dgh_cb_mh_3d_2.init("Camera6", "长边满焊前3D-2", 19800,2,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_cb_mh_3d_2.address[1].valueOffsetAddr += 20; - dgh_cb_mh_3d_3.init("Camera7", "长边满焊前3D-3", 20000,2,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_cb_mh_3d_3.address[1].valueOffsetAddr += 20; - dgh_cb_mh_3d_4.init("Camera8", "长边满焊前3D-4", 20200,2,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_cb_mh_3d_4.address[1].valueOffsetAddr += 20; -#pragma endregion - return true; - } - -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt b/src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/DGH/581-Dgh-CB-1/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp b/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp deleted file mode 100644 index c13de36..0000000 --- a/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Dgh-CB-2.h> - -mission* createMission() { - return new _581_Dgh(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h b/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h deleted file mode 100644 index ede2e4f..0000000 --- a/src/mission/DGH/581-Dgh-CB-2/581-Dgh-CB-2.h +++ /dev/null @@ -1,451 +0,0 @@ -#include -#include -#include -#include -#include -using namespace HDevEngineCpp; -#pragma region 辊压后2D算法 - -class GunYaHou2DParam { -public: - handdleAI::pSegmentation* seg = nullptr; - handdleAI::pClassification* cls = nullptr; - handdleAI::pDetection* det = nullptr; -}; -void exceptionResume(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//数值1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//数值2 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//数值3 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//数值4 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_1");//数值5 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_1");//数值6 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_1");//数值7 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 14) + "_1");//数值8 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 16) + "_1");//数值9 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -cv::Mat LocalCutImg_DET(handdleAI::pDetection* pDet, cv::Mat src, float zoom, int checkNameId, cv::Rect& cutRoi) -{ - cv::Mat dst; - cv::resize(src, dst, cv::Size(src.cols / zoom, src.rows / zoom)); - std::vector resultBox = pDet->Evaluate(dst); //结果为中心点+宽高 - - cv::Mat contourImg; - std::vector> contours; - //cv::threshold(dstImg, contourImg, pSeg->m_classes, 255, cv::THRESH_BINARY_INV); - //cv::findContours(contourImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - - cv::Mat roiImg; - - if (resultBox.size() <= 0) - { - cv::Mat rstMat = cv::Mat(100, 100, CV_8UC1, cv::Scalar(0, 0, 0)); - cutRoi = cv::Rect(0, 0, 100, 100); - return rstMat; - } - - double maxArea = 0; - int index = -1; - for (int j = 0; j < resultBox.size(); j++) - { - double area = resultBox[j].w * resultBox[j].h; - if (area >= maxArea) - { - maxArea = area; - index = j; - } - } - - /*cv::Rect rect = cv::boundingRect(contours[index]); - cv::rectangle(roiImg, cv::Rect(resultBox[j].x - resultBox[j].w / 2, resultBox[j].y - resultBox[j].h / 2, resultBox[j].w, resultBox[j].h), cv::Scalar(0, 0, 255), 5);*/ - int addpixel = 15; - - cutRoi.x = ((resultBox[index].x - resultBox[index].w / 2) * zoom); - cutRoi.y = ((resultBox[index].y - resultBox[index].h / 2) * zoom); - cutRoi.width = (resultBox[index].w * zoom); - cutRoi.height = (resultBox[index].h * zoom); - //cv::rectangle(src, cutRoi, cv::Scalar(0, 0, 255), 2, 8); - /* cutRoi.x = rect.x * zoom; - cutRoi.y = rect.y * zoom; - cutRoi.width = rect.width * zoom; - cutRoi.height = rect.height * zoom;*/ - - src(cutRoi).copyTo(roiImg); - return roiImg; -} -static std::vectordingGaiHanClsCut(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) -{ - std::vector result; - int splitCount = std::max(boundingBox.width, boundingBox.height) / std::max(boundingBox.width, boundingBox.height); - //std::cout << "splitCount" << splitCount; - if (splitCount > 2) {//大于2分段裁 - if (boundingBox.width > boundingBox.height) {//宽大于高,横着裁 - for (int i = 0; i < splitCount; i++) { - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.height * i, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); - } - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.width - boundingBox.height, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); - } - else { - for (int i = 0; i < splitCount; i++) { - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.width * i, boundingBox.width, boundingBox.width), imgInput)); - } - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.height - boundingBox.width, boundingBox.width, boundingBox.width), imgInput)); - } - return result; - } - else - return std::vector(1, cutImg2Cls(boundingBox, imgInput, targetSize)); -} -bool handleAiEvaluate(std::shared_ptr data, GunYaHou2DParam* _detParams, cv::Mat& srcImg, cv::Mat& showImg) { - bool handleAiResultIsOK = true; - clock_t start = clock(); - - - //DET方案 - // cv::Mat imgForDet; - //srcImg.copyTo(imgForDet); - //cv::Rect detRect; - //cv::Mat det_Image = LocalCutImg_DET(_detParams->det, imgForDet, 1, 0, detRect); - - //固定坐标方案 - //cv::Rect detRect(150, 1400, 3800, 300); - //cv::Mat det_Image; - //srcImg(detRect).copyTo(det_Image); - - //cv::rectangle(showImg, detRect, cv::Scalar(0, 255, 255), 2); - //cv::Mat segImg = ~_detParams->seg->Evaluate(det_Image);//一定要取反,因为seg默认抓到的区域为黑色 - //data->segOriginImgs.push_back(det_Image); - cv::Mat det_Image = srcImg; - cv::Mat segImg = ~_detParams->seg->Evaluate(det_Image);//一定要取反,因为seg默认抓到的区域为黑色 - clock_t stop = clock(); - std::vector>contours;//点集 - stop = clock(); - cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); // 寻找白色区域并储存为点集 - //QMutexLocker lock(showImgLocker);//加锁防止和halcon线程冲突 - int clsResult = 0; - for (int i = 0; i < contours.size(); i++)//遍历点集 - { - cv::Rect rect = cv::boundingRect(contours[i]);//最小外接矩形 - //if( (rect.height > 25 || rect.width > 50) && (rect.height > 10 && rect.width > 10))// 过滤 - if ((rect.height > 40 || rect.width > 100) && (rect.height > 30 && rect.width > 10)) - { - auto clsimgs = dingGaiHanClsCut(rect, det_Image); - bool isNg = false; - int cnt = 0; - for (auto& clsImg : clsimgs) - { - clsResult = _detParams->cls->Evaluate(clsImg);//cls检测 得出的是int型 从0开始 - if (clsResult == 1 || clsResult == 3) { - isNg = true; - } - //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/" + SN + "_cls" + QString::number(clsResult) + "_" + sdataTime_name + ".bmp"); - data->clsOriginImgs.push_back({ std::to_string(clsResult),clsImg }); - cnt++; - drawContours(showImg, contours, i, cv::Scalar(0, 255, 0), 1); - } - if (isNg == true) - { - rectangle(showImg, cv::Rect{ rect.x,rect.y,rect.width ,rect.height }, cv::Scalar(0, 0, 255), 2, 8, 0); - //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - handleAiResultIsOK = false; - } - else - { - if (clsResult == 2) - { - rectangle(showImg, cv::Rect{ rect.x,rect.y,rect.width ,rect.height }, cv::Scalar(0, 255, 255), 2, 8, 0); - //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - } - } - } - else - { - auto clsimgs = dingGaiHanClsCut(rect, det_Image); - int cnt = 0; - for (auto& clsImg : clsimgs) - { - data->clsOriginImgs.push_back({ std::to_string(clsResult),clsImg }); - //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/CSSMALL_" + SN + "_" + sdataTime_name + ".bmp"); - cnt++; - drawContours(showImg, contours, i, cv::Scalar(0, 255, 0), 1); - } - } - } - return handleAiResultIsOK; -} - -static bool GunYaHou2D(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address) { - try { - //data->oriImgs.clear(); - //data->oriImgs.push_back(cv::imread("D://04QCB82601000JFB50000011_Camera7_0.bmp", -1)); - //data->oriImgs.push_back(cv::imread("D://04QCB82601000JFB50000011_Camera8_0.bmp", -1)); - cv::Mat sourceImg1 = data->oriImgs[0], sourceImg2 = data->oriImgs[1]; - cv::Mat Paint1,Paint2; - sourceImg1.copyTo(Paint1); - sourceImg2.copyTo(Paint2); - if (Paint1.channels() == 1) - cvtColor(Paint1, Paint1, cv::COLOR_GRAY2BGR); - if (Paint2.channels() == 1) - cvtColor(Paint2, Paint2, cv::COLOR_GRAY2BGR); - bool isOK = handleAiEvaluate(data, _detParams, sourceImg1, Paint1); - isOK = handleAiEvaluate(data, _detParams, sourceImg2, Paint2); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//数值1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//数值2 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//数值3 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//数值4 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_1");//数值5 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_1");//数值6 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_1");//数值7 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 14) + "_1");//数值8 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 16) + "_1");//数值9 - if (isOK == true) - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - - { - TextRendererZH textPainter(Paint1.cols, Paint1.rows, 300); - if (isOK == true) { - textPainter.putText(Paint1, "OK", cv::Point(0, 200), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint1, "NG", cv::Point(0, 200), cv::Scalar(0, 0, 255)); - data->aiDetOK = false; - data->service->_missionResultHandle->toBarChart(data->SNcode, true, { "焊后NG" }); - qDebug() << QString::fromStdString(data->SNcode) << "is NG"; - } - - cv::resize(Paint1, Paint1, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint1); - } - { - TextRendererZH textPainter(Paint2.cols, Paint2.rows, 300); - if (isOK == true) { - textPainter.putText(Paint2, "OK", cv::Point(0, 200), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint2, "NG", cv::Point(0, 200), cv::Scalar(0, 0, 255)); - data->aiDetOK = false; - data->service->_missionResultHandle->toBarChart(data->SNcode, true, { "焊后NG" }); - qDebug() << QString::fromStdString(data->SNcode) << "is NG"; - } - - cv::resize(Paint2, Paint2, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint2); - } - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "算法异常"); - return true; -} - -#pragma endregion -#pragma region 辊压后3D算法 -static bool gunYaHou3D(std::shared_ptr data, detParams* _detParams, yh_581_address address) { - try { - /* double heightThreshold = data->service->_paramSyncManager->get("预焊前", "高度/台阶差最大阈值", 0.3).toDouble(); - double widthThreshold = data->service->_paramSyncManager->get("预焊前", "缝隙值最大阈值", 0.1).toDouble();*/ - //data->oriImgs.clear(); - //data->oriImgs.push_back(cv::imread("D://readSnEmpty16-02-21-96_Camera4_0.tiff", -1)); - //data->oriImgs.push_back(cv::imread("D://readSnEmpty16-02-21-96_Camera4_1.tiff", -1)); - if (data->oriImgs.size() < 2) { - generalExceptionResume(data, address, "NG"); - return true; - } - cv::Mat heightImg = data->oriImgs[1]; - cv::Mat lumImg = data->oriImgs[0]; - cv::Mat Paint; - - HalconCpp::HObject in_imageH = MatToHObject(heightImg); - HalconCpp::HObject in_imageLum = MatToHObject(lumImg); - HDevEngineCpp::HDevProcedure proc("_6_Inspection_Defect_3D"); - HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_imageH", in_imageH); - - procedureCall.SetInputCtrlParamTuple("in_xResolution", 0.005); - procedureCall.SetInputCtrlParamTuple("in_yResolution", data->service->_paramSyncManager->get("3D设置", "3D相机Y方向精度", 0.177).toFloat()); - procedureCall.SetInputCtrlParamTuple("in_zResolution", 0.0008); - procedureCall.Execute(); - - HTuple out_DefectHeight = procedureCall.GetOutputCtrlParamTuple("out_DefectHeight"); - HTuple out_DefectRec = procedureCall.GetOutputCtrlParamTuple("out_DefectRec"); - HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - - int flag = out_Flag.D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 75); - textPainter.putText(Paint, data->SNcode, cv::Point(1600, 50), cv::Scalar(0, 255, 0)); - bool isOK = true; - QByteArray textSend; - if (flag == 1) { - int yStart = -25; - for (int i = 0; i < out_DefectHeight .Length(); i++) { - double value = out_DefectHeight[i].D(); - cv::Rect rect(out_DefectRec[i * 4], out_DefectRec[i * 4] + 1, out_DefectRec[i * 4 + 2], out_DefectRec[i * 4 + 3]); - textSend += QByteArray::number(value) + ","; - data->halconOK = false; - isOK = false; - } - } - - QByteArray plcResult = "1"; - if (isOK == false) { - textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->halconOK = false; - } - else - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeFloat("D" - + QByteArray::number(address.valueOffsetAddr) + "_" - + textSend + "1");//数值1 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - generalExceptionResume(data, address, "NG"); - return true; -} -#pragma endregion - -static bool generalAlgoTestDuanBian(std::shared_ptr data, detParams* _detParams, yh_581_address address) { - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - data->customPath = "{imgSaveRootDir}/{yyyy-MM-dd}/{saveObjectName}{imageType}/{HH}H/{processResult}/"; - std::vector < std::string> defects = { "测试" }; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return false; - } - - cv::Mat Paint; - QMutex paintMutex; - clock_t start, finish; - start = clock(); - cv::Mat src1 = data->oriImgs[0]; - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "划伤", cv::Point(10, 10), cv::Scalar(0, 255, 0)); - cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//数值1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//数值2 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//数值3 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//数值4 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_1");//数值5 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_1");//数值6 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_1");//数值7 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 14) + "_1");//数值8 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 16) + "_1");//数值9 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//数值1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//数值2 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//数值3 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//数值4 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_1");//数值5 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_1");//数值6 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_1");//数值7 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 14) + "_1");//数值8 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 16) + "_1");//数值9 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果 - return false; -} -class _581_Dgh : public mission { -public: - using generalTrigger = _581_Union_triggerTemplate; - generalTrigger dgh_cb_mh_2d_1; - generalTrigger dgh_cb_mh_2d_2; - generalTrigger dgh_cb_mh_2d_3; - generalTrigger dgh_cb_mh_2d_4; - - _581_Union_triggerTemplate dgh_cb_gy_2d_1; - _581_Union_triggerTemplate dgh_cb_gy_2d_2; - _581_Union_triggerTemplate dgh_cb_gy_2d_3; - _581_Union_triggerTemplate dgh_cb_gy_2d_4; - std::vector _GunYaHou2DParam = std::vector(4); - - generalTrigger dgh_cb_gy_3d_1; - generalTrigger dgh_cb_gy_3d_2; - generalTrigger dgh_cb_gy_3d_3; - generalTrigger dgh_cb_gy_3d_4; - detParams _params; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - if (initOnce == false) { - for (auto& param : _GunYaHou2DParam) { - param.seg = handdleAI::CreateSegObjS("./handleaiModels/seg_hanhou.BHD", 1, 0); - param.cls = handdleAI::CreateClsObjV3("./handleaiModels/cls_hanhou.BHD", 0, 1); - //param.det = handdleAI::CreateDetObjS("./handleaiModels/det_hanhou.BHD", 1, 0); - } - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 满焊前2D - dgh_cb_mh_2d_1.init("Camera1", "长边满焊前2D-1",18800, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_cb_mh_2d_1.address[1].valueOffsetAddr += 20;dgh_cb_mh_2d_1.address[1].valueOffsetAddr += 20; - dgh_cb_mh_2d_2.init("Camera2", "长边满焊前2D-2", 19000, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_cb_mh_2d_2.address[1].valueOffsetAddr += 20; - dgh_cb_mh_2d_3.init("Camera3", "长边满焊前2D-3", 19200, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_cb_mh_2d_3.address[1].valueOffsetAddr += 20; - dgh_cb_mh_2d_4.init("Camera4", "长边满焊前2D-4", 19400, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_cb_mh_2d_4.address[1].valueOffsetAddr += 20; - - dgh_cb_gy_2d_1.init("Camera5", "长边辊压后2D-1", 20400, 2,2, &_GunYaHou2DParam[0], _serviceManager, bridge, GunYaHou2D, "辊压后2D"); - dgh_cb_mh_2d_1.address[1].valueOffsetAddr += 20; - dgh_cb_gy_2d_2.init("Camera6", "长边辊压后2D-2", 20600, 2,2, &_GunYaHou2DParam[1], _serviceManager, bridge, GunYaHou2D, "辊压后2D"); - dgh_cb_gy_2d_2.address[1].valueOffsetAddr += 20; - dgh_cb_gy_2d_3.init("Camera7", "长边辊压后2D-3", 20800, 2,2, &_GunYaHou2DParam[2], _serviceManager, bridge, GunYaHou2D, "辊压后2D"); - dgh_cb_gy_2d_3.address[1].valueOffsetAddr += 20; - dgh_cb_gy_2d_4.init("Camera8", "长边辊压后2D-4", 21000, 2,2, &_GunYaHou2DParam[3], _serviceManager, bridge, GunYaHou2D, "辊压后2D"); - dgh_cb_gy_2d_4.address[1].valueOffsetAddr += 20; - - dgh_cb_gy_3d_1.init("Camera9", "长边辊压后3D-1", 21200, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "辊压后3D"); - dgh_cb_gy_3d_1.address[1].valueOffsetAddr += 20; - dgh_cb_gy_3d_2.init("Camera10", "长边辊压后3D-2", 21400, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "辊压后3D"); - dgh_cb_gy_3d_2.address[1].valueOffsetAddr += 20; - dgh_cb_gy_3d_3.init("Camera11", "长边辊压后3D-3", 21600, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "辊压后3D"); - dgh_cb_gy_3d_3.address[1].valueOffsetAddr += 20; - dgh_cb_gy_3d_4.init("Camera12", "长边辊压后3D-4", 21800, 2,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "辊压后3D"); - dgh_cb_gy_3d_4.address[1].valueOffsetAddr += 20; -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt b/src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/DGH/581-Dgh-CB-2/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp b/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp deleted file mode 100644 index 300e263..0000000 --- a/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Dgh-DB-1.h> - -mission* createMission() { - return new _581_Dgh(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h b/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h deleted file mode 100644 index 1f9cc2e..0000000 --- a/src/mission/DGH/581-Dgh-DB-1/581-Dgh-DB-1.h +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include -#include -#include - -#pragma region 算法 - -using namespace HDevEngineCpp; - -#pragma endregion - -class _581_Dgh : public mission { -public: - using generalTrigger = _581_Union_triggerTemplate; - generalTrigger dgh_db_yh_3d_1; - generalTrigger dgh_db_yh_3d_2; - - generalTrigger dgh_db_mh_3d_1; - generalTrigger dgh_db_mh_3d_2; - detParams _params; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - } - bool initCustom() { -#pragma region 注册触发器回调 - dgh_db_yh_3d_1.init("Camera1", "短边预焊前3D-1", 18000,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_yh_3d_2.init("Camera2", "短边预焊前3D-2", 18200,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_mh_3d_1.init("Camera3", "短边满焊前3D-1", 18800,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_mh_3d_2.init("Camera4", "短边满焊前3D-2", 19000,4,1, &_params, _serviceManager, bridge, generalAlgoTest); -#pragma endregion - return true; - } - void reloadAlgo(QByteArray& byteArray) { - - } - - -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt b/src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/DGH/581-Dgh-DB-1/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp b/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp deleted file mode 100644 index 88e5c11..0000000 --- a/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581-Dgh-DB-2.h> - -mission* createMission() { - return new _581_Dgh(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h b/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h deleted file mode 100644 index 3e3567a..0000000 --- a/src/mission/DGH/581-Dgh-DB-2/581-Dgh-DB-2.h +++ /dev/null @@ -1,273 +0,0 @@ -#include -#include -#include -#include -#include -#pragma region 算法 -class GunYaHou2DParam { -public: - handdleAI::pSegmentation* seg = nullptr; - handdleAI::pClassification* cls = nullptr; - handdleAI::pDetection* det = nullptr; -}; -using namespace HDevEngineCpp; - -static bool generalAlgoTestDuanBian(std::shared_ptr data, detParams* _detParams, yh_581_address address) { - try { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - data->customPath = "{imgSaveRootDir}/{yyyy-MM-dd}/{saveObjectName}{imageType}/{HH}H/{processResult}/"; - std::vector < std::string> defects = { "测试" }; - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() < 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - if (data->oriImgs[0].rows == 100) { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); - return false; - } - - cv::Mat Paint; - QMutex paintMutex; - clock_t start, finish; - start = clock(); - cv::Mat src1 = data->oriImgs[0]; - if (src1.channels() != 3) - cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); - else - src1.copyTo(Paint); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "划伤", cv::Point(10, 10), cv::Scalar(0, 255, 0)); - cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.123");//发送数据1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.456");//发送数据2 - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 - data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果 - return false; -} - -void exceptionResume(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -cv::Mat LocalCutImg_DET(handdleAI::pDetection* pDet, cv::Mat src, float zoom, int checkNameId, cv::Rect& cutRoi) -{ - cv::Mat dst; - cv::resize(src, dst, cv::Size(src.cols / zoom, src.rows / zoom)); - std::vector resultBox = pDet->Evaluate(dst); //结果为中心点+宽高 - - cv::Mat contourImg; - std::vector> contours; - //cv::threshold(dstImg, contourImg, pSeg->m_classes, 255, cv::THRESH_BINARY_INV); - //cv::findContours(contourImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - - cv::Mat roiImg; - - if (resultBox.size() <= 0) - { - cv::Mat rstMat = cv::Mat(100, 100, CV_8UC1, cv::Scalar(0, 0, 0)); - cutRoi = cv::Rect(0, 0, 100, 100); - return rstMat; - } - - double maxArea = 0; - int index = -1; - for (int j = 0; j < resultBox.size(); j++) - { - double area = resultBox[j].w * resultBox[j].h; - if (area >= maxArea) - { - maxArea = area; - index = j; - } - } - - /*cv::Rect rect = cv::boundingRect(contours[index]); - cv::rectangle(roiImg, cv::Rect(resultBox[j].x - resultBox[j].w / 2, resultBox[j].y - resultBox[j].h / 2, resultBox[j].w, resultBox[j].h), cv::Scalar(0, 0, 255), 5);*/ - int addpixel = 15; - - cutRoi.x = ((resultBox[index].x - resultBox[index].w / 2) * zoom); - cutRoi.y = ((resultBox[index].y - resultBox[index].h / 2) * zoom); - cutRoi.width = (resultBox[index].w * zoom); - cutRoi.height = (resultBox[index].h * zoom); - //cv::rectangle(src, cutRoi, cv::Scalar(0, 0, 255), 2, 8); - /* cutRoi.x = rect.x * zoom; - cutRoi.y = rect.y * zoom; - cutRoi.width = rect.width * zoom; - cutRoi.height = rect.height * zoom;*/ - - src(cutRoi).copyTo(roiImg); - return roiImg; -} -static std::vectordingGaiHanClsCut(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) -{ - std::vector result; - int splitCount = std::max(boundingBox.width, boundingBox.height) / std::max(boundingBox.width, boundingBox.height); - //std::cout << "splitCount" << splitCount; - if (splitCount > 2) {//大于2分段裁 - if (boundingBox.width > boundingBox.height) {//宽大于高,横着裁 - for (int i = 0; i < splitCount; i++) { - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.height * i, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); - } - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.width - boundingBox.height, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); - } - else { - for (int i = 0; i < splitCount; i++) { - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.width * i, boundingBox.width, boundingBox.width), imgInput)); - } - result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.height - boundingBox.width, boundingBox.width, boundingBox.width), imgInput)); - } - return result; - } - else - return std::vector(1, cutImg2Cls(boundingBox, imgInput, targetSize)); -} -bool handleAiEvaluate(std::shared_ptr data, GunYaHou2DParam* _detParams,cv::Mat& srcImg, cv::Mat& showImg) { - bool handleAiResultIsOK = true; - clock_t start = clock(); - cv::Mat imgForDet; - srcImg.copyTo(imgForDet); - cv::Rect detRect; - cv::Mat det_Image = LocalCutImg_DET(_detParams->det, imgForDet, 1, 0, detRect); - //addImgToSaveStruct(det_Image, "0", savePath_sorce + "/" + SN + "_det_" + sdataTime_name + ".bmp");//保存seg图 - cv::Mat segImg = ~_detParams->seg->Evaluate(det_Image);//一定要取反,因为seg默认抓到的区域为黑色 - data->segOriginImgs.push_back(segImg); - clock_t stop = clock(); - std::vector>contours;//点集 - stop = clock(); - cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); // 寻找白色区域并储存为点集 - //QMutexLocker lock(showImgLocker);//加锁防止和halcon线程冲突 - int clsResult = 0; - for (int i = 0; i < contours.size(); i++)//遍历点集 - { - cv::Rect rect = cv::boundingRect(contours[i]);//最小外接矩形 - //if( (rect.height > 25 || rect.width > 50) && (rect.height > 10 && rect.width > 10))// 过滤 - if ((rect.height > 40 || rect.width > 100) && (rect.height > 30 && rect.width > 10)) - { - auto clsimgs = dingGaiHanClsCut(rect, det_Image); - bool isNg = false; - int cnt = 0; - for (auto& clsImg : clsimgs) - { - clsResult = _detParams->cls->Evaluate(clsImg);//cls检测 得出的是int型 从0开始 - if (clsResult == 1 || clsResult == 3) { - isNg = true; - } - //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/" + SN + "_cls" + QString::number(clsResult) + "_" + sdataTime_name + ".bmp"); - data->clsOriginImgs.push_back({std::to_string(clsResult),clsImg}); - cnt++; - drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - } - if (isNg == true) - { - rectangle(showImg, cv::Rect{ rect.x + detRect.x,rect.y + detRect.y,rect.width ,rect.height }, cv::Scalar(0, 0, 255), 2, 8, 0); - //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - handleAiResultIsOK = false; - } - else - { - if (clsResult == 2) - { - rectangle(showImg, cv::Rect{ rect.x + detRect.x,rect.y + detRect.y,rect.width ,rect.height }, cv::Scalar(0, 255, 255), 2, 8, 0); - //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - } - } - } - else - { - auto clsimgs = dingGaiHanClsCut(rect, det_Image); - int cnt = 0; - for (auto& clsImg : clsimgs) - { - data->clsOriginImgs.push_back({ std::to_string(clsResult),clsImg }); - //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/CSSMALL_" + SN + "_" + sdataTime_name + ".bmp"); - cnt++; - drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); - } - } - } - return handleAiResultIsOK; -} -static bool GunYaHou2D(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address) { - try { - cv::Mat sourceImg = data->oriImgs[0]; - cv::Mat Paint; - sourceImg.copyTo(Paint); - - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - handleAiEvaluate(data, _detParams,sourceImg,Paint); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address,"算法异常"); - return true; -} -#pragma endregion - -class _581_Dgh : public mission { -public: - using generalTrigger = _581_Union_triggerTemplate; - generalTrigger dgh_db_mh_2d_1; - generalTrigger dgh_db_mh_2d_2; - - _581_Union_triggerTemplate dgh_db_gy_2d_1; - _581_Union_triggerTemplate dgh_db_gy_2d_2; - - generalTrigger dgh_db_gy_3d_1; - generalTrigger dgh_db_gy_3d_2; - - detParams _params; - std::vector _GunYaHou2DParam = std::vector(2); - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - if (initOnce == false) { - initOnce = true; - } - } - bool initCustom(){ -#pragma region 注册触发器回调 满焊 - dgh_db_mh_2d_1.init("Camera1", "短边满焊前2D-1", 18400,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_db_mh_2d_2.init("Camera2", "短边满焊前2D-2", 18600,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); - dgh_db_gy_2d_1.init("Camera3", "短边滚压后2D-1-外侧", 19200,4,1, &_GunYaHou2DParam[0], _serviceManager, bridge, GunYaHou2D, "滚压后2D"); - dgh_db_gy_2d_2.init("Camera4", "短边滚压后2D-2-内侧", 19400,4,1, &_GunYaHou2DParam[1], _serviceManager, bridge, GunYaHou2D, "滚压后2D"); - dgh_db_gy_3d_1.init("Camera5", "短边滚压后3D-1", 19600,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "滚压后3D"); - dgh_db_gy_3d_2.init("Camera6", "短边滚压后3D-2", 19800,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "滚压后3D"); -#pragma endregion - return true; - } - void reloadAlgo(QByteArray& byteArray) { - - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt b/src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/DGH/581-Dgh-DB-2/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/DGH/CMakeLists.txt b/src/mission/DGH/CMakeLists.txt deleted file mode 100644 index f9a95fd..0000000 --- a/src/mission/DGH/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# 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/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp deleted file mode 100644 index 7e26dd1..0000000 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp +++ /dev/null @@ -1,341 +0,0 @@ -#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){ - - std::vector> contours; - cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - int cnt = 0; - for (int i = 0; i < contours.size(); i++){ - cv::Rect originRect = cv::boundingRect(contours[i]); - cv::Rect rect = originRect; - rect.x += offset.x; - rect.y += offset.y; - - if (originRect.width < 200 || originRect.height < 200) - continue; - std::vector clsImgVec = cutImg2ClsVec(rect, src); - std::vector clsRes;//true ok - bool isNg = false; - for (auto& cls : clsImgVec) { - int Result = clsPtr->Evaluate(cls); - if (Result == 1)isNg = true; - clsRes.push_back(Result); - } - clsImgs.insert(clsImgs.end(), clsImgVec.begin(), clsImgVec.end()); - if (isNg == true) - { - cv::Scalar color = cv::Scalar(0, 255, 255, 30); - //cv::rectangle(Paint, originRect, color, 4); - drawContours(Paint, contours, i, cv::Scalar(0, 255, 255, 30), 3, cv::LINE_8, cv::noArray(), INT_MAX, cv::Point(offset.x, offset.y)); - //putTextHusky(Paint, utf8_to_gbk("NG").c_str(), cv::Point(originRect.x - originRect.width / 2, originRect.y - originRect.height / 2 - 50), cv::Scalar(0, 255, 0), 50); - silieResult = false; - } - else - { - //drawContours(Paint, contours, i, cv::Scalar(0, 255, 0, 30), 3, LINE_8, noArray(), INT_MAX, cv::Point(offset.x, offset.y)); - } - //if (clsRes == 1) { - // cv::Scalar color = cv::Scalar(0, 0, 255, 30); - // cv::rectangle(Paint, paintRect, color, 4); - // putTextHusky(Paint, utf8_to_gbk("撕裂").c_str(), cv::Point(paintRect.x - paintRect.width / 2, paintRect.y - paintRect.height / 2 - 50), cv::Scalar(0, 255, 0), 50); - // silieResult = false; - //} - //else if (clsRes == 2) { - // cv::Scalar color = cv::Scalar(0, 0, 255, 30); - // cv::rectangle(Paint, paintRect, color, 4); - // putTextHusky(Paint, utf8_to_gbk("翻折").c_str(), cv::Point(paintRect.x - paintRect.width / 2, paintRect.y - paintRect.height / 2 - 50), cv::Scalar(0, 255, 0), 50); - // fanZheResult = false; - //} - } -} -halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegmentation* seg_hanYinZhuaQu, cv::Mat& segResult){//算法先画 - halconResult result; - cv::Mat forSeg; - cv::resize(img, forSeg, cv::Size(), 0.2, 0.2); - segResult = seg_hanYinZhuaQu->Evaluate(forSeg); - cv::resize(segResult, segResult, cv::Size(), 5, 5); - HObject in_Image1 = MatToHObject(img), in_Image2 = MatToHObject(segResult); - HTuple in_Resolution(0.013682); - - HDevEngineCpp::HDevProcedure proc("_1_Cal_JE_Distance"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - procedureCall.SetInputIconicParamObject("in_Image1", in_Image1); - procedureCall.SetInputIconicParamObject("in_Image2", in_Image2); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.Execute(); - HTuple out_LinePoint, out_Distance, out_Flag; - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - if (out_Flag.D() == 0) - { - for (auto i = 0; i < out_LinePoint.Length(); i += 4) - { - cv::line(Paint, - cv::Point(out_LinePoint[i + 1].D(), out_LinePoint[i].D()), - cv::Point(out_LinePoint[i + 3].D(), out_LinePoint[i + 2].D()), - cv::Scalar(0, 255, 0), 5); - } - - 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() * 0.013682 * 0.013682;//焊印的面积 - double jiEr_Width = out_Distance[3].D();//极耳的宽度 - 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 = 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 - { - //putTextHusky(Paint, utf8_to_gbk("算法异常").c_str(), cv::Point(0, 500), cv::Scalar(0, 255, 0), 300); - //putTextHusky(Paint, utf8_to_gbk("NG").c_str(), cv::Point(0, 0), cv::Scalar(0, 0, 255), 300); - result.result = false; - return result; - } - result.result = true; - return result; -} -bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { - QByteArray plcResult = "1"; - try { - //data->oriImgs[0] = cv::imread("D:/testImage/L.bmp", -1); - cv::Mat sourceImg = data->oriImgs[0]; - - cv::Mat 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));//异步执行 - - //handleAI主线程处理 定位极耳 - float resizeRate = 5.0; - cv::Mat matForDingWei; - cv::resize(sourceImg, matForDingWei, cv::Size(), 1 / resizeRate, 1 / resizeRate); - cv::Mat dingWeiResultMat = ~_detParams->segYuHanDingWei->Evaluate(matForDingWei); - cv::Mat structreElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); - dilate(dingWeiResultMat, dingWeiResultMat, structreElement, cv::Point(-1, -1), 1); - cv::Rect rect = findMaxAreaContour(dingWeiResultMat); - cv::Mat matDet; - cv::Rect rectCutJier(rect.x * resizeRate - 25, - rect.y * resizeRate - 25, - rect.width * resizeRate + 50, - rect.height * resizeRate + 50); - sourceImg(rectCutJier & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows))).copyTo(matDet); - - //SEG缺陷检测 - cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet); - bool silieOk = true, fanZheOk = true; - std::vector 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"; - QByteArray silieResultText = silieOk == true ? "1" : "2"; - 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(4200, 50), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4200, 50), cv::Scalar(0, 0, 255)); - //plcResult = "2"; - data->aiDetOK = false; - } - - 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("焊后", "极耳长度(上限)", 21).toDouble(); - double jierChangLimitLow = data->service->_paramSyncManager->get("焊后", "极耳长度(下限)", 19).toDouble(); - bool jierChangEnable = data->service->_paramSyncManager->get("焊后", "极耳长度判定启用", false).toBool(); - - if (halconResult.hanYin_Width > hanyinChangLimitHigh || halconResult.hanYin_Width < hanyinChangLimitLow) { - textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 0, 255));//焊印宽度 - if (hanyinChangEnable == true) - plcResult = "2"; - } - else { - textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 255, 0));//焊印宽度 - } - - if (halconResult.hanYin_Height > hanyinKuanLimitHigh || halconResult.hanYin_Height < hanyinKuanLimitLow) { - textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 0, 255));//焊印高度 - if (hanyinKuanEnable == true) - plcResult = "2"; - } - else { - textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 255, 0));//焊印高度 - } - - if (halconResult.jiErHeight > jierChangLimitHigh || halconResult.jiErHeight < jierChangLimitLow) { - textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 0, 255));//极耳高度 - if (hanyinKuanEnable == true) - plcResult = "2"; - } - else { - textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳高度 - } - if (plcResult == "2" || halconResult.result == false) { - textPainter.putText(Paint, "算法NG", cv::Point(4200, 350), cv::Scalar(0, 0, 255)); - data->halconOK = false; - } - if(data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool() == true) - plcResult = "1"; - - data->sqlVec.insert({ {"焊印长度",halconResult.hanYin_Width }, { "焊印宽度",halconResult.hanYin_Height }, { "极耳裁切长度",halconResult.jiErHeight } }); -#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.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, "焊印面积" + 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; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - 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, 0, 255)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool() == true) - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - return true; -} - -bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { - QByteArray plcResult = "2"; - try{ - 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); - - //jier定位 - float resizeRate = 5.0; - cv::Mat matForDingWei; - cv::resize(sourceImg, matForDingWei, cv::Size(), 1 / resizeRate, 1 / resizeRate); - cv::Mat dingWeiResultMat = ~_detParams->segYuHanDingWei->Evaluate(matForDingWei); - cv::Mat structreElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); - dilate(dingWeiResultMat, dingWeiResultMat, structreElement, cv::Point(-1, -1), 1); - cv::Rect rect = findMaxAreaContour(dingWeiResultMat); - cv::Mat matDet; - cv::Rect rectCutJier(rect.x * resizeRate - 25, - rect.y * resizeRate - 25, - rect.width * resizeRate + 50, - rect.height * resizeRate + 50); - sourceImg(rectCutJier & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows))).copyTo(matDet); - - //SEG缺陷检测 - cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet); - data->segOriginImgs.push_back(matDet); - bool silieOk = true, fanZheOk = true; - std::vector clsImgs; - if (_detParams->cameraIndex > 4) { - handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rectCutJier.x, rectCutJier.y), _detParams->clsHanHou, clsImgs); - } - for (auto& img : clsImgs) - data->clsOriginImgs.push_back({ "cls",img }); - 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(50, 50), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->aiDetOK = false; - } - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - 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, 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");//结果反馈 - return true; -} - - - - - -mission* createMission() { - return new _581_YuHan_hanqian(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h deleted file mode 100644 index cad2789..0000000 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h +++ /dev/null @@ -1,156 +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; - 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/YuHan/581_YuHan_hanhou/CMakeLists.txt b/src/mission/YuHan/581_YuHan_hanhou/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/YuHan/581_YuHan_hanhou/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp deleted file mode 100644 index 3874af8..0000000 --- a/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581_YuHan_hanqian.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h deleted file mode 100644 index 5d13766..0000000 --- a/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class yuHanHanQianParams { -public: - handdleAI::pSegmentation* segDingWei = nullptr; - - handdleAI::pSegmentation* segJiErFanZhe = nullptr; - handdleAI::pClassification* clsJiErFanZhe = nullptr; - bool isTong = true; -}; -void halconProcess(cv::Mat& sourceImg, cv::Mat& Paint) { - try { - HDevEngineCpp::HDevProcedure proc("Inspection_YH_JE"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HObject in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图像类变量 - procedureCall.Execute();//执行halcon程序 - HTuple out_X, out_Y, out_Flag; - out_X = procedureCall.GetOutputCtrlParamTuple("out_X"); - out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - if (out_Flag.D() == 0) { - for (int i = 0; i < out_X.Length(); i++) - Paint.at(out_X[i].D(), out_Y[i].D()) = { 255,255,0 }; - } - } - catch (HDevEngineCpp::HDevEngineException& ex) { - - std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ - qDebug() << "HDevEngineException: " << ex.Message(); \ - } - catch (HalconCpp::HException& ex) { - - std::cout << "Halcon Exception Caught!" << std::endl; \ - std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ - std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ - qDebug() << "Halcon Exception Caught!"; \ - qDebug() << "Error Code: " << ex.ErrorCode(); \ - qDebug() << "Error Message: " << ex.ErrorMessage(); \ - } -} -cv::Rect getImageLocateRect(cv::Mat& src, handdleAI::pSegmentation* seg, double bounus = 0.1) { - cv::Mat tmpImg; - cv::resize(src, tmpImg, cv::Size(), bounus, bounus); - cv::Mat ouput = ~seg->Evaluate(tmpImg); - auto rect = findMaxAreaContour(ouput); - rect.x /= bounus; rect.y /= bounus; - rect.width /= bounus; rect.height /= bounus; - return rect; -} -bool handleAiProcess(cv::Mat& seg_detImg, cv::Mat& seg_Paint, - handdleAI::pSegmentation* segPtr, handdleAI::pClassification* clsPtr, - std::vector< std::pair >& clsImgs){ - cv::Mat segResizeImg; - float resizeRate = 1.0; - cv::resize(seg_detImg, segResizeImg, cv::Size(), 1.0 / resizeRate, 1.0 / resizeRate); - cv::Mat seg_ResultImg = ~segPtr->Evaluate(segResizeImg); - cv::resize(seg_ResultImg, seg_ResultImg, cv::Size(), resizeRate, resizeRate); - std::vector> contours; - cv::findContours(seg_ResultImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - bool finalNg = false; - for (int i = 0; i < contours.size(); i++) - { - cv::Rect cls_rect = cv::boundingRect(contours[i]); - if (cls_rect.width < 200 || cls_rect.height < 200) - continue; -#if 1 - std::vector clsImgVec = cutImg2ClsVec(cls_rect, seg_detImg); - std::vector clsRes;//true ok - bool isNg = false; - for (auto& cls : clsImgVec) { - cv::resize(cls, cls, cv::Size(128, 128));//根据需要设定大小 - int Result = clsPtr->Evaluate(cls); - if (Result != 0)isNg = true; - clsRes.push_back(Result); - clsImgs.push_back({ std::to_string(Result) ,cls }); - } - if (isNg == true) { - cv::Scalar color = cv::Scalar(0, 255, 255, 30); - cv::rectangle(seg_Paint, cls_rect, color, 4); - drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3); - finalNg = true; - } - else { - //drawContours(seg_Paint, contours, i, cv::Scalar(0, 255, 0, 30), 3); - } -#else - bool isNg = false; - cv::Mat clsImage = cutLabelImg(seg_detImg, 200, 200, cls_rect, 0, 1, 1); - int Result = clsPtr->Evaluate(clsImage); - if (Result != 0) { - isNg = true; - cv::Scalar color = cv::Scalar(0, 255, 255, 30); - cv::rectangle(seg_Paint, cls_rect, color, 4); - drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3); - finalNg = true; - } - else { - - } - clsImgs.push_back({ Result , clsImage }); -#endif - } - return finalNg; -} -bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, sx_581_address address) { - try{ -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - bool detEnable = data->service->_paramSyncManager->get("极耳翻折","极耳翻折判定启用", true).toBool(); - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "1"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - //halconProcess(sourceImg, Paint); - float resizeRate = 5.0; - 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_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); - } - else { - isNG = true; - } - QString okNgSaveText = "NG"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (isNG == false)//OK - { - textPainter.putText(Paint, "OK", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - okNgSaveText = "OK"; - } - else - { - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); - data->aiDetOK = false; - if(data->service->_paramSyncManager->get("通用设置","极耳翻折判定启用", true).toBool() == true) - plcResult = "2"; - } - if(data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool() == true) - plcResult = "1";//强制OK - 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 - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - return true; -} -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_top_1; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_down_2; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_top_3; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_down_4; - - _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_top_5; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_down_6; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_top_7; - _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_down_8; - std::vector < yuHanHanQianParams> tongDetParams = std::vector < yuHanHanQianParams>(4); - std::vector < yuHanHanQianParams> lvDetParams = std::vector < yuHanHanQianParams>(4); - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_628_1.hdpl"); - - 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/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/hanqian_L-seg.BHD", 64, 1); - params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/hanqian_L-cls.BHD", 1, 1); - params.isTong = false; - } - initOnce = true; - } - } - bool initCustom() { -#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); - - 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); - out_tong_top_7.init("Camera7", "极耳翻折-铜-外-相机7(顶部)", { { 706, 1,{720},"707","714",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, jiErFanZhe); - out_tong_down_8.init("Camera8", "极耳翻折-铜-外-相机8(底部)", { { 708, 1,{720},"709","716",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, jiErFanZhe); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt b/src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/YuHan/581_YuHan_hanqian/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp deleted file mode 100644 index 7760162..0000000 --- a/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581_YuHan_jixing.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h deleted file mode 100644 index d67e066..0000000 --- a/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h +++ /dev/null @@ -1,177 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class yuHanParams { -public: - - bool isTong = true; -}; -bool halconProcess(cv::Mat& sourceImg, cv::Mat& Paint) { - try { - HDevEngineCpp::HDevProcedure proc("YH_Color_Inspection"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HObject in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图像类变量 - procedureCall.Execute();//执行halcon程序 - HTuple out_ColorType; - HTuple out_Flag; - out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出图像类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - //相机2 OK为铜 NG为铝 - if (out_Flag.D() == 1) - { - if (out_ColorType.D() == 1)//铜 - { - //cv::putText(Paint, "OK", cv::Point(0, 550), 2, 10, cv::Scalar(0, 255, 0), 10); - return true; - } - else//铝 - { - //cv::putText(Paint, "NG", cv::Point(0, 550), 2, 10, cv::Scalar(0, 0, 255), 10); - return false; - } - } - else - { - //cv::putText(Paint, "NG", cv::Point(0, 550), 2, 10, cv::Scalar(0, 0, 255), 10); - return false; - } - } - catch (HDevEngineCpp::HDevEngineException& ex) { - - std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ - qDebug() << "HDevEngineException: " << ex.Message(); \ - } - catch (HalconCpp::HException& ex) { - - std::cout << "Halcon Exception Caught!" << std::endl; \ - std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ - std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ - qDebug() << "Halcon Exception Caught!"; \ - qDebug() << "Error Code: " << ex.ErrorCode(); \ - qDebug() << "Error Message: " << ex.ErrorMessage(); \ - } -} -bool jixingjiance(std::shared_ptr data, yuHanParams* detParams, sx_581_address address) { - try{ -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - //存图数据加保存队列,加锁,避免数据访问冲突 - bool jiXingEnable = data->service->_paramSyncManager->get("极性","极性判定启用", true).toBool(); - QByteArray plcResult = "1"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - bool isNG = halconProcess(sourceImg, Paint); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (isNG)//OK - { - textPainter.putText(Paint, "OK", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - } - else - { - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); - data->halconOK = false; - if(jiXingEnable == true) - plcResult = "2"; - } - if (jiXingEnable == false) - plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; -} -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate< yuHanParams> in_lv_top_1; - _581_SX_Single_triggerTemplate< yuHanParams> in_lv_down_2; - _581_SX_Single_triggerTemplate< yuHanParams> in_tong_top_3; - _581_SX_Single_triggerTemplate< yuHanParams> in_tong_down_4; - - yuHanParams tongDetParams; - yuHanParams lvDetParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - - lvDetParams.isTong = false; - } - bool initCustom() { -#pragma region 注册触发器回调 - in_lv_top_1.init("Camera1", "极性检测-相机1", { { 400, 1,{410},"401","402",-1} }, 1, &lvDetParams, _serviceManager, bridge, jixingjiance); - in_lv_down_2.init("Camera2", "极性检测-相机2", { { 430, 1,{440},"431","432",-1 }}, 1, & lvDetParams, _serviceManager, bridge, jixingjiance); - in_tong_top_3.init("Camera3", "极性检测-相机3", { { 460,1,{470},"461","462",-1} }, 1, &tongDetParams, _serviceManager, bridge, jixingjiance); - in_tong_down_4.init("Camera4", "极性检测-相机4", { { 490, 1,{500},"491","492",-1 }}, 1, & tongDetParams, _serviceManager, bridge, jixingjiance); - -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt b/src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/YuHan/CMakeLists.txt b/src/mission/YuHan/CMakeLists.txt deleted file mode 100644 index f9a95fd..0000000 --- a/src/mission/YuHan/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# 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/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp deleted file mode 100644 index ad9a35b..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581_ZhongHan_dibutiejiao.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h deleted file mode 100644 index 2ad015f..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/581_ZhongHan_dibutiejiao.h +++ /dev/null @@ -1,410 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class zhongHanFanMianTeJiaoParams { -public: - bool isTong = true; - std::string in_Product_Str = "Cu"; - -}; -void GetStringSize(HDC hdc, const char* str, int* w, int* h) -{ - SIZE size; - GetTextExtentPoint32A(hdc, str, strlen(str), &size); - if (w != 0) *w = size.cx; - if (h != 0) *h = size.cy; -} -void DrawRotatedRect2Mat(cv::Mat& img, cv::RotatedRect rotateRect, cv::Scalar color, int thickness, int linType) -{ - std::vector boxPts(4); - rotateRect.points(boxPts.data()); - for (int mm = 0; mm < 4; mm++) { - cv::line(img, boxPts[mm], boxPts[(mm + 1) % 4], color, thickness, linType); - } -} - -bool halconProcess(cv::Mat& sourceImg, cv::Mat& Paint,std::string produce) { - try { - - HDevEngineCpp::HDevProcedure proc("_3_Neg_CoverGlue_Inspection"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - - HalconCpp::HObject in_Image;//原始三通道图像 - HalconCpp::HTuple in_Product = HalconCpp::HTuple((char*)produce.c_str());//产品类别, 'Gu':铜 'Al':铝 - HalconCpp::HTuple in_LineType = "602";//线体类别 - HalconCpp::HTuple in_Resolution(0.0192118);//相机精度(mm/pix) - HalconCpp::HTuple in_FilePath("./halconFiles/ZH_TieJiao_Down/");//模板文件路径 - - in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Product", in_Product); - procedureCall.SetInputCtrlParamTuple("in_LineType", in_LineType); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute();//执行halcon程序 - - HalconCpp::HTuple out_Circle;//焊印圆中心坐标(y,x,R) - HalconCpp::HTuple out_LinePoint;//线的坐标(y1,x1,y2,x2) - HalconCpp::HTuple out_Distance;//连接片的中心到上下极耳胶纸的距离 - //out_Distance[0]:连接片的中心到上极耳胶纸的距离< / c> - //out_Distance[1] : 连接片的中心到下极耳胶纸的距离< / c> - HalconCpp::HTuple out_Rectangle;//矩形框,共计两个(y,x,phi,width,height) - HalconCpp::HTuple out_NGTails;//NG的明细 - HalconCpp::HTuple out_Flag;//算法的执行结果, 0: 算法检测NG 1: 算法执行成功 - out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint"); - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance"); - out_Rectangle = procedureCall.GetOutputCtrlParamTuple("out_Rectangle"); - out_NGTails = procedureCall.GetOutputCtrlParamTuple("out_NGTails"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (out_Flag.D() == 1) { - int out_Distanc_Size = out_Distance.Length(); - if (out_Distance.Length() > 1) { - double distance1 = out_Distance[0].D(); - if (distance1 <= 12) {//NG - textPainter.putText(Paint, - ("连接片的中心到上极耳胶纸的距离:" + QByteArray::number(distance1) + "mm").toStdString().c_str(), - cv::Point(0, 600), cv::Scalar(0, 255, 0)); - - } - else { - textPainter.putText(Paint, - ("连接片的中心到上极耳胶纸的距离:" + QByteArray::number(distance1) + "mm").toStdString().c_str(), - cv::Point(0, 600), cv::Scalar(0, 255, 0)); - } - double distance2 = out_Distance[1].D(); - if (distance2 <= 12) {//NG - textPainter.putText(Paint, - ("连接片的中心到下极耳胶纸的距离:" + QByteArray::number(distance2) + "mm").toStdString().c_str(), - cv::Point(0, 1050), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint, - ("连接片的中心到下极耳胶纸的距离:" + QByteArray::number(distance2) + "mm").toStdString().c_str(), - cv::Point(0, 1050), cv::Scalar(0, 255, 0)); - } - } - - //画圆心十字 - 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); - - //画线 - if (out_LinePoint.Length() > 3) { - for (int i = 0; i < out_LinePoint.Length() / 4; i++) { - cv::line(Paint, - cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4 + 0].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 5); - } - } - - //画矩形 - if (out_Rectangle.Length() > 4) { - for (int j = 0; j < out_Rectangle.Length() / 5; j++) { - cv::RotatedRect rRect; - rRect.center.y = out_Rectangle[j * 5 + 0].D(); - rRect.center.x = out_Rectangle[j * 5 + 1].D(); - rRect.angle = out_Rectangle[j * 5 + 2].D(); - rRect.size.width = out_Rectangle[j * 5 + 3].D(); - rRect.size.height = out_Rectangle[j * 5 + 4].D(); - - DrawRotatedRect2Mat(Paint, rRect, cv::Scalar(0, 255, 0), 3, cv::LINE_4); - } - } - } - else { - std::string NgTails = out_NGTails.S().Text();//NG明细 - textPainter.putText(Paint, NgTails.c_str(), cv::Point(0, 550), cv::Scalar(0, 255, 255)); - } - if (out_Flag.D() == 1) { - textPainter.putText(Paint,"OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - return false; - } - else { - textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - return true; - } - - } - catch (HDevEngineCpp::HDevEngineException& ex) { - - std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ - qDebug() << "HDevEngineException: " << ex.Message(); \ - } - catch (HalconCpp::HException& ex) { - - std::cout << "Halcon Exception Caught!" << std::endl; \ - std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ - std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ - qDebug() << "Halcon Exception Caught!"; \ - qDebug() << "Error Code: " << ex.ErrorCode(); \ - qDebug() << "Error Message: " << ex.ErrorMessage(); \ - } -} -bool dibutiejiao_90(std::shared_ptr data, zhongHanFanMianTeJiaoParams* _detParams, sx_581_address address) { - try{ -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - if (_detParams->in_Product_Str == "Cu") { - cv::rotate(sourceImg, sourceImg, cv::ROTATE_180);//为保证算法一致, - } - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - bool isNG = halconProcess(sourceImg, Paint, _detParams->in_Product_Str); - QString okNgSaveText = "NG"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (isNG == false)//OK - { - okNgSaveText = "OK"; - plcResult = "1"; - } - else - { - data->aiDetOK = false; - plcResult = "2"; - } - plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - sourceImg.release(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; -} -//void aiEvaluate(cv::Mat input, cv::Mat& Paint, bool& isNG) -//{ -// cv::Mat forSeg; -// input.copyTo(forSeg); -// cv::resize(forSeg, forSeg, cv::Size(), 0.25, 0.25); -// cv::Mat segRes = ~seg_diBu->Evaluate(forSeg); -// cv::resize(segRes, segRes, cv::Size(), 4, 4); -// std::vector>contours; -// cv::findContours(segRes, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); -// for (auto& contour : contours) { -// cv::Rect rect = cv::boundingRect(contour); -// if (rect.width < 350 || rect.height < 350) -// continue; -// cv::Mat clsImg = cutImg2Cls(rect, input); -// int claResult = cls_diBu->Evaluate(clsImg); -// switch (claResult) -// { -// case 0://OK -// cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3); -// break; -// case 1://NG -// cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); -// putTextHusky(Paint, -// utf8_to_gbk("NG").c_str(), -// cv::Point(rect.x, rect.y), cv::Scalar(0, 0, 255), 50); -// isNG = true; -// break; -// } -// } -// -//} -bool dibutiejiao_45(std::shared_ptr data, zhongHanFanMianTeJiaoParams* _detParams, sx_581_address address) { - try { -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - cv::Mat resultImage = img2D.clone(); - if (resultImage.channels() == 1) { - cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); - } - QString okng_tag = "OK"; - cv::Mat seg_detectImage; - cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); - plcResult = "1"; - bool isNG = false; - if (DOGLIVE) { - std::vector>clsImgs; - bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); - for (int i = 0; i < clsImgs.size(); i++) { - addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); - } - } - if (isNG == false)//OK - { - putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); - okng_tag = "OK"; - } - else - { - putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); - plcResult = "2"; - } - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - if (resMat.size() > 0) - { - addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 - } - addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - cv::Mat Paint; - cv::resize(sourceImg, sourceImg, cv::Size(), 0.5, 0.5); - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - bool isNG = false; - //aiEvaluate(sourceImg, Paint, isNG); - QString okNgSaveText = "NG"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (isNG == false)//OK - { - textPainter.putText(Paint, "OK", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - okNgSaveText = "OK"; - } - else - { - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - data->aiDetOK = false; - plcResult = "2"; - } - plcResult = "1";//强制OK - data->resultImgs.push_back(Paint); - sourceImg.release(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -#endif - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; -} -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> chuizhi_1; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_2; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_3; - - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> chuizhi_4; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_5; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_6; - - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> chuizhi_7; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_8; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_9; - - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> chuizhi_10; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_11; - _581_SX_Single_triggerTemplate< zhongHanFanMianTeJiaoParams> qingxie_12; - zhongHanFanMianTeJiaoParams tongDetParams; - zhongHanFanMianTeJiaoParams lvDetParams; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - lvDetParams.isTong = false; - tongDetParams.in_Product_Str = "Cu"; - lvDetParams.in_Product_Str="Lv"; - - } - bool initCustom() { -#pragma region 注册触发器回调 - chuizhi_1.init("Camera1", "底部贴胶检测-左-铜-相机1(90°)", { { 5500, 1,{5530},"5502","5504",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_90,"贴胶90度"); - qingxie_2.init("Camera2", "底部贴胶检测-左-铜-相机2(45°)", { { 5510, 1,{5530},"5512","5514",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_45,"贴胶45度"); - qingxie_3.init("Camera3", "底部贴胶检测-左-铜-相机3(45°)", { { 5520, 1,{5530},"5522","5524",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_45,"贴胶45度"); - chuizhi_4.init("Camera4", "底部贴胶检测-左-铝-相机4(90°)", { { 5550, 1,{5530},"5552","5554",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_90, "贴胶90度"); - qingxie_5.init("Camera5", "底部贴胶检测-左-铝-相机5(45°)", { { 5560, 1,{5530},"5562","5564",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); - qingxie_6.init("Camera6", "底部贴胶检测-左-铝-相机6(45°)", { { 5570, 1,{5530},"5572","5574",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); - chuizhi_7.init("Camera7", "底部贴胶检测-右-铜-相机1(90°)", { { 5700, 1,{5730},"5702","5704",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_90, "贴胶90度"); - qingxie_8.init("Camera8", "底部贴胶检测-右-铜-相机2(45°)", { { 5710, 1,{5730},"5712","5714",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); - qingxie_9.init("Camera9", "底部贴胶检测-右-铜-相机3(45°)", { { 5720, 1,{5730},"5722","5724",-1} }, 1, &tongDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); - chuizhi_10.init("Camera10", "底部贴胶检测-右-铝-相机4(90°)", { { 5750, 1,{5730},"5752","5754",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_90, "贴胶90度"); - qingxie_11.init("Camera11", "底部贴胶检测-右-铝-相机5(45°)", { { 5760, 1,{5730},"5762","5764",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); - qingxie_12.init("Camera12", "底部贴胶检测-右-铝-相机6(45°)", { { 5770, 1,{5730},"5772","5774",-1} }, 1, &lvDetParams, _serviceManager, bridge, dibutiejiao_45, "贴胶45度"); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_dibutiejiao/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp b/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp deleted file mode 100644 index 58e705e..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.cpp +++ /dev/null @@ -1,394 +0,0 @@ -#include <581_ZhongHan_hanhou.h> - -void exceptionResume(std::shared_ptr data, zhongHan3DParams* _detParams, sx_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -void exceptionResume(std::shared_ptr data, zhongHan2dCeLiangParams* _detParams, sx_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -void exceptionResume(std::shared_ptr data, zhongHan2dCeMianParams* _detParams, sx_581_address address, QString why = "") { - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 -} -bool zhongHan_hanHouCeLiang(std::shared_ptr data, zhongHan2dCeLiangParams* _detParams, sx_581_address address) { - try - { - - QByteArray plcResult = "2"; - //img2D = cv::imread("D:\\终焊CCD存图\\焊后正面测量CCD\\2025-07-28\\原图\\21H\\errSN\\ORI0_errSN_DA1806128_0_21-34-01-10.bmp", -1); - cv::Mat sourceImg = data->oriImgs[0]; - cv::Rect cutRect; - if (_detParams->isTong == true) { - cutRect = cv::Rect(2000, 0, 3000, 3648); - } - if (_detParams->isTong == false) { - cutRect = cv::Rect(400, 0, 3000, 3648); - } - cv::Mat cutImage = sourceImg(cutRect & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows))); - //if (_detParams->isTong == false) { - // cv::rotate(cutImage, cutImage, cv::ROTATE_180); - //} - cv::Mat Paint; - cutImage.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - cv::Mat segProcessMat; - float resizeRate = 5.0; - cv::resize(cutImage, segProcessMat, cv::Size(), 1 / resizeRate, 1 / resizeRate); - cv::Mat segResult = _detParams->seg_hanHouDingWei->Evaluate(segProcessMat); - data->segOriginImgs.push_back(segProcessMat); - data->segOriginImgs.push_back(cutImage); - data->segOriginImgs.push_back(segResult); - - HDevEngineCpp::HDevProcedure proc("_2_Cal_Welding_Distance"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - HalconCpp::HObject in_Image = MatToHObject(cutImage); - HalconCpp::HObject in_ImageSeg = MatToHObject(segResult); - - HTuple in_Resolution(0.0346699); - HTuple in_FilePath("./halconFiles/"); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputIconicParamObject("in_ImageSeg", in_ImageSeg); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute(); - HTuple out_BaseLineCor; - HTuple out_LineCor; - HTuple out_Distance1; - HTuple out_Distance2; - HTuple out_HYValues1; - HTuple out_HYValues2; - HTuple out_ColorType; - HTuple out_Flag; - HTuple out_NgTails; - //out_BaseLineCor = procedureCall.GetOutputCtrlParamTuple("out_BaseLineCor"); - out_LineCor = procedureCall.GetOutputCtrlParamTuple("out_LineCor"); - out_Distance1 = procedureCall.GetOutputCtrlParamTuple("out_Distance1"); - out_Distance2 = procedureCall.GetOutputCtrlParamTuple("out_Distance2"); - out_HYValues1 = procedureCall.GetOutputCtrlParamTuple("out_HYValues1"); - out_HYValues2 = procedureCall.GetOutputCtrlParamTuple("out_HYValues2"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails"); - double xingBaoDingBuDaoHanYinJianJu; - TextRendererZH textPainter(Paint.cols, Paint.rows, 120); - if (out_Flag.D() == 1) - { - { - /*int out_BaseLineCor_L = out_BaseLineCor.Length(); - for (auto i = 0; i < out_BaseLineCor_L / 4; i++) - cv::line(Paint, cv::Point(out_BaseLineCor[i * 4 + 1].D(), out_BaseLineCor[i * 4].D()), - cv::Point(out_BaseLineCor[i * 4 + 3].D(), out_BaseLineCor[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 20);*/ - - int out_LineCor_L = out_LineCor.Length(); - for (auto i = 0; i < out_LineCor_L / 4; i++) - cv::line(Paint, cv::Point(out_LineCor[i * 4 + 1].D(), out_LineCor[i * 4].D()), - cv::Point(out_LineCor[i * 4 + 3].D(), out_LineCor[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 20); - } - //1 - { - textPainter.putText(Paint, "上焊印下边缘到连接片圆心水平间距:" + QString::number(out_Distance1[0].D(),'f', 3).toStdString() + "mm", cv::Point(50, 0), cv::Scalar(0, 255, 0)); - if(data->cameraKeyName == "Camera1") { - textPainter.putText(Paint, "上焊印左边缘圆心竖直间距:" + QString::number(out_Distance1[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, 120), cv::Scalar(0, 255, 0)); - } - else { - textPainter.putText(Paint, "上焊印右边缘圆心竖直间距:" + QString::number(out_Distance1[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, 120), cv::Scalar(0, 255, 0)); - } - textPainter.putText(Paint, "上焊印上边缘到芯包间距:" + QString::number(out_Distance1[2].D(), 'f', 3).toStdString() + "mm", cv::Point(50, 240), cv::Scalar(0, 255, 0)); - 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[2].D())); - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(out_Distance1[2].D())); - } - //2 - { - textPainter.putText(Paint, "下焊印面积:" + QString::number(out_HYValues2[0].D(), 'f', 3).toStdString() + "mm²", cv::Point(50, cutImage.rows - 770), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下焊印长:" + QString::number(out_HYValues2[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 650), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下焊印宽:" + QString::number(out_HYValues2[2].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 530), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下焊印下边缘到芯包间距:" + QString::number(out_Distance2[2].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 410), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下焊印上边缘到连接片圆心水平间距:" + QString::number(out_Distance2[0].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 290), cv::Scalar(0, 255, 0)); - if (data->cameraKeyName == "Camera1") { - textPainter.putText(Paint, "下焊印左边缘到连接片圆心竖直间距:" + QString::number(out_Distance2[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 170), cv::Scalar(0, 255, 0)); - } - 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 - data->service->_triggerManager->writeFloat("D5822_" + QByteArray::number(xingBaoDingBuDaoHanYinJianJu)); - } - } - else - { - textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0)); - data->halconOK = false; - plcResult = "2"; - } - plcResult = "1";//强制OK - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - sourceImg.release(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "ERROR"); - return true; -} -std::vector aiEvaluate(cv::Mat input, cv::Mat& Paint, bool& isNG, zhongHan2dCeMianParams* _detParams) -{ - std::vector clsImgs; - cv::Mat forSeg; - input.copyTo(forSeg); - cv::Mat segRes = ~_detParams->seg_ceMian->Evaluate(forSeg); - std::vector>contours; - cv::findContours(segRes, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - int clsIndex = 0; - TextRendererZH textPainter(Paint.cols, Paint.rows, 50); - for (auto& contour : contours) { - clsIndex++; - cv::Rect rect = cv::boundingRect(contour); - if (rect.width < 200 || rect.height < 200) - continue; - cv::Mat clsImg = cutImg2Cls(rect, input); - //cv::Mat clsImg = cutLabelImg(input, 128, 128, rect, 0, 1, 0); - int claResult = _detParams->cls_ceMian->Evaluate(clsImg); - clsImgs.push_back(clsImg); - switch (claResult) - { - case 0://OK - cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3); - break; - case 1://NG - cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); - cv::drawContours(Paint, contours, clsIndex - 1, cv::Scalar(0, 0, 255),2); - textPainter.putText(Paint, "NG" , cv::Point(rect.x, rect.y), cv::Scalar(0, 0, 255)); - isNG = true; - break; - case 2:// - textPainter.putText(Paint, "撕裂", cv::Point(rect.x, rect.y), cv::Scalar(0, 0, 255)); - cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); - isNG = true; - break; - } - - } - return clsImgs; -} -bool zhongHan_hanHouCeMian(std::shared_ptr data, zhongHan2dCeMianParams* _detParams, sx_581_address address) -{ - try - { - - cv::Mat segImage, cutImage, img2D = data->oriImgs[0]; - cv::resize(data->oriImgs[0], segImage, cv::Size(), 0.2, 0.2); - segImage = ~_detParams->seg_JiErDIngWei->Evaluate(segImage); - std::vector> contours; - cv::findContours(segImage, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - if (contours.size() != 0) { - int maxIndex = 0; - double maxArea = cv::contourArea(contours[0]); - for (int i = 0; i < contours.size(); i++) { - double area = cv::contourArea(contours[i]); - if (area > maxArea) { - maxIndex = i; - maxArea = area; - } - } - cv::Rect ROI = cv::boundingRect(contours[maxIndex]); - ROI.x = ROI.x * 5 - 30; - ROI.y = ROI.y * 5 - 30; - ROI.width = ROI.width * 5 + 60; - ROI.height = ROI.height * 5 + 60; - ROI = ROI & (cv::Rect(0, 0, data->oriImgs[0].cols, data->oriImgs[0].rows)); - data->oriImgs[0](ROI).copyTo(cutImage); - } - - cv::Mat Paint; - cutImage.copyTo(Paint); - bool isNG = false; - - std::vector clsImgs; - clsImgs.resize(0); - - //调机时屏蔽,跑料打开 - clsImgs = aiEvaluate(cutImage, Paint, isNG,_detParams); - TextRendererZH textPainter(Paint.cols, Paint.rows, 120); - - if (isNG == true) { - textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - } - else { - textPainter.putText(Paint, "OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - } - for (int i = 0; i < clsImgs.size(); i++) { - data->clsOriginImgs.push_back({ std::to_string(i),clsImgs[i] }); - } - data->resultImgs.push_back(Paint); - data->segOriginImgs.push_back(cutImage); - - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address, "ERROR"); - return true; - -} -halconResult halconProcess(cv::Mat img2d, cv::Mat img3d, int cnt, handdleAI::pSegmentation* ptr) -{ - halconResult hResult; - img2d.copyTo(hResult.Paint); - if (hResult.Paint.channels() == 1) - cvtColor(hResult.Paint, hResult.Paint, cv::COLOR_GRAY2BGR); - - try - { - HDevEngineCpp::HDevProcedure proc("FinalWelding_HY_Height"); - HDevProcedureCall procedureCall(proc); - - HObject in_ImageG, in_ImageH, in_ImageSeg; - HTuple in_xResolution(0.0125), in_yResolution(0.0125), in_zResolution(0.0005); - HTuple out_HYNumber, out_HYPointX, out_HYPointY, out_HYHeightValue, out_Flag; - in_ImageG = MatToHObject(img2d); - in_ImageH = MatToHObject(img3d); - hResult.segResult = ptr->Evaluate(img2d); - in_ImageSeg = MatToHObject(hResult.segResult); - procedureCall.SetInputIconicParamObject("in_ImageG", in_ImageG); - procedureCall.SetInputIconicParamObject("in_ImageH", in_ImageH); - procedureCall.SetInputIconicParamObject("in_ImageSeg", in_ImageSeg); - - - procedureCall.SetInputCtrlParamTuple("in_xResolution", in_xResolution); - procedureCall.SetInputCtrlParamTuple("in_yResolution", in_yResolution); - procedureCall.SetInputCtrlParamTuple("in_zResolution", in_zResolution); - procedureCall.Execute();//执行halcon程序 - - out_HYNumber = procedureCall.GetOutputCtrlParamTuple("out_HYNumber");//获取输出控制类变量 - out_HYPointX = procedureCall.GetOutputCtrlParamTuple("out_HYPointX");//获取输出控制类变量 - out_HYPointY = procedureCall.GetOutputCtrlParamTuple("out_HYPointY");//获取输出控制类变量 - out_HYHeightValue = procedureCall.GetOutputCtrlParamTuple("out_HYHeightValue");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出图像类变量 - - int flag = out_Flag.D(); - TextRendererZH textPainter(hResult.Paint.cols, hResult.Paint.rows, 120); - if (flag == 1) - { - hResult.hyCount = (int)out_HYNumber[0].D() + (int)out_HYNumber[1].D(); - textPainter.putText(hResult.Paint, "上焊印数量:" + std::to_string((int)out_HYNumber[0].D()), cv::Point(0, 50), cv::Scalar(0, 255, 0)); - textPainter.putText(hResult.Paint, "下焊印数量:" + std::to_string((int)out_HYNumber[1].D()), cv::Point(0, 150), cv::Scalar(0, 255, 0)); - - hResult.data.topHanYinCount = (int)out_HYNumber[0].D(); - hResult.data.bottomHanYinCount = (int)out_HYNumber[1].D(); - std::vector data; - if (out_HYPointX.Length() == out_HYPointY.Length() && out_HYPointX.Length() == out_HYHeightValue.Length()) - for (int i = 0; i < out_HYPointX.Length(); i++) - { - Cross(hResult.Paint, cv::Point(out_HYPointX[i].D(), out_HYPointY[i].D()), 5, 2, cv::Scalar(0, 255, 0)); - putText(hResult.Paint, - std::to_string(out_HYHeightValue[i].D()), - cv::Point(out_HYPointX[i].D() - 30, out_HYPointY[i].D() - 15), - 1, 1, cv::Scalar(0, 255, 0), 1); - data.push_back(out_HYHeightValue[i].D()); - } - else - textPainter.putText(hResult.Paint, "数量不匹配", cv::Point(0, 250), cv::Scalar(0, 255, 0)); - - double sum = 0.0; - double min_val = std::numeric_limits::infinity(); - double max_val = -std::numeric_limits::infinity(); - - for (double value : data) { - sum += value; - if (value < min_val) { - hResult.data.minHanYinDepth = value; // 更新最小值 - } - if (value > max_val) { - hResult.data.maxHanYinDepth = value; // 更新最大值 - } - } - - // 计算平均值 - hResult.data.avgHanYinDepth = sum / data.size(); - } - else { - textPainter.putText(hResult.Paint, "算法错误", cv::Point(0, 250), cv::Scalar(0, 255, 0)); - hResult.result = false; - } - } - CATCH_EXCEPTIONS - return hResult; -} -bool zhongHan_hanHou3D(std::shared_ptr data, zhongHan3DParams* _detParams, sx_581_address address) -{ - try - { - exceptionResume(data, _detParams, address,"OK"); - return true; - cv::Mat img2D1 = data->oriImgs[0], img3D1 = data->oriImgs[1]; - //ASYNC// - auto furture1 = std::async(std::launch::async, &halconProcess, img2D1, img3D1, 0, _detParams->seg_3dHanYinDingWei); - furture1.wait(); - halconResult result1 = furture1.get(); - data->segOriginImgs.push_back(result1.segResult); - - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//结果反馈 - data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 1) + "_1");//结果反馈 - - //cv::Mat PaintSum(result1.Paint.rows, result1.Paint.cols + result2.Paint.cols, CV_8UC3); - //result1.Paint.copyTo(PaintSum(cv::Rect(0, 0, result1.Paint.cols, result1.Paint.rows))); - //result2.Paint.copyTo(PaintSum(cv::Rect(result1.Paint.cols, 0, result1.Paint.cols, result1.Paint.rows))); - data->resultImgs.push_back(result1.Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - } - CATCH_EXCEPTIONS - exceptionResume(data, _detParams, address,"ERROR"); - return true; - -} - -mission* createMission() { - return new _581_ZhongHan_hanhou(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h b/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h deleted file mode 100644 index a4be55d..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class zhongHan2dCeLiangParams { -public: - handdleAI::pSegmentation* seg_hanHouDingWei = nullptr; - bool isTong = true; -}; -class zhongHan2dCeMianParams { -public: - handdleAI::pSegmentation* seg_JiErDIngWei = nullptr; - handdleAI::pSegmentation* seg_ceMian = nullptr; - handdleAI::pClassification* cls_ceMian = nullptr; - bool isTong = true; -}; -class zhongHan3DParams { -public: - handdleAI::pSegmentation* seg_3dHanYinDingWei = nullptr; - bool isTong = true; -}; - -struct halconResult { - struct halconData { - int topHanYinCount = 0; - int bottomHanYinCount = 0; - double avgHanYinDepth = 0; - double maxHanYinDepth = 0; - double minHanYinDepth = 0; - bool detResultIsOk = true; - }; - cv::Mat Paint; - int hyCount; - cv::Mat segResult; - bool result; - halconData data; -}; - -bool zhongHan_hanHouCeLiang(std::shared_ptr data, zhongHan2dCeLiangParams* _detParams, sx_581_address address); -std::vector aiEvaluate(cv::Mat input, cv::Mat& Paint, bool& isNG, zhongHan2dCeMianParams* _detParams); -bool zhongHan_hanHouCeMian(std::shared_ptr data, zhongHan2dCeMianParams* _detParams, sx_581_address address); -halconResult halconProcess(cv::Mat img2d, cv::Mat img3d, int cnt, handdleAI::pSegmentation* ptr); -bool zhongHan_hanHou3D(std::shared_ptr data, zhongHan3DParams* _detParams, sx_581_address address); - -class _581_ZhongHan_hanhou : public mission { -public: - _581_SX_Single_triggerTemplate< zhongHan2dCeLiangParams> lv_top_1; - _581_SX_Single_triggerTemplate< zhongHan2dCeMianParams> lv_left45_2; - _581_SX_Single_triggerTemplate< zhongHan2dCeMianParams> lv_right45_3; - _581_SX_Single_triggerTemplate< zhongHan3DParams> _3D_1; - - _581_SX_Single_triggerTemplate< zhongHan2dCeLiangParams> tong_top_5; - _581_SX_Single_triggerTemplate< zhongHan2dCeMianParams> tong_left45_6; - _581_SX_Single_triggerTemplate< zhongHan2dCeMianParams> tong_right45_7; - _581_SX_Single_triggerTemplate< zhongHan3DParams> _3D_2; - zhongHan2dCeLiangParams tongZhongHan2dCeLiangParams; - zhongHan2dCeLiangParams lvZhongHan2dCeLiangParams; - std::vector< zhongHan2dCeMianParams> tongZhongHan2dCeMianParams = std::vector< zhongHan2dCeMianParams>(2); - std::vector< zhongHan2dCeMianParams> lvZhongHan2dCeMianParams = std::vector< zhongHan2dCeMianParams>(2); - zhongHan3DParams tongZhongHan3DParams; - zhongHan3DParams lvZhongHan3DParams; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - - if (initOnce == false) { - tongZhongHan2dCeLiangParams.seg_hanHouDingWei = handdleAI::CreateSegObjS("./handleAiModels/seg-hanHouDingWei.BHD", 64, 0); - lvZhongHan2dCeLiangParams.seg_hanHouDingWei = handdleAI::CreateSegObjS("./handleAiModels/seg-hanHouDingWei.BHD", 64, 1); - - tongZhongHan2dCeMianParams[0].seg_JiErDIngWei = handdleAI::CreateSegObjS("./handleAiModels/pSeg_JiErDingWei_45_T_GPU0.BHD", 64, 0); - tongZhongHan2dCeMianParams[0].seg_ceMian = handdleAI::CreateSegObjS("./handleAiModels/seg_ZhongHan_HanHou_45_T_GPU0.BHD", 64, 0); - tongZhongHan2dCeMianParams[0].cls_ceMian = handdleAI::CreateClsObjV3("./handleAiModels/cls_ZhongHan_HanHou_45_T_GPU0.BHD", 0, 1); - - tongZhongHan2dCeMianParams[1].seg_JiErDIngWei = handdleAI::CreateSegObjS("./handleAiModels/pSeg_JiErDingWei_45_T_GPU0.BHD", 64, 0); - tongZhongHan2dCeMianParams[1].seg_ceMian = handdleAI::CreateSegObjS("./handleAiModels/seg_ZhongHan_HanHou_45_T_GPU0.BHD", 64, 0); - tongZhongHan2dCeMianParams[1].cls_ceMian = handdleAI::CreateClsObjV3("./handleAiModels/cls_ZhongHan_HanHou_45_T_GPU0.BHD", 0, 1); - - lvZhongHan2dCeMianParams[0].seg_JiErDIngWei = handdleAI::CreateSegObjS("./handleAiModels/pSeg_JiErDingWei_45_L_GPU1.BHD", 64, 1); - lvZhongHan2dCeMianParams[0].seg_ceMian = handdleAI::CreateSegObjS("./handleAiModels/seg_ZhongHan_HanHou_45_L_GPU1.BHD", 64, 1); - lvZhongHan2dCeMianParams[0].cls_ceMian = handdleAI::CreateClsObjV3("./handleAiModels/cls_ZhongHan_HanHou_45_L_GPU1.BHD", 1, 1); - - lvZhongHan2dCeMianParams[1].seg_JiErDIngWei = handdleAI::CreateSegObjS("./handleAiModels/pSeg_JiErDingWei_45_L_GPU1.BHD", 64, 1); - lvZhongHan2dCeMianParams[1].seg_ceMian = handdleAI::CreateSegObjS("./handleAiModels/seg_ZhongHan_HanHou_45_L_GPU1.BHD", 64, 1); - lvZhongHan2dCeMianParams[1].cls_ceMian = handdleAI::CreateClsObjV3("./handleAiModels/cls_ZhongHan_HanHou_45_L_GPU1.BHD", 1, 1); - - lvZhongHan2dCeLiangParams.isTong = false; - - //tongZhongHan3DParams.seg_3dHanYinDingWei = handdleAI::CreateSegObjS("./handleAiModels/seg-Hanhou3DZhuaQu.BHD", 1, 0); - //lvZhongHan3DParams.seg_3dHanYinDingWei = handdleAI::CreateSegObjS("./handleAiModels/seg-Hanhou3DZhuaQu.BHD", 1, 1); - - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 - lv_top_1.init("Camera1", "焊印检测-内-铜-相机1(90°)", { { 5360, 1,{5340},"5362","5364",5800} }, 1, &tongZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang, "90°存图"); - lv_left45_2.init("Camera2", "翻折撕裂-内-铜-相机2(45°)", { { 5370, 1,{5340},"5372","5374",-1} }, 1, &tongZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian,"45°存图"); - lv_right45_3.init("Camera3", "翻折撕裂-内-铜-相机3(45°)", { { 5380,1,{5340},"5382","5384",5406} }, 1, &tongZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian, "45°存图"); - _3D_1.init("Camera4", "焊后检测-3D相机2(右)" , { { 5400, 1,{5340},"5402","5404",-1} }, 1, &tongZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D,"3D存图"); - - tong_top_5.init("Camera5", "焊印检测-外-铝-相机5(90°)", { { 5440, 1,{5420},"5442","5444",5804} }, 1, &lvZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang, "90°存图"); - tong_left45_6.init("Camera6", "翻折撕裂-外-铝-相机6(45°)", { { 5450,1,{5420},"5452","5454",-1} }, 1, &lvZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian, "45°存图"); - tong_right45_7.init("Camera7", "翻折撕裂-外-铝-相机7(45°)", { { 5460, 1,{5420},"5462","5464",5486} }, 1, &lvZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian, "45°存图"); - _3D_2.init("Camera8", "焊后检测-3D相机1(左)", { { 5480, 1,{5420},"5482","5484",-1} }, 1, &lvZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D, "3D存图"); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanhou/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp b/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp deleted file mode 100644 index 2ffa3c3..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include <581_ZhongHan_hanqian.h> - -mission* createMission() { - return new _581_YuHan_hanqian(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h b/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h deleted file mode 100644 index edd13b0..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanqian/581_ZhongHan_hanqian.h +++ /dev/null @@ -1,376 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -using namespace HDevEngineCpp; -using namespace HalconCpp; -struct hanQianDingWeiSubresult { - double Out_Vale_L_1 = -1;//铝(负)极的包膜距离(mm) - double Out_Vale_L_2 = -1;//铝(负)极连接片中心的和上极耳水平边缘距离(mm) - double Out_Vale_L_3 = -1;//铝(负)极连接片中心的和下极耳水平边缘距离(mm) - double extremum_Value = -1; - - cv::Point circleCenter; - double radius = 1; - std::vector lines; - - bool algoFailed = false; -}; -class zhongHanHanQianParams { -public: - QMutex* mutex = new QMutex(); - QQueue resultQueue; - QQueue mats; - ~zhongHanHanQianParams() { - delete mutex; - } - - int waitMs = 3000; - void insertImg(HObject& input) { - QMutexLocker locker(mutex); - if (mats.size() > 0) { - qWarning() << "焊前定位有遗留的图像,已清除"; - mats.clear(); - } - mats.enqueue(input);//发送检测数据到主线程 - } - bool waitImage(HObject& out) { - int cnt = 0; - while (mats.size() == 0 && cnt < waitMs) { - QThread::msleep(2); - cnt += 2; - } - if (mats.size() != 0) { - QMutexLocker locker(mutex); - out = mats.dequeue(); - return true; - } - return false; - } - void insertResult(hanQianDingWeiSubresult input) { - QMutexLocker locker(mutex); - if (resultQueue.size() > 0) { - qWarning() << "焊前定位有遗留的结果,已清除"; - resultQueue.clear(); - } - resultQueue.enqueue(input);//发送检测数据到主线程 - } - bool waitResult(hanQianDingWeiSubresult& out) { - int cnt = 0; - while (resultQueue.size() == 0 && cnt < waitMs) { - QThread::msleep(2); - cnt += 2; - } - if (resultQueue.size() != 0) { - QMutexLocker locker(mutex); - out = resultQueue.dequeue(); - resultQueue.clear(); - return true; - } - return false; - } -}; - -bool hanQianCeLiang_Main(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address) { - try{ - QByteArray plcResult = "1"; -#if 0 - data->oriImgs[0] = cv::imread("D:\\testImage\\T.bmp", -1); -#endif - double xinBaoJianJuLimitHigh = data->service->_paramSyncManager->get("焊前检测","芯包间距(上限)", 72.00).toDouble(); - double xinBaoJianJuLimitLow = data->service->_paramSyncManager->get("焊前检测", "芯包间距(下限)", 68.00).toDouble(); - bool xinBaoJianJuLimitEnable = data->service->_paramSyncManager->get("焊前检测", "芯包间距判定启用", true).toBool(); - - double xinBaoDingBuDaoYuanXinLimitHigh = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离(上限)", 35.00).toDouble(); - double xinBaoDingBuDaoYuanXinLimitLow = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离(下限)", 33.00).toDouble(); - bool xinBaoDingBuDaoYuanXinLimitEnable = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离判定启用", true).toBool(); - - double lianJiePianJianJuLimitHigh = data->service->_paramSyncManager->get("焊前检测", "连接片间距(上限)", 124.00).toDouble(); - double lianJiePianJianJuLimitLow = data->service->_paramSyncManager->get("焊前检测", "连接片间距(下限)", 122.00).toDouble(); - bool lianJiePianJianJuLimitEnable = data->service->_paramSyncManager->get("焊前检测", "连接片间距判定启用", true).toBool(); - - cv::Mat sourceImg = data->oriImgs[0]; - sourceImg(cv::Rect(2400, 0, 3000, 3648)).copyTo(sourceImg); - data->segOriginImgs.push_back(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - HDevEngineCpp::HDevProcedure proc("_2_Cal_ZH_LJP_Distance"); - HDevProcedureCall procedureCall(proc); - - //vs+halcon联调debug - /*myEngine.StartDebugServer(); - procedureCall.SetWaitForDebugConnection(true);*/ - - HalconCpp::HObject ho_Image_T; - HalconCpp::HObject ho_Image_L; - HalconCpp::HTuple in_Resolution = 0.032594099; - HalconCpp::HTuple in_FilePath = "./halconFiles/ZH_HanYin/"; - HalconCpp::HTuple in_LineType = "602"; - ho_Image_T = MatToHObject(sourceImg); - //等待副线程传入图像 - bool getImgResult = _detParams->waitImage(ho_Image_L); - - procedureCall.SetInputIconicParamObject("in_Image1", ho_Image_T); - procedureCall.SetInputIconicParamObject("in_Image2", ho_Image_L); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.SetInputCtrlParamTuple("in_LineType", in_LineType); - procedureCall.Execute();//执行halcon程序 - - HalconCpp::HTuple out_Distance; - HalconCpp::HTuple out_LinePoint; - HalconCpp::HTuple out_Circle; - HalconCpp::HTuple out_Flag; - HalconCpp::HTuple out_NGTails; - out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量 - out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - out_NGTails = procedureCall.GetOutputCtrlParamTuple("out_NGTails"); - - int flag = out_Flag.D(); - TextRendererZH textPainter(Paint.cols, Paint.rows, 120); - if (flag == 1) - { - double Out_Vale_T_1 = out_Distance[0].D();//铜(负)极的包膜距离(mm) - double Out_Vale_T_2 = out_Distance[1].D();//铜(负)极连接片中心的和上极耳水平边缘距离(mm) - double Out_Vale_T_3 = out_Distance[2].D();//铜(负)极连接片中心的和下极耳水平边缘距离(mm) - - double Out_Vale_L_1 = out_Distance[3].D();//铝(正)极的包膜距离(mm) - double Out_Vale_L_2 = out_Distance[4].D();//铝(正)极连接片中心的和上极耳水平边缘距离(mm) - double Out_Vale_L_3 = out_Distance[5].D();//铝(正)极连接片中心的和下极耳水平边缘距离(mm) - - double extremum_Value = out_Distance[6].D(); - - //发送到另一算法线程 - hanQianDingWeiSubresult _calResult; - _calResult.Out_Vale_L_1 = Out_Vale_L_1; - _calResult.Out_Vale_L_2 = Out_Vale_L_2; - _calResult.Out_Vale_L_3 = Out_Vale_L_3; - _calResult.extremum_Value = extremum_Value; - if (out_Circle.Length() > 4) { - _calResult.circleCenter = cv::Point(out_Circle[4].D(), out_Circle[3].D()); - _calResult.radius = out_Circle[5].D(); - } - - if (out_LinePoint.Length() > 38) { - for (int i = 20; i < 40; i++) { - _calResult.lines.push_back(out_LinePoint[i].D()); - } - } - - _detParams->insertResult(_calResult); - if (Out_Vale_T_1 > xinBaoJianJuLimitHigh || Out_Vale_T_1 < xinBaoJianJuLimitLow) { - - textPainter.putText(Paint, "铜(负)极的包膜距离:" + std::to_string(Out_Vale_T_1), cv::Point(50, 50), cv::Scalar(0, 0, 255)); - if (xinBaoJianJuLimitEnable == true) - plcResult = "2"; - } - else - textPainter.putText(Paint, "铜(负)极的包膜距离:" + std::to_string(Out_Vale_T_1), cv::Point(50, 50), cv::Scalar(0, 255, 0)); - - textPainter.putText(Paint, "铜(负)极连接片中心的和上极耳水平边缘距离:" + std::to_string(Out_Vale_T_2), cv::Point(50, 200), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "铜(负)极连接片中心的和下极耳水平边缘距离:" + std::to_string(Out_Vale_T_3), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - - if (extremum_Value > lianJiePianJianJuLimitHigh || extremum_Value < lianJiePianJianJuLimitLow) { - textPainter.putText(Paint, "铜(负)极和铝(正)极的中心距离:" + std::to_string(extremum_Value), cv::Point(50, 600), cv::Scalar(0, 0, 255)); - if (lianJiePianJianJuLimitEnable == true) - plcResult = "2"; - } - else - textPainter.putText(Paint, "铜(负)极和铝(正)极的中心距离:" + std::to_string(extremum_Value), cv::Point(50, 600), cv::Scalar(0, 255, 0)); - - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(Out_Vale_T_1));//数据1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(extremum_Value));//数据2 - for (int i = 0; i < 5; i++){ - cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 10, cv::LINE_4); - } - - if (out_Circle.Length() > 2){ - 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); - } - } - else{ - std::string errTails = out_NGTails.S().Text(); - hanQianDingWeiSubresult _calResult; - _calResult.algoFailed = true; - _detParams->insertResult(_calResult); - textPainter.putText(Paint, "NG" + errTails, cv::Point(0, 50), cv::Scalar(0, 255, 0)); - data->halconOK = false; - } - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) - plcResult = "1";//强制OK - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - return true; -} -bool hanQianCeLiang_Sub(std::shared_ptr data, zhongHanHanQianParams* _detParams, sx_581_address address) { - try { - //测试算法用 - QByteArray plcResult = "1"; - { -#if 0 - data->oriImgs[0] = cv::imread("D:\\testImage\\L.bmp", -1); -#endif - } - double xinBaoJianJuLimitHigh = data->service->_paramSyncManager->get("焊前检测", "芯包间距(上限)", 72.00).toDouble(); - double xinBaoJianJuLimitLow = data->service->_paramSyncManager->get("焊前检测", "芯包间距(下限)", 68.00).toDouble(); - bool xinBaoJianJuLimitEnable = data->service->_paramSyncManager->get("焊前检测", "芯包间距判定启用", true).toBool(); - - double xinBaoDingBuDaoYuanXinLimitHigh = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离(上限)", 35.00).toDouble(); - double xinBaoDingBuDaoYuanXinLimitLow = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离(下限)", 33.00).toDouble(); - bool xinBaoDingBuDaoYuanXinLimitEnable = data->service->_paramSyncManager->get("焊前检测", "芯包顶部到圆心距离判定启用", true).toBool(); - - double lianJiePianJianJuLimitHigh = data->service->_paramSyncManager->get("焊前检测", "连接片间距(上限)", 124.00).toDouble(); - double lianJiePianJianJuLimitLow = data->service->_paramSyncManager->get("焊前检测", "连接片间距(下限)", 122.00).toDouble(); - bool lianJiePianJianJuLimitEnable = data->service->_paramSyncManager->get("焊前检测", "连接片间距判定启用", true).toBool(); - - cv::Mat sourceImg = data->oriImgs[0]; - sourceImg(cv::Rect(0, 0, 3000, 3648)).copyTo(sourceImg); - data->segOriginImgs.push_back(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - HObject image = MatToHObject(sourceImg); - //发送图片 - _detParams->insertImg(image); - - TextRendererZH textPainter(Paint.cols, Paint.rows, 120); - //等待结果 - hanQianDingWeiSubresult _calResult; - bool waitResultResult = _detParams->waitResult(_calResult); - - if (waitResultResult == false) { - data->halconOK = false; - textPainter.putText(Paint, "NG:TimeOut", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - plcResult = "2"; - data->resultImgs.push_back(Paint); - return false; - } - - if (_calResult.algoFailed == false) { - if (_calResult.Out_Vale_L_1 > xinBaoJianJuLimitHigh || _calResult.Out_Vale_L_1 < xinBaoJianJuLimitLow) { - - textPainter.putText(Paint, "铝(正)包膜距离:" + std::to_string(_calResult.Out_Vale_L_1), cv::Point(50, 50), cv::Scalar(0, 0, 255)); - if (xinBaoJianJuLimitEnable == true) - plcResult = "2"; - } - else - textPainter.putText(Paint, "铝(正)包膜距离:" + std::to_string(_calResult.Out_Vale_L_1), cv::Point(50, 50), cv::Scalar(0, 255, 0)); - - textPainter.putText(Paint, "铝(正)极连接片中心的和上极耳水平边缘距离:" + std::to_string(_calResult.Out_Vale_L_2), cv::Point(50, 200), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "铝(正)极连接片中心的和下极耳水平边缘距离:" + std::to_string(_calResult.Out_Vale_L_3), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - - if (_calResult.extremum_Value > lianJiePianJianJuLimitHigh || _calResult.extremum_Value < lianJiePianJianJuLimitLow) { - textPainter.putText(Paint, "铜(负)极和铝(正)极的中心距离:" + std::to_string(_calResult.extremum_Value), cv::Point(50, 600), cv::Scalar(0, 0, 255)); - if (lianJiePianJianJuLimitEnable == true) - plcResult = "2"; - } - else - textPainter.putText(Paint, "铜(负)极和铝(正)极的中心距离:" + std::to_string(_calResult.extremum_Value), cv::Point(50, 600), cv::Scalar(0, 255, 0)); - - - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(_calResult.Out_Vale_L_1));//数据1 - data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(_calResult.extremum_Value));//数据2 - for (int i = 0; i < 5; i++) { - cv::line(Paint, cv::Point(_calResult.lines[i * 4 + 1], _calResult.lines[i * 4]), - cv::Point(_calResult.lines[i * 4 + 3], _calResult.lines[i * 4 + 2]), - cv::Scalar(0, 255, 0), 10, cv::LINE_4); - } - cv::drawMarker(Paint, cv::Point(_calResult.circleCenter.x, _calResult.circleCenter.y), cv::Scalar(0, 255, 0), cv::MARKER_CROSS, 200, 5); - cv::circle(Paint, cv::Point(_calResult.circleCenter.x, _calResult.circleCenter.y), _calResult.radius, cv::Scalar(0, 255, 0), 5); - } - else { - data->halconOK = false; - textPainter.putText(Paint, "NG:algoError", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - plcResult = "2"; - } - - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) - plcResult = "1";//强制OK - - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - else - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 - return true; -} - -class _581_YuHan_hanqian : public mission { -public: - _581_SX_Single_triggerTemplate tong_1; - _581_SX_Single_triggerTemplate lv_1; - - zhongHanHanQianParams detParams; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); - - if (initOnce == false) { - - initOnce = true; - } - } - bool initCustom() { -#pragma region 注册触发器回调 - tong_1.init("Camera1", "焊前定位-相机1", { { 5060, 1,{5100,5070},"5062","5064",5066} }, 1, &detParams, _serviceManager, bridge, hanQianCeLiang_Main); - lv_1.init("Camera2", "焊前定位-相机2", { { 5090, 1,{5100,5070},"5092","5094",5096} }, 1, &detParams, _serviceManager, bridge, hanQianCeLiang_Sub); -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_hanqian/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp deleted file mode 100644 index 0bb7a9a..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.cpp +++ /dev/null @@ -1,247 +0,0 @@ -#include <581_ZhongHan_silie_jixing.h> - -void aiEvaluate(cv::Mat input, handdleAI::pSegmentation* seg, handdleAI::pClassification* cls,cv::Mat& Paint, bool& isNG){ - cv::Mat forSeg; - input.copyTo(forSeg); - //cv::resize(forSeg, forSeg, cv::Size(), 0.25, 0.25); - cv::Mat segRes; - if (seg != nullptr) - { - segRes = ~seg->Evaluate(forSeg); - cv::resize(segRes, segRes, cv::Size(), 4, 4); - std::vector>contours; - cv::findContours(segRes, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - int cnt = 0; - for (auto& contour : contours) { - cv::Rect rect = cv::boundingRect(contour); - if (rect.width < 250 || rect.height < 250) - continue; - cv::Mat clsImg = cutImg2Cls(rect, input); - cnt++; - int claResult = cls->Evaluate(clsImg); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - switch (claResult) - { - case 0://OK - cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3); - break; - case 1://NG - cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); - textPainter.putText(Paint,"NG",cv::Point(rect.x, rect.y), cv::Scalar(0, 0, 255)); - isNG = true; - break; - } - } - } - else { - isNG = false; - } - -} -bool lieHenJianCe90(std::shared_ptr data, LieHenJianCeParams* _detParams, sx_581_address address){ - try { - { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - } - cv::Mat sourceImage; - data->oriImgs[0].copyTo(sourceImage); - cv::Mat imgPaint; - sourceImage.copyTo(imgPaint); - bool isNG_1 = false; - bool isNG_2 = false; - QByteArray plcResult = "1"; - //检测 - cv::Rect cutROI_1; - cv::Rect cutROI_2; - if (_detParams->isTong == true) {//铜 - cutROI_1 = cv::Rect(2800, 700, 1400, 700) & cv::Rect(0, 0, sourceImage.cols, sourceImage.rows); - cutROI_2 = cv::Rect(2800, 2330, 1400, 700) & cv::Rect(0, 0, sourceImage.cols, sourceImage.rows); - } - else {//铝 - cutROI_1 = cv::Rect(1280, 730, 1400, 700) & cv::Rect(0, 0, sourceImage.cols, sourceImage.rows); - cutROI_2 = cv::Rect(1280, 2240, 1400, 700) & cv::Rect(0, 0, sourceImage.cols, sourceImage.rows); - } - aiEvaluate(data->oriImgs[0](cutROI_1), _detParams->seg_diBu, _detParams->cls_diBu, imgPaint(cutROI_1), isNG_1); - aiEvaluate(data->oriImgs[0](cutROI_2), _detParams->seg_diBu, _detParams->cls_diBu, imgPaint(cutROI_2), isNG_2); - QString okNgSaveText = "OK"; - TextRendererZH textPainter(imgPaint.cols, imgPaint.rows, 300); - if (isNG_1 == true || isNG_2 == true) { - textPainter.putText(imgPaint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - okNgSaveText = "NG"; - plcResult = "2"; - } - else { - textPainter.putText(imgPaint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - data->resultImgs.push_back(imgPaint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - - -} - -bool lieHenJianCe45(std::shared_ptr data, LieHenJianCeParams* _detParams, sx_581_address address) { - try - { - cv::Mat sourceImg; - cv::Rect cutROI; - cutROI = cv::Rect(1600, 900, 2200, 1400) & cv::Rect(0, 0, data->oriImgs[0].cols, data->oriImgs[0].rows); - data->oriImgs[0](cutROI).copyTo(sourceImg); - cv::Mat Paint; - sourceImg.copyTo(Paint); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - bool isNG = false; - QByteArray plcResult = "1"; - textPainter.putText(Paint, "OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - //cv::rectangle(Paint, cutROI, cv::Scalar(0, 255, 0), 5); - data->resultImgs.push_back(Paint); - - sourceImg.release(); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - -} - - -bool jiXingJianCe(std::shared_ptr data, JiXingJianCeParams* _detParams, sx_581_address address){ - try - { - /*if (indexTest < 17) - img2D = cv::imread("./testImages/" + std::to_string(indexTest++) + ".bmp", -1);*/ - - //存图数据加保存队列,加锁,避免数据访问冲突 - //cv::Rect cutRect(0, 0, img2D.cols, img2D.rows);//裁剪出有效区域 - //cutRect = cutRect & cv::Rect(0, 0, img2D.cols, img2D.rows); - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - - HDevEngineCpp::HDevProcedure proc("_2_JX_Inspection"); - HDevProcedureCall procedureCall(proc); - - cv::Mat Paint; - sourceImg.copyTo(Paint); - //极性检测 - HObject in_Image; - HTuple in_FilePath = "./halconFiles/"; - HTuple in_LineType = "602"; - in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图像类变量 - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.SetInputCtrlParamTuple("in_LineType", in_LineType); - procedureCall.Execute();//执行halcon程序 - HTuple out_ColorType; - HTuple out_Flag; - HTuple out_InspectionPosition; - HTuple out_NgTails; - out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出图像类变量 - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 - out_InspectionPosition = procedureCall.GetOutputCtrlParamTuple("out_InspectionPosition"); - out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails"); - //相机2 OK为铜 NG为铝 - QByteArray algoResult = "2"; - QString okNgSaveText = "NG"; - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (out_Flag.D() == 1) - { - if (out_InspectionPosition.Length() > 3) { - for (int i = 0; i < out_InspectionPosition.Length() / 4; i++) { - cv::Rect rect = cv::Rect(out_InspectionPosition[i * 4 + 0], \ - out_InspectionPosition[i * 4 + 1], \ - out_InspectionPosition[i * 4 + 2], \ - out_InspectionPosition[i * 4 + 3]); - cv::rectangle(Paint, rect, cv::Scalar(0, 255, 255), 2); - } - } - - std::string jx_Type = out_ColorType.S().Text(); - if (jx_Type == "LV") { - //铝 - cv::putText(Paint, "NG", cv::Point(0, 500), 2, 10, cv::Scalar(0, 0, 255), 5); - } - else if (jx_Type == "CU") { - //铜 - textPainter.putText(Paint, "铜极", cv::Point(0, 0), cv::Scalar(0, 255, 0)); - cv::putText(Paint, "OK", cv::Point(0, 500), 2, 10, cv::Scalar(0, 255, 0), 5); - algoResult = "1"; - okNgSaveText = "OK"; - } - else { - textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - } - } - else { - std::string temp_NGTails = out_NgTails.S().Text(); - textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - textPainter.putText(Paint, temp_NGTails.c_str(), cv::Point(0, 350), cv::Scalar(0, 255, 0)); - - } - - algoResult = "1"; - sourceImg.release(); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + algoResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 - return true; - - -} - - -mission* createMission() { - return new _581_ZhongHan_silie_jixing(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h deleted file mode 100644 index a438497..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_silie_jixing/581_ZhongHan_silie_jixing.h +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class LieHenJianCeParams { -public: - handdleAI::pSegmentation* seg_diBu = nullptr; - handdleAI::pClassification* cls_diBu = nullptr; - bool isTong = false; -}; - -class JiXingJianCeParams { -public: - -}; - -void aiEvaluate(cv::Mat input, handdleAI::pSegmentation* seg, handdleAI::pClassification* cls, cv::Mat& Paint, bool& isNG); -bool lieHenJianCe90(std::shared_ptr data, LieHenJianCeParams* _detParams, sx_581_address address); - -bool lieHenJianCe45(std::shared_ptr data, LieHenJianCeParams* _detParams, sx_581_address address); - -bool jiXingJianCe(std::shared_ptr data, JiXingJianCeParams* _detParams, sx_581_address address); - - - - -class _581_ZhongHan_silie_jixing : public mission { -public: - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_tong_1; - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_tong_2; - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_tong_3; - - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_lv_4; - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_lv_5; - _581_SX_Single_triggerTemplate< LieHenJianCeParams> liehen_lv_6; - - _581_SX_Single_triggerTemplate< JiXingJianCeParams> jixing_cu; - - JiXingJianCeParams tongJiXingParams; - LieHenJianCeParams tong90Params; - LieHenJianCeParams lv90Params; - - LieHenJianCeParams tong45Params; - LieHenJianCeParams lv45Params; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - initOnce = true; - - //tong90Params.seg_diBu = handdleAI::CreateSegObjS("./handleaiModels/seg-zhongHanHanHouDiBu.BHD", 1, 0); - //tong90Params.cls_diBu = handdleAI::CreateClsObjV3("./handleaiModels/cls-zhongHanHanHouDiBu.BHD", 0, 1); - - //lv90Params.seg_diBu = handdleAI::CreateSegObjS("./handleaiModels/seg-zhongHanHanHouDiBu.BHD", 1, 1); - //lv90Params.cls_diBu = handdleAI::CreateClsObjV3("./handleaiModels/cls-zhongHanHanHouDiBu.BHD", 1, 1); - lv90Params.isTong == false; - } - bool initCustom() { -#pragma region 注册触发器回调 - liehen_tong_1.init("Camera1", "裂痕检测-铜-相机1", { { 5280, 1,{5160},"5282","5284",-1} }, 1, &tong90Params, _serviceManager, bridge, lieHenJianCe90, "CCD裂痕检测"); - liehen_tong_2.init("Camera2", "裂痕检测-铜-相机2", { { 5290, 1,{5160},"5292","5294",-1} }, 1, &tong45Params, _serviceManager, bridge, lieHenJianCe45, "CCD裂痕检测"); - liehen_tong_3.init("Camera3", "裂痕检测-铜-相机3", { { 5300, 1,{5160},"5302","5304",-1} }, 1, &tong45Params, _serviceManager, bridge, lieHenJianCe45, "CCD裂痕检测"); - - liehen_lv_4.init("Camera4", "裂痕检测-铝-相机4", { { 5310, 1,{5180},"5312","5314",-1} }, 1, &lv90Params, _serviceManager, bridge, lieHenJianCe90, "CCD裂痕检测"); - liehen_lv_5.init("Camera5", "裂痕检测-铝-相机5", { { 5320, 1,{5180},"5322","5324",-1} }, 1, &lv45Params, _serviceManager, bridge, lieHenJianCe45, "CCD裂痕检测"); - liehen_lv_6.init("Camera6", "裂痕检测-铝-相机6", { { 5330, 1,{5180},"5332","5334",-1} }, 1, &lv45Params, _serviceManager, bridge, lieHenJianCe45, "CCD裂痕检测"); - - jixing_cu.init("Camera7", "极性检测-相机1", { { 5000, 1,{5010},"5002","5004",-1} }, 1, &tongJiXingParams, _serviceManager, bridge, jiXingJianCe, "CCD极性检测"); - -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_silie_jixing/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp deleted file mode 100644 index f5256ce..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include <581_ZhongHan_tiejiao_dingbu.h> -#include -#include -#include -#include - -bool TieJiaoZhengMian90(std::shared_ptr data, ZhongHanTieJiaoParams* _detParams, sx_581_address address) { - try - { -#if 0 - /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓调机用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ - plcResult = "1"; - QString resultTag = "OK"; - cv::Mat resultImage = img2D.clone(); - textPainter.putText(resultImage, byteArrayToUnicode("OK").toStdString().c_str(), cv::Point(0, 50), cv::Scalar(0, 255, 0), 500); - cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); - resMat.push_back(resultImage); - addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, resultTag));//保存结果图 - return true; - /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑调机用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ -#else - - /*if (in_Product_Str == "Cu") { - img2D = cv::imread("./testImages/Cu.png", -1); - } - else { - img2D = cv::imread("./testImages/Al.png", -1); - }*/ - - //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - if (_detParams->in_Product_Str == "Cu") { - cv::rotate(sourceImg, sourceImg, cv::ROTATE_180);//为保证算法一致, - } - cv::Mat Paint; - sourceImg.copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - - HDevEngineCpp::HDevProcedure proc("_3_Pos_CoverGlue_Inspection"); - HDevEngineCpp::HDevProcedureCall procedureCall(proc); - - //vs+halcon联调debug - /*myEngine.StartDebugServer(); - procedureCall.SetWaitForDebugConnection(true);*/ - - HalconCpp::HObject in_Image;//原始三通道图像 - HalconCpp::HTuple in_Product = HalconCpp::HTuple((char*)(_detParams->in_Product_Str).c_str());//产品类别, 'Gu':铜 'Al':铝 - HalconCpp::HTuple in_LineType = "602";//线体类别 - HalconCpp::HTuple in_Resolution(0.0208127);//相机精度(mm/pix) - HalconCpp::HTuple in_FilePath("./halconFiles/ZH_TieJiao_Up/");//模板文件路径 - - in_Image = MatToHObject(sourceImg); - procedureCall.SetInputIconicParamObject("in_Image", in_Image); - procedureCall.SetInputCtrlParamTuple("in_Product", in_Product); - procedureCall.SetInputCtrlParamTuple("in_LineType", in_LineType); - procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); - procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); - procedureCall.Execute();//执行halcon程序 - - HalconCpp::HTuple out_Circle;//焊印圆中心坐标(y,x,R) - HalconCpp::HTuple out_LinePoint;//线的坐标(y1,x1,y2,x2) - HalconCpp::HTuple out_Rectangle;//矩形框,共计两个(y,x,phi,width,height) - HalconCpp::HTuple out_NGTails;//NG的明细 - HalconCpp::HTuple out_Flag;//算法的执行结果, 0: 算法检测NG 1: 算法执行成功 - out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle"); - out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint"); - out_Rectangle = procedureCall.GetOutputCtrlParamTuple("out_Rectangle"); - out_NGTails = procedureCall.GetOutputCtrlParamTuple("out_NGTails"); - out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); - TextRendererZH textPainter(Paint.cols, Paint.rows, 300); - if (out_Flag.D() == 1) { - //画圆心十字 - 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); - - //画线 - if (out_LinePoint.Length() > 3) { - for (int i = 0; i < out_LinePoint.Length() / 4; i++) { - cv::line(Paint, - cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4 + 0].D()), - cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()), - cv::Scalar(0, 255, 0), 5); - } - } - - //画矩形 - if (out_Rectangle.Length() > 4) { - for (int j = 0; j < out_Rectangle.Length() / 5; j++) { - cv::RotatedRect rRect; - rRect.center.y = out_Rectangle[j * 5 + 0].D(); - rRect.center.x = out_Rectangle[j * 5 + 1].D(); - rRect.angle = out_Rectangle[j * 5 + 2].D(); - rRect.size.width = out_Rectangle[j * 5 + 3].D(); - rRect.size.height = out_Rectangle[j * 5 + 4].D(); - - DrawRotatedRect2Mat(Paint, rRect, cv::Scalar(0, 255, 0), 3, cv::LINE_4); - } - } - } - else { - std::string NgTails = out_NGTails.S().Text();//NG明细 - textPainter.putText(Paint, NgTails, cv::Point(0, 600), cv::Scalar(0, 255, 0)); - } - - if (out_Flag.D() == 1) { - textPainter.putText(Paint, "OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); - plcResult = "1"; - } - else { - textPainter.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->halconOK = false; - } - plcResult = "1"; - data->resultImgs.push_back(Paint); - - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - sourceImg.release(); - return true; -#endif - } - CATCH_EXCEPTIONS - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - if (Paint.channels() == 1) - cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - TextRendererZH textPainter(Paint.cols, Paint.rows, 15); - QByteArray plcResult = "2"; - textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - - cv::Mat sourceImg; - data->oriImgs[0].copyTo(sourceImg); - if (_detParams->in_Product_Str == "Cu") { - cv::rotate(sourceImg, sourceImg, cv::ROTATE_180);//为保证算法一致, - } - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -} - -bool TieJiaoZhengMian45(std::shared_ptr data, ZhongHanTieJiaoParams* _detParams, sx_581_address address) { - try - { - cv::Mat Paint; - data->oriImgs[0].copyTo(Paint); - bool isNG = false; - QByteArray plcResult = "1"; - TextRendererZH textainter(Paint.cols, Paint.rows, 300); - if (isNG == true) - { - plcResult = "2"; - textainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - } - else { - textainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - } - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);//结果图缩放 - data->resultImgs.push_back(Paint); - - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; - } - CATCH_EXCEPTIONS - - qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); - cv::Mat Paint; - Paint.copyTo(data->oriImgs[0]); - if (Paint.channels() == 1) { - cv::cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); - } - QByteArray plcResult = "2"; - TextRendererZH textainter(Paint.cols, Paint.rows, 300); - textainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); - data->resultImgs.push_back(Paint); - plcResult = "1"; - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 - return true; -} - - -void DrawRotatedRect2Mat(cv::Mat& img, cv::RotatedRect rotateRect, cv::Scalar color, int thickness, int linType) -{ - std::vector boxPts(4); - rotateRect.points(boxPts.data()); - for (int mm = 0; mm < 4; mm++) { - cv::line(img, boxPts[mm], boxPts[(mm + 1) % 4], color, thickness, linType); - } -} - - - - - - - - - - - -mission* createMission() { - return new _581_ZhongHan_tiejiao_dingbu(); -} -void destroyMission(mission* _mission) { - delete _mission; -} \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h deleted file mode 100644 index 3117c34..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/581_ZhongHan_tiejiao_dingbu.h +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#pragma region 算法 -#include -#include -#include -using namespace HDevEngineCpp; -#pragma endregion -class ZhongHanTieJiaoParams { -public: - std::string in_Product_Str = ""; -}; - - - -void DrawRotatedRect2Mat(cv::Mat& img, cv::RotatedRect rotateRect, cv::Scalar color, int thickness, int linType); -bool TieJiaoZhengMian90(std::shared_ptr data, ZhongHanTieJiaoParams* _detParams, sx_581_address address); -bool TieJiaoZhengMian45(std::shared_ptr data, ZhongHanTieJiaoParams* _detParams, sx_581_address address); - -class _581_ZhongHan_tiejiao_dingbu : public mission { -public: - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> in_tong_90_1; - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> in_tong_45_2; - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> in_tong_45_3; - - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> out_tong_90_4; - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> out_tong_45_5; - _581_SX_Single_triggerTemplate< ZhongHanTieJiaoParams> out_tong_45_6; - - ZhongHanTieJiaoParams tongParams; - ZhongHanTieJiaoParams lvParams; - bool initOnce = false; - void onConfigReloaded() { - HDevEngineCpp::HDevEngine myEngine; - myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); - initOnce = true; - - tongParams.in_Product_Str = "Cu"; - lvParams.in_Product_Str = "Al"; - } - bool initCustom() { -#pragma region 注册触发器回调 - in_tong_90_1.init("Camera1", "贴胶检测-内-铜-相机1(90°)", { { 5200, 1,{5120},"5202","5204",-1} }, 1, &tongParams, _serviceManager, bridge, TieJiaoZhengMian90); - in_tong_45_2.init("Camera2", "贴胶检测-内-铜-相机2(45°)", { { 5210, 1,{5120},"5212","5214",-1} }, 1, &tongParams, _serviceManager, bridge, TieJiaoZhengMian45); - in_tong_45_3.init("Camera3", "贴胶检测-内-铜-相机3(45°)", { { 5220, 1,{5120},"5222","5224",-1} }, 1, &tongParams, _serviceManager, bridge, TieJiaoZhengMian45); - - out_tong_90_4.init("Camera4", "贴胶检测-外-铝-相机4(90°)", { { 5230, 1,{5140},"5232","5234",-1} }, 1, &lvParams, _serviceManager, bridge, TieJiaoZhengMian90); - out_tong_45_5.init("Camera5", "贴胶检测-外-铝-相机5(45°)", { { 5240, 1,{5140},"5242","5244",-1} }, 1, &lvParams, _serviceManager, bridge, TieJiaoZhengMian45); - out_tong_45_6.init("Camera6", "贴胶检测-外-铝-相机6(45°)", { { 5250, 1,{5140},"5252","5254",-1} }, 1, &lvParams, _serviceManager, bridge, TieJiaoZhengMian45); - -#pragma endregion - return true; - } -}; - - - - - -#pragma once \ No newline at end of file diff --git a/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt b/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt deleted file mode 100644 index 76e9200..0000000 --- a/src/mission/ZhongHan/581_ZhongHan_tiejiao_dingbu/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# 获取获取当前目录名 -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 OFF) -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/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 - ) - - -# 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/ZhongHan/CMakeLists.txt b/src/mission/ZhongHan/CMakeLists.txt deleted file mode 100644 index f9a95fd..0000000 --- a/src/mission/ZhongHan/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# 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_CameraModule_3DKeyence/Hd_CameraModule_3DKeyence.cpp b/subModule/Hd_CameraModule_3DKeyence/Hd_CameraModule_3DKeyence.cpp index e9c40a5..01b58e9 100644 --- a/subModule/Hd_CameraModule_3DKeyence/Hd_CameraModule_3DKeyence.cpp +++ b/subModule/Hd_CameraModule_3DKeyence/Hd_CameraModule_3DKeyence.cpp @@ -19,7 +19,7 @@ int imgIndex = 0; int getImageTimeOut = 3000; QString lastError; QMutex* m_mutex = nullptr; -std::mutex bufferMutex; +QMutex* bufferMutex = nullptr; QQueue< cv::Mat> heightMatS;//高度图 QQueue luminanceMatS;//灰度图 //data == "rest_newProductIn"时要结束run;机台报警,取图超时,复位后重新拍的情况。 @@ -58,7 +58,7 @@ void myCallbackFunc(LJX8IF_PROFILE_HEADER* pProfileHeaderArray, WORD* pHeightPro { return; }*/ - std::lock_guard lock(bufferMutex); + QMutexLocker lock(bufferMutex); if (dwCount == 0) { return; @@ -202,6 +202,7 @@ void destory(Hd_CameraModule_3DKeyence * ptr) Hd_CameraModule_3DKeyence::Hd_CameraModule_3DKeyence() { m_mutex = new QMutex; + bufferMutex = new QMutex; } @@ -267,6 +268,11 @@ Hd_CameraModule_3DKeyence::~Hd_CameraModule_3DKeyence() delete m_mutex; m_mutex = nullptr; } + if (bufferMutex) + { + delete bufferMutex; + bufferMutex = nullptr; + } qDebug() << __FUNCTION__ << "line:" << __LINE__ << " delete success!"; } @@ -423,7 +429,7 @@ bool Hd_CameraModule_3DKeyence::initParas(QByteArray& initData) // Initialize if (!InitHighSpeed()){ qDebug() << __FUNCTION__ << " line:" << __LINE__ << " InitHighSpeed error! " ; - lastError = "初始化高速通讯失败!"; + lastError = "InitHighSpeed ERROR"; return false; } return true; @@ -471,6 +477,8 @@ bool Hd_CameraModule_3DKeyence::InitHighSpeed() } + + bool Hd_CameraModule_3DKeyence::run() { @@ -488,23 +496,22 @@ bool Hd_CameraModule_3DKeyence::run() while (imgTakeNum != imgTarget) { int sleepMs = 10; - int cnt = 0; int timeoutCnt = getImageTimeOut / sleepMs; - while (_imageAvailable[deviceId] != 1 ) + int cnt = 0; + while (_imageAvailable[deviceId] != 1 && cnt++ < timeoutCnt) { - QThread::msleep(10); - if (cnt++ >= timeoutCnt) - { - heightMatS.push_back(cv::Mat(1000, 1000, CV_8UC1, cv::Scalar(0))); - luminanceMatS.push_back(cv::Mat(1000, 1000, CV_8UC1, cv::Scalar(0))); - imgTakeNum++; - qDebug() << "imgGetERROR insert blank img cameraID:" << camera_name; - continue; - } + QThread::msleep(sleepMs); + } + if (cnt >= timeoutCnt) + { + heightMatS.push_back(cv::Mat(1000, 1000, CV_8UC1, cv::Scalar(0))); + luminanceMatS.push_back(cv::Mat(1000, 1000, CV_8UC1, cv::Scalar(0))); + imgTakeNum++; + qDebug() << "insertBlack:" << camera_name; + continue; } - - std::lock_guard lock(bufferMutex); + QMutexLocker lock(bufferMutex); _getParam[deviceId].luminance_enabled = profileInfo_ptr->byLuminanceOutput; _getParam[deviceId].x_pointnum = profileInfo_ptr->wProfileDataCount; _getParam[deviceId].y_linenum_acquired = _lastImageSizeHeight[deviceId];