diff --git a/include/global.h b/include/global.h index 626f615..054e70e 100644 --- a/include/global.h +++ b/include/global.h @@ -11,7 +11,7 @@ #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251118-2.2.2"; +const std::string softwareVersion = "20251119-2.2.3"; const std::string euiJsonVersion = "1.0.6"; #define globalDatabasePth "./sqlDatabase/eui_db.db" //全局数据库路径 #define saveImgEnable 1 diff --git a/include/simpleAlgo.h b/include/simpleAlgo.h index 692efbd..24fd6c8 100644 --- a/include/simpleAlgo.h +++ b/include/simpleAlgo.h @@ -37,7 +37,7 @@ static cv::Rect rectPlusRect(cv::Rect world, cv::Rect rect) { return cv::Rect(rect.x + world.x, rect.y + world.y, rect.width, rect.height); } -static cv::Rect findMaxAreaContour(cv::Mat src) +static cv::Rect findMaxAreaContour(const cv::Mat& src) { int maxIndex = 0, maxArea = 0; std::vector>contours; @@ -57,7 +57,7 @@ static cv::Rect findMaxAreaContour(cv::Mat src) return cv::boundingRect(contours[maxIndex]); return cv::Rect(0, 0, 0, 0); } -static cv::Rect findMaxAreaContour(cv::Mat src, int& indexReturn) +static cv::Rect findMaxAreaContour(const cv::Mat& src, int& indexReturn) { int maxIndex = 0, maxArea = 0; std::vector>contours; diff --git a/src/launcher/GUI/paramEditorDialog.h b/src/launcher/GUI/paramEditorDialog.h index 4fd03aa..1e85221 100644 --- a/src/launcher/GUI/paramEditorDialog.h +++ b/src/launcher/GUI/paramEditorDialog.h @@ -26,7 +26,19 @@ #include #include #include +class WheelBlocker : public QObject { + Q_OBJECT +public: + explicit WheelBlocker(QObject* parent = nullptr) : QObject(parent) {} +protected: + bool eventFilter(QObject* obj, QEvent* event) override { + if (event->type() == QEvent::Wheel) { + return true; // 拦截并吞掉滚轮事件 + } + return QObject::eventFilter(obj, event); + } +}; class paramTableEditor : public QDialog { Q_OBJECT @@ -195,6 +207,7 @@ private slots: } private: + WheelBlocker blocker; QTableView* m_tableView; QStandardItemModel* m_tableModel; nlohmann::json m_originalJson; @@ -467,6 +480,19 @@ private: } case QVariant::Type::Int: { QSpinBox* spinBox = new QSpinBox(); + spinBox->installEventFilter(&blocker); //安装滚轮事件过滤器 + spinBox->setStyleSheet(R"( + QSpinBox { + border: 1px solid black; + border-radius: 2px; + padding-right: 4px; + } + QSpinBox::up-button, QSpinBox::down-button, + QSpinBox::up-arrow, QSpinBox::down-arrow { + width: 0px; + height: 0px; + } + )"); spinBox->setMaximumWidth(160); spinBox->setRange(INT_MIN, INT_MAX); spinBox->setValue(value.toInt()); @@ -475,6 +501,19 @@ private: } case QVariant::Type::Double: { QDoubleSpinBox* spinBox = new QDoubleSpinBox(); + spinBox->installEventFilter(&blocker); //安装滚轮事件过滤器 + spinBox->setStyleSheet(R"( + QDoubleSpinBox { + border: 1px solid black; + border-radius: 2px; + padding-right: 4px; + } + QDoubleSpinBox::up-button, QDoubleSpinBox::down-button, + QDoubleSpinBox::up-arrow, QDoubleSpinBox::down-arrow { + width: 0px; + height: 0px; + } + )"); spinBox->setMaximumWidth(160); spinBox->setDecimals(3);//显示小位数 spinBox->setRange(-1e6, 1e6); diff --git a/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp b/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp index 0db6fde..73ba8cd 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp +++ b/src/mission/BaoMo/581-BaoMo-Cam1213/581-BaoMo-Cam1213.cpp @@ -44,9 +44,11 @@ halconResult dituo(std::shared_ptr data,cv::Mat& src, cv::Mat& Paint,b } else { data->halconOK = false; + int L = out_Y.Length(); 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); + 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(); @@ -71,9 +73,9 @@ bool ALGO_BaoMoHouDiBu_test(std::shared_ptr data, baoMoHouDiBuDetParam 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)); + 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) { 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 4b84b21..84fffe4 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp +++ b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.cpp @@ -1,154 +1,143 @@ #include <581-BaoMo-Cam1234.h> -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); +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); - 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; + 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");//结果反馈 } -int index = 0; + + bool BaoMoQianShangDaMian(std::shared_ptr data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) { qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } try { - //cv::Mat segImg; - //cv::resize(data->oriImgs[0], segImg, cv::Size(), 0.5, 0.5); - //cv::Rect ROI = extractRegion(segImg); - //segImg(ROI).copyTo(segImg); + 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); - //TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - //textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - //segImg = ~_detParams->seg_baomodamian->Evaluate(segImg); - //std::vector>contours; - //cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - //int clsIndex = 0; - //bool isNG = false; - //for (auto& contour : contours) { - // cv::Rect rect = cv::boundingRect(contour); - // if (rect.width < 60 || rect.height < 60) - // continue; - // cv::Mat clsImg = cutImg2Cls(rect, data->oriImgs[0]); - // data->clsOriginImgs.push_back({ std::to_string(clsIndex),clsImg}); - // int clsResult = _detParams->cls_baomodamian->Evaluate(clsImg); - // if (clsResult == 1 || clsResult == 2) { - // cv::drawContours(Paint, contours, clsIndex, cv::Scalar(0, 0, 255), 3); - // //isNG = true; - // } - // clsIndex++; - //} + + //////////////////////检测////////////////////// + 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); - //if (isNG == true) { - // textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - // if (data->service->_paramSyncManager->get("强制OK", false).toBool()) - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2"); - // else - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - //} - //else { - // textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - //} - //data->segOriginImgs.push_back(segImg); + 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 - generalExceptionResume(data, address, "检测异常"); + exceptionResume(data, _detParams, address, "检测异常"); return true; } - +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->service->_triggerManager->writeShort("D" + QByteArray::number(address.snAddr) + "_" + convertStringForFins(date)); + 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++; ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return false; - } - if (data->oriImgs[0].rows == 200) { - generalExceptionResume(data, address, "检测异常"); - return false; - } try { - cv::Mat segImg; - cv::resize(data->oriImgs[0], segImg, cv::Size(), 0.5, 0.5); - cv::Rect ROI = extractRegion(segImg); - segImg(ROI).copyTo(segImg); + 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); - //TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - //textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - segImg = ~_detParams->seg_baomodamian->Evaluate(segImg); + + //////////////////////检测////////////////////// + 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(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - int clsIndex = 0; - bool isNG = false; - for (auto& contour : contours) { - cv::Rect rect = cv::boundingRect(contour); + 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; - cv::Mat clsImg = cutImg2Cls(rect, data->oriImgs[0]); - data->clsOriginImgs.push_back({ std::to_string(clsIndex),clsImg}); - int clsResult = _detParams->cls_baomodamian->Evaluate(clsImg); - if (clsResult == 1 || clsResult == 2) { - cv::drawContours(Paint, contours, clsIndex, cv::Scalar(0, 0, 255), 3); - //isNG = true; + 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; } - clsIndex++; + 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 }); } - TextRendererZH textPainter(Paint.cols, Paint.rows, 500); - //if (isNG == true) { - // textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); - // if (data->service->_paramSyncManager->get("强制OK", false).toBool()) - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2"); - // else - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - //} - //else { - // textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); - // data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1"); - //} + + 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"); - data->segOriginImgs.push_back(segImg); - data->resultImgs.push_back(Paint); - - return true; } CATCH_EXCEPTIONS - generalExceptionResume(data, address, "检测异常"); + exceptionResume(data, _detParams, address, "检测异常"); 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 f881078..326ef48 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h +++ b/src/mission/BaoMo/581-BaoMo-Cam1234/581-BaoMo-Cam1234.h @@ -6,8 +6,9 @@ using namespace HDevEngineCpp; class baoMoQianDaMianDetParams { public: - handdleAI::pSegmentation* seg_baomodamian = nullptr; - handdleAI::pClassification* cls_baomodamian = nullptr; + handdleAI::pSegmentation* dingwei_seg = nullptr; + handdleAI::pSegmentation* baomodamian_seg = nullptr; + handdleAI::pClassification* baomodamian_cls = nullptr; }; @@ -30,12 +31,14 @@ public: myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); if (initOnce == false) { - - /* _baoMoQianDaMianDetParams[0].seg_baomodamian = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 0); - _baoMoQianDaMianDetParams[0].cls_baomodamian = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 0, 1); + _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[1].seg_baomodamian = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 1); - _baoMoQianDaMianDetParams[1].cls_baomodamian = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 1, 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; } diff --git a/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h b/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h index 00c5395..5563a36 100644 --- a/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h +++ b/src/mission/BaoMo/581-BaoMo-Cam5678/581-BaoMo-Cam5678.h @@ -8,7 +8,7 @@ struct _581_BaoMoResult }; class baoMoHouDaMianDetParams { public: - handdleAI::pSegmentation* dingwei = nullptr; + handdleAI::pSegmentation* dingwei_seg = nullptr; handdleAI::pSegmentation* seg = nullptr; handdleAI::pClassification* cls = nullptr; }; @@ -134,7 +134,7 @@ static bool BaoMoHou_ShangDaMian(std::shared_ptr data, baoMoHouDaMianD generalExceptionResume(data, address, "NG"); } -static bool BaoMoHou_XiaDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams, yh_581_address address) +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); @@ -146,29 +146,69 @@ static bool BaoMoHou_XiaDaMian(std::shared_ptr data, baoMoHouDaMianDet 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); + cv::Mat src = data->oriImgs[0]; + if (src.channels() != 3) + cv::cvtColor(src, Paint, cv::COLOR_GRAY2BGR); else - srcHalf.copyTo(Paint); - //切图 - //cv::Mat segResult = _detParams->dingwei->Evaluate(srcHalf); + 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; - //auto _result = BaoMoHou_DaMianAi(data, srcHalf, Paint, _detParams); + 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); @@ -207,8 +247,8 @@ public: _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_XiaDaMian); - _station_4.init("Camera4", "包膜后大面外观检测-右下-相机8(下大面四角2)",19400, 1,1, &_baoMoHouDaMianDetParams[3], _serviceManager, bridge, BaoMoHou_XiaDaMian); + _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; } diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp index 73cb514..7e26dd1 100644 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp @@ -169,17 +169,17 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams 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 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 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(); + 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));//焊印宽度 @@ -211,7 +211,7 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams 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) + if(data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool() == true) plcResult = "1"; data->sqlVec.insert({ {"焊印长度",halconResult.hanYin_Width }, { "焊印宽度",halconResult.hanYin_Height }, { "极耳裁切长度",halconResult.jiErHeight } }); @@ -250,7 +250,7 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams 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) + 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");//结果反馈 @@ -259,7 +259,7 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { QByteArray plcResult = "2"; - try { + try{ cv::Mat sourceImg = data->oriImgs[0]; //sourceImg = cv::imread("./testImages/"+ std::to_string(_detParams->cameraIndex) +".bmp"); cv::Mat Paint; @@ -290,6 +290,8 @@ bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, s 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"; diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h index 5504f1c..cad2789 100644 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h @@ -62,47 +62,47 @@ public: 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.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.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.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.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.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.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.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.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; @@ -122,7 +122,7 @@ public: } bool initCustom() { #pragma region 注册触发器回调 - if (_serviceManager->_paramSyncManager->get("内外侧判断", "hanhou", "OUT") == "OUT") { + 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); diff --git a/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp b/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp index aff70fc..bce840f 100644 --- a/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp +++ b/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp @@ -265,7 +265,10 @@ bool Hd_CameraModule_HIK_General::readData(std::vector& mat, QByteArray data = lastError.toUtf8(); return true; } - + if (data == "clearCache") { + queuepic.clear(); + return true; + } if (queuepic.isEmpty()) { return false; diff --git a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp index 24a06dd..5c6b4dc 100644 --- a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp +++ b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp @@ -270,7 +270,10 @@ bool Hd_CameraModule_HIK_hard_PCIE::readData(std::vector& mat, QByteArr data = lastError.toUtf8(); return true; } - + else if (data == "clearCache") { + queuepic.clear(); + return true; + } if (queuepic.isEmpty()) { return false;