From a20069eac588750dbf79b29ee3f5f3cf42dbd2c0 Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Thu, 20 Nov 2025 00:36:11 +0800 Subject: [PATCH] =?UTF-8?q?V20251119-2.2.5=20=E4=BF=AE=E5=A4=8D=E4=B8=89?= =?UTF-8?q?=E5=8D=8Fobjectname=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=20=E5=AD=98=E5=9B=BE=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=A2=9E=E5=8A=A0try=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/global.h | 2 +- include/sxGlobal.h | 1 - src/core/service/imgSaveThreadManager.h | 66 ++++--- .../581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp | 172 +++++++++++------- .../581-BaoMo-Cam1234/581-BaoMo-Cam1234.h | 7 +- 5 files changed, 146 insertions(+), 102 deletions(-) diff --git a/include/global.h b/include/global.h index 67f0da2..494593e 100644 --- a/include/global.h +++ b/include/global.h @@ -11,7 +11,7 @@ #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251119-2.2.4"; +const std::string softwareVersion = "20251119-2.2.5"; const std::string euiJsonVersion = "1.0.6"; #define globalDatabasePth "./sqlDatabase/eui_db.db" //全局数据库路径 #define saveImgEnable 1 diff --git a/include/sxGlobal.h b/include/sxGlobal.h index 27ccc88..624cd3f 100644 --- a/include/sxGlobal.h +++ b/include/sxGlobal.h @@ -148,7 +148,6 @@ public: camera->clearCache();//清除缓存 std::shared_ptr data = _serviceManager->_detDataManager->createDetData( QString::fromStdString(cameraName), sn, oneTriggerCaptrueTimes, camera->config.oriSaveFormat);//创建数据包 - QString saveObjectName = ""; data->saveObjectName = saveObjectName; camera->captureImage(data);//拍照 generalDet->ansyncProcess(data, address[batteryOffset], ("D" + address[0].completeAddr + "_1"));//处理算法 并在取到图片后发送完成信号 diff --git a/src/core/service/imgSaveThreadManager.h b/src/core/service/imgSaveThreadManager.h index 4265c82..573e747 100644 --- a/src/core/service/imgSaveThreadManager.h +++ b/src/core/service/imgSaveThreadManager.h @@ -192,38 +192,48 @@ public: QQueue< std::shared_ptr>defaultQueue; int imgRemainCount = 0; void run() { - - while (true) { - QQueue> localQueue; - std::shared_ptr job = nullptr; - // 优先处理 priorityQueue - { - QMutexLocker locker(&mutex); - if (!priorityQueue.isEmpty()) { - job = priorityQueue.dequeue(); + try { + while (true) { + QQueue> localQueue; + std::shared_ptr job = nullptr; + // 优先处理 priorityQueue + { + QMutexLocker locker(&mutex); + if (!priorityQueue.isEmpty()) { + job = priorityQueue.dequeue(); + } + else if (!defaultQueue.isEmpty()) { + job = defaultQueue.dequeue(); + } } - else if (!defaultQueue.isEmpty()) { - job = defaultQueue.dequeue(); + + // 没有任务就跳出 + if (job == nullptr) { + break; } - } - // 没有任务就跳出 - if (job == nullptr) { - break; - } - - qDebug() << "saveJob start" << QString::fromStdString(job->jobName) << "remain" << imgRemainCount; - imgRemainCount -= job->imgQueue.size(); - localQueue.swap(job->imgQueue); - // 批量保存 - while (!localQueue.isEmpty()) { - auto data = std::move(localQueue.dequeue()); + qDebug() << "saveJob start" << QString::fromStdString(job->jobName) << "remain" << imgRemainCount; + imgRemainCount -= job->imgQueue.size(); + localQueue.swap(job->imgQueue); + // 批量保存 + while (!localQueue.isEmpty()) { + auto data = std::move(localQueue.dequeue()); #if saveImgEnable - cv::imwrite(data.first, data.second); + cv::imwrite(data.first, data.second); #endif - } + } - qDebug() << "saveJob end " << QString::fromStdString(job->jobName); + qDebug() << "saveJob end " << QString::fromStdString(job->jobName); + } + } + catch (cv::Exception& e) { + qCritical() << "存图线程发生严重错误" << e.what(); + } + catch (std::exception& e) { + qCritical() << "存图线程发生严重错误" << e.what(); + } + catch (...) { + qCritical() << "存图线程发生严重错误"; } } @@ -240,7 +250,9 @@ public: } imgRemainCount += job->imgQueue.size(); qDebug() << "savejob enqueue" << QString::fromStdString(job->jobName) << "queue size" << priorityQueue.size() << "|" << defaultQueue.size() << " imgRemain" << imgRemainCount; - this->start(); + if (!this->isRunning()) { + this->start(); + } } int queueSize() { diff --git a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp index 84fffe4..01c0853 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp +++ b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp @@ -17,88 +17,39 @@ void exceptionResume(std::shared_ptr data, baoMoQianDaMianDetParams* _d 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); -bool BaoMoQianShangDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) { - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - ///////////////////取图//处理////////////////// - try { - cv::Mat src = data->oriImgs[0]; - cv::Mat Paint; - if (data->oriImgs[0].channels() == 1) - cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB); - else - data->oriImgs[0].copyTo(Paint); - - //////////////////////检测////////////////////// - cv::Mat afterDingWei; - { - cv::Mat forDingWei; - cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1); - cv::Mat segResult = _detParams->dingwei_seg->Evaluate(src); - 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::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei); - 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); - 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; - + 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 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(); +bool BaoMoQianShangDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) { qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - index++; ///////////////////取图//处理////////////////// try { + //data->oriImgs[0] = cv::imread("D:\\testImg\\Camera1.bmp"); cv::Mat src = data->oriImgs[0]; - cv::Mat Paint; - if (data->oriImgs[0].channels() == 1) - cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB); - else - data->oriImgs[0].copyTo(Paint); //////////////////////检测////////////////////// cv::Mat afterDingWei; { cv::Mat forDingWei; cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1); - cv::Mat segResult = _detParams->dingwei_seg->Evaluate(src); + 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) { @@ -107,8 +58,16 @@ bool BaoMoQianXiaDaMian(std::shared_ptr data, baoMoQianDaMianDetParams } 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; @@ -132,7 +91,80 @@ bool BaoMoQianXiaDaMian(std::shared_ptr data, baoMoQianDaMianDetParams } data->resultImgs.push_back(Paint); - textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); + 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; } diff --git a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h index 326ef48..5c3def1 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h +++ b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h @@ -6,12 +6,13 @@ using namespace HDevEngineCpp; class baoMoQianDaMianDetParams { public: - handdleAI::pSegmentation* dingwei_seg = nullptr; + 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 { @@ -31,8 +32,8 @@ public: myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); if (initOnce == false) { - _baoMoQianDaMianDetParams[0].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/seg_dingwei.BHD", 64, 0); - _baoMoQianDaMianDetParams[1].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/seg_dingwei.BHD", 0, 1); + _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);