diff --git a/src/Core/back/cameraManager.cpp b/src/Core/back/cameraManager.cpp index c12eb03..0df0ab7 100644 --- a/src/Core/back/cameraManager.cpp +++ b/src/Core/back/cameraManager.cpp @@ -58,28 +58,28 @@ void camera::run() getCameraImg(data->oriImgs, data->imgAmountMin); if (data->oriImgs.size() >= data->imgAmountMin) { qDebug() << data->uuid << " Min:" << data->imgAmountMin << " Get:" << data->oriImgs.size(); - if (lastUpdateTime.elapsed() > 200) {//显示在界面 - lastUpdateTime.start(); // 记录本次更新时间 - for (int i = 0; i < data->oriImgs.size(); i++) { - QPixmap pixmap; - cvMatToQPixMap(data->oriImgs[i], pixmap); - showImgPack* pack = new showImgPack( - cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first, - cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second - ); - pack->img = pixmap; - emit bridge->displayWidget_sendImg(pack); + //if (lastUpdateTime.elapsed() > 200) {//显示在界面 + // lastUpdateTime.start(); // 记录本次更新时间 + // for (int i = 0; i < data->oriImgs.size(); i++) { + // QPixmap pixmap; + // cvMatToQPixMap(data->oriImgs[i], pixmap); + // showImgPack* pack = new showImgPack( + // cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first, + // cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second + // ); + // pack->img = pixmap; + // emit bridge->displayWidget_sendImg(pack); - imgShowCnt++; - if (imgShowCnt >= cameraModulePtr._cameraStruct.imageShowList.size()) - imgShowCnt = 0; - } + // imgShowCnt++; + // if (imgShowCnt >= cameraModulePtr._cameraStruct.imageShowList.size()) + // imgShowCnt = 0; + // } - } - else { - showLost++; - qDebug() << cameraModulePtr.dllPath << "Lost show"; - } + //} + //else { + // showLost++; + // qDebug() << cameraModulePtr.dllPath << "Lost show"; + //} break; } QThread::msleep(1); diff --git a/src/Core/handleAi/handleAiModel.h b/src/Core/handleAi/handleAiModel.h index db6d109..605d8b5 100644 --- a/src/Core/handleAi/handleAiModel.h +++ b/src/Core/handleAi/handleAiModel.h @@ -67,7 +67,6 @@ public: gpuMutex->unlock(); return res; } -private: handdleAI::pClassification* clsPtr; }; class handleAiModelDet{ diff --git a/src/launcher.zip b/src/launcher.zip deleted file mode 100644 index 9b16a73..0000000 Binary files a/src/launcher.zip and /dev/null differ diff --git a/src/mission/581-BaoMo-Cam1213/581-BaoMo.h b/src/mission/581-BaoMo-Cam1213/581-BaoMo.h index 38a5548..40a0a60 100644 --- a/src/mission/581-BaoMo-Cam1213/581-BaoMo.h +++ b/src/mission/581-BaoMo-Cam1213/581-BaoMo.h @@ -57,7 +57,7 @@ public: std::string cameraName; QString viewerName; void init(std::string cameraNameIn, QString viewerNameIN, - ServiceManager * _serviceManagerIN, + ServiceManager* _serviceManagerIN, nlohmann::ordered_json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { viewerName = viewerNameIN; @@ -68,21 +68,22 @@ public: ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2)); } //9200 1 - void evaluate(int triggerPos,int triggerValue,int snPos,int dataPos,QByteArray& byteArray) { - _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - std::shared_ptr data = _serviceManager->_detDataManager->createDetData( - QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 - camera->captureImage(data);//拍照 - ganeralDet->ansyncProcess(data, "");//处理算法 - data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); - data->additional["触发地址"] = triggerPos; - data->additional["完成信号"] = triggerPos + 98; - data->additional["结果信号"] = triggerPos + 106; - data->additional["数据地址"] = dataPos; - _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1"); - qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; + for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + } + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; } void resultHandle(std::shared_ptr data, _581_Result resultData) { _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 @@ -94,6 +95,7 @@ private: ServiceManager* _serviceManager = nullptr; }; + class _581_BaoMo : public mission { public: _581Baomo_trigger2ImgTemplate _station_1; diff --git a/src/mission/581-BaoMo-Cam1234/581-BaoMo.h b/src/mission/581-BaoMo-Cam1234/581-BaoMo.h index 9332941..8f1def5 100644 --- a/src/mission/581-BaoMo-Cam1234/581-BaoMo.h +++ b/src/mission/581-BaoMo-Cam1234/581-BaoMo.h @@ -2,11 +2,18 @@ struct _581_Result { - bool result = true; + bool result = true; + std::vector < std::string> defects; }; class detParams { public: +}; +class baoMoHouDaMianDetParams { +public: + handleAiModelSeg* seg; + handleAiModelCls* cls; + handleAiModelCls* cls2; }; #pragma region 算法 #include @@ -28,7 +35,7 @@ static _581_Result _952_15_H_Algo(std::shared_ptr data, detParams* _de 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); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); return _581_Result(); } @@ -43,13 +50,176 @@ static _581_Result _952_15_H_Algo(std::shared_ptr data, detParams* _de cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); else src1.copyTo(Paint); - cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data-> resultImgs.push_back(Paint); - + cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); + data->resultImgs.push_back(Paint); + + return _result; +} +_581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, + baoMoHouDaMianDetParams* _detParams) { + _581_Result aireuslt; + TextRendererZH textPainter(Paint.cols, Paint.rows, 150); + bool huaShangNg = false; + cv::Mat segImg = ~_detParams->seg->segPtr->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.defects.push_back("划伤"); + return aireuslt; +} +static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams) +{ + _581_Result _result; + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return _581_Result(); + } + 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 _581_Result(); + } + + 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 <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, 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();*/ + //handleAiFuture.wait(); + //_result = handleAiFuture.get(); + //if (outFlag == 1) { + // for (int i = 0; i < out_Line.Length() / 4; i++) { + // cv::line(Paint, cv::Point(out_Line[i * 4 + 1].D() / 2, out_Line[i * 4].D()) / 2, + // cv::Point(out_Line[i * 4 + 3].D() / 2, out_Line[i * 4 + 2].D() / 2), + // cv::Scalar(0, 255, 0), 5); + // } + // /*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()), cv::Point(50, 150), cv::Scalar(0, 255, 0)); + // textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[1].D()), cv::Point(50, 350), cv::Scalar(0, 255, 0)); + // textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[2].D()), cv::Point(50, 550), cv::Scalar(0, 255, 0)); + // textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[3].D()), cv::Point(50, 750), cv::Scalar(0, 255, 0)); + // textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[4].D()), cv::Point(50, 950), cv::Scalar(0, 255, 0)); + //} + //else { + // textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); + //} + + data->resultImgs.push_back(Paint); + return _result; } #pragma endregion +class _581Baomo_BaoMoHouShangDaMian { +public: + baoMoHouDaMianDetParams _detParams; + detCallbackChain* ganeralDet; + std::string cameraName; + QString viewerName; + void init(std::string cameraNameIn, QString viewerNameIN, + ServiceManager* _serviceManagerIN, + nlohmann::ordered_json& _missionJson, + SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { + viewerName = viewerNameIN; + cameraName = cameraNameIn; + _serviceManager = _serviceManagerIN; + _detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg"); + _detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls"); + _detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2"); + ganeralDet = new detCallbackChain(_serviceManagerIN, &_detParams, bridgeIn); + ganeralDet->registerProcessAlgoCallback(BaoMoHouDaMian); + ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouShangDaMian::resultHandle, this, _1, _2)); + } + //9200 1 + void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + auto camera = _serviceManager->_cameraManager->getCamera(cameraName); + for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + //data->oriImgs.push_back(cv::imread("D://Image_20250809202445856.bmp", -1)); + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + QThread::msleep(3000); + } + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; + } + void resultHandle(std::shared_ptr data, _581_Result resultData) { + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位 + _serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects); + } +private: + qtFuncBridge* bridge; + ServiceManager* _serviceManager = nullptr; +}; class _581Baomo_trigger2ImgTemplate { public: detParams _detParams; @@ -69,20 +239,21 @@ public: } //9200 1 void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { - _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - std::shared_ptr data = _serviceManager->_detDataManager->createDetData( - QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 - camera->captureImage(data);//拍照 - ganeralDet->ansyncProcess(data, "");//处理算法 - data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); - data->additional["触发地址"] = triggerPos; - data->additional["完成信号"] = triggerPos + 98; - data->additional["结果信号"] = triggerPos + 106; - data->additional["数据地址"] = dataPos; - _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1"); - qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; + for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + } + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; } void resultHandle(std::shared_ptr data, _581_Result resultData) { _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 @@ -95,8 +266,8 @@ private: }; class _581_BaoMo : public mission { public: - _581Baomo_trigger2ImgTemplate _station_1; - _581Baomo_trigger2ImgTemplate _station_2; + _581Baomo_BaoMoHouShangDaMian _station_1; + _581Baomo_BaoMoHouShangDaMian _station_2; _581Baomo_trigger2ImgTemplate _station_3; _581Baomo_trigger2ImgTemplate _station_4; summaryData<_581_Result> _summaryData; diff --git a/src/mission/581-BaoMo-Cam5678/581-BaoMo.h b/src/mission/581-BaoMo-Cam5678/581-BaoMo.h index 157c980..d0f5914 100644 --- a/src/mission/581-BaoMo-Cam5678/581-BaoMo.h +++ b/src/mission/581-BaoMo-Cam5678/581-BaoMo.h @@ -20,42 +20,7 @@ public: #include #include using namespace HDevEngineCpp; - -static _581_Result _952_15_H_Algo(std::shared_ptr data, detParams* _detParams) -{ - _581_Result _result; - qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; - - ///////////////////取图//处理////////////////// - if (data->oriImgs.size() != 1) - { - qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); - return _581_Result(); - } - 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 _581_Result(); - } - - 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); - cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data->resultImgs.push_back(Paint); - - return _result; -} -_581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, +_581_Result BaoMoHou_DaMianAi(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, baoMoHouDaMianDetParams* _detParams) { _581_Result aireuslt; TextRendererZH textPainter(Paint.cols, Paint.rows, 150); @@ -66,11 +31,11 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat 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)); + if (rect.width < 100 || rect.height < 100) continue; // 过滤掉小轮廓 + auto clsImgs = cutImg2ClsVec(rect, src, cv::Size(128, 128)); bool clsIsNg = false; for (auto& clsImg : clsImgs) { - if (_detParams->cls->Evaluate(clsImg) == 1) { // 假设1表示NG + if (_detParams->cls->clsPtr->Evaluate(clsImg) == 1) { // 假设1表示NG int clsResult = _detParams->cls2->Evaluate(clsImg); if (clsResult == 1) { clsIsNg = true; @@ -79,12 +44,11 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat } } } - cv::Scalar color = cv::Scalar(0, 255, 0); if (clsIsNg == true) { - color = cv::Scalar(0, 0, 255); + cv::Scalar 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)); + textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), color); } //else { // cv::Mat imgTmp; @@ -99,7 +63,9 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat aireuslt.defects.push_back("划伤"); return aireuslt; } -static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams) +#pragma endregion +#pragma region 上大面 +static _581_Result BaoMoHou_ShangDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams) { _581_Result _result; qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; @@ -110,7 +76,7 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMian qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); return _581_Result(); } - if (data->oriImgs[0].rows == 100) { + 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); @@ -130,7 +96,7 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMian else srcHalf.copyTo(Paint); TextRendererZH textPainter(Paint.cols, Paint.rows, 150); - std::future <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, data, srcHalf, Paint, _detParams); + std::future <_581_Result> 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); @@ -146,8 +112,8 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMian _result = handleAiFuture.get(); if (outFlag == 1) { for (int i = 0; i < out_Line.Length() / 4; i++) { - cv::line(Paint, cv::Point(out_Line[i * 4 + 1].D() / 2, out_Line[i * 4].D()) / 2, - cv::Point(out_Line[i * 4 + 3].D() / 2, out_Line[i * 4 + 2].D() / 2), + 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); } /*out_Distance[0]: 上端盖到膜的距离< / c> @@ -155,13 +121,14 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMian * out_Distance[2] : 下端盖到膜的距离< / c> * out_Distance[3] : 电芯宽度 < / c> * out_Distance[4] : 电芯高度< / c>*/ - textPainter.putText(Paint, "上端盖到膜的距离:" + std::to_string(out_Distance[0].D()), cv::Point(50, 150), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[1].D()), cv::Point(50, 350), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[2].D()), cv::Point(50, 550), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[3].D()), cv::Point(50, 750), cv::Scalar(0, 255, 0)); - textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[4].D()), cv::Point(50, 950), cv::Scalar(0, 255, 0)); + 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)); } else { + data->halconOK = false; textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); } @@ -169,7 +136,6 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr data, baoMoHouDaMian return _result; } -#pragma endregion class _581Baomo_BaoMoHouShangDaMian { public: baoMoHouDaMianDetParams _detParams; @@ -183,18 +149,18 @@ public: viewerName = viewerNameIN; cameraName = cameraNameIn; _serviceManager = _serviceManagerIN; - _detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg"); - _detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls"); - _detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2"); + _detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg_gpu0"); + _detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls_gpu0"); + _detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2_gpu0"); ganeralDet = new detCallbackChain(_serviceManagerIN, &_detParams, bridgeIn); - ganeralDet->registerProcessAlgoCallback(BaoMoHouDaMian); + ganeralDet->registerProcessAlgoCallback(BaoMoHou_ShangDaMian); ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouShangDaMian::resultHandle, this, _1, _2)); } //9200 1 void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - for (int i = 0; i < 2; i++) { + // for (int i = 0; i < 2; i++) { std::shared_ptr data = _serviceManager->_detDataManager->createDetData( QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 camera->captureImage(data);//拍照 @@ -205,8 +171,7 @@ public: data->additional["完成信号"] = triggerPos + 98; data->additional["结果信号"] = triggerPos + 106; data->additional["数据地址"] = dataPos; - QThread::msleep(3000); - } + //v } _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; } @@ -220,10 +185,83 @@ private: qtFuncBridge* bridge; ServiceManager* _serviceManager = nullptr; }; -class _581Baomo_trigger2ImgTemplate { +#pragma endregion +#pragma region 下大面 +static _581_Result BaoMoHou_XiaDaMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams) +{ + _581_Result _result; + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return _581_Result(); + } + 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 _581_Result(); + } + + 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); + _result = BaoMoHou_DaMianAi(data, srcHalf, Paint, _detParams); + //TextRendererZH textPainter(Paint.cols, Paint.rows, 150); + //std::future <_581_Result> handleAiFuture = std::async(std::launch::async, BaoMoHou_XiaMianAi, 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(); + //handleAiFuture.wait(); + //_result = handleAiFuture.get(); + //if (outFlag == 1) { + // 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); + // } + // /*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)); + //} + //else { + // textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); + //} + + data->resultImgs.push_back(Paint); + + return _result; +} +class _581Baomo_BaoMoHouXiaDaMian { public: - detParams _detParams; - detCallbackChain* ganeralDet; + baoMoHouDaMianDetParams _detParams; + detCallbackChain* ganeralDet; std::string cameraName; QString viewerName; void init(std::string cameraNameIn, QString viewerNameIN, @@ -233,44 +271,50 @@ public: viewerName = viewerNameIN; cameraName = cameraNameIn; _serviceManager = _serviceManagerIN; - ganeralDet = new detCallbackChain(_serviceManagerIN, &_detParams, bridgeIn); - ganeralDet->registerProcessAlgoCallback(_952_15_H_Algo); - ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2)); + _detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg_gpu1"); + _detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls_gpu1"); + _detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2_gpu1"); + ganeralDet = new detCallbackChain(_serviceManagerIN, &_detParams, bridgeIn); + ganeralDet->registerProcessAlgoCallback(BaoMoHou_XiaDaMian); + ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouXiaDaMian::resultHandle, this, _1, _2)); } //9200 1 void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - for (int i = 0; i < 2; i++) { - std::shared_ptr data = _serviceManager->_detDataManager->createDetData( - QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 - camera->captureImage(data);//拍照 - ganeralDet->ansyncProcess(data, "");//处理算法 - data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); - data->additional["触发地址"] = triggerPos; - data->additional["完成信号"] = triggerPos + 98; - data->additional["结果信号"] = triggerPos + 106; - data->additional["数据地址"] = dataPos; - } + // for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + //data->oriImgs.push_back(cv::imread("D://Image_20250809202445856.bmp", -1)); + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + //v } _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; } void resultHandle(std::shared_ptr data, _581_Result resultData) { _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位 + _serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects); } private: qtFuncBridge* bridge; ServiceManager* _serviceManager = nullptr; }; +#pragma endregion class _581_BaoMo : public mission { public: _581Baomo_BaoMoHouShangDaMian _station_1; - _581Baomo_BaoMoHouShangDaMian _station_2; - _581Baomo_trigger2ImgTemplate _station_3; - _581Baomo_trigger2ImgTemplate _station_4; + _581Baomo_BaoMoHouXiaDaMian _station_2; + _581Baomo_BaoMoHouShangDaMian _station_3; + _581Baomo_BaoMoHouXiaDaMian _station_4; summaryData<_581_Result> _summaryData; detCallbackChain* algo_liubai; detParams _detParams; diff --git a/src/mission/581-BaoMo-Cam91011/581-BaoMo.h b/src/mission/581-BaoMo-Cam91011/581-BaoMo.h index 1e891ae..d438d6b 100644 --- a/src/mission/581-BaoMo-Cam91011/581-BaoMo.h +++ b/src/mission/581-BaoMo-Cam91011/581-BaoMo.h @@ -2,11 +2,18 @@ struct _581_Result { - bool result = true; + bool result = false; + std::vector < std::string> defects; }; class detParams { public: +}; +class baoMoHouDaMianDetParams { +public: + handleAiModelSeg* seg; + handleAiModelCls* cls; + handleAiModelCls* cls2; }; #pragma region 算法 #include @@ -28,7 +35,7 @@ static _581_Result _952_15_H_Algo(std::shared_ptr data, detParams* _de 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); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); return _581_Result(); } @@ -43,13 +50,173 @@ static _581_Result _952_15_H_Algo(std::shared_ptr data, detParams* _de cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); else src1.copyTo(Paint); - cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); - data-> resultImgs.push_back(Paint); - + cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); + data->resultImgs.push_back(Paint); + + return _result; +} +_581_Result _BaoMoHouDaMian(std::shared_ptr data, cv::Mat src, cv::Mat& Paint, + baoMoHouDaMianDetParams* _detParams) { + _581_Result aireuslt; + TextRendererZH textPainter(Paint.cols, Paint.rows, 150); + bool huaShangNg = false; + cv::Mat segImg = ~_detParams->seg->segPtr->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.defects.push_back("划伤"); + return aireuslt; +} +static _581_Result BaoMoHouCeMian(std::shared_ptr data, baoMoHouDaMianDetParams* _detParams) +{ + _581_Result _result; + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return _581_Result(); + } + 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 _581_Result(); + } + + 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 <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, data, srcHalf, Paint, _detParams); + HalconCpp::HObject in_Image = MatToHObject(src1); + 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(); + //handleAiFuture.wait(); + //_result = handleAiFuture.get(); + if (outFlag == 1) { + 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); + } + /*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_Width.D()) + "mm", cv::Point(50, 150), cv::Scalar(0, 255, 0)); + } + else { + textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255)); + _result.defects.push_back("算法不良"); + } + + data->resultImgs.push_back(Paint); + return _result; } #pragma endregion +class _581Baomo_BaoMoHouCeMian { +public: + baoMoHouDaMianDetParams _detParams; + detCallbackChain* ganeralDet; + std::string cameraName; + QString viewerName; + void init(std::string cameraNameIn, QString viewerNameIN, + ServiceManager* _serviceManagerIN, + nlohmann::ordered_json& _missionJson, + SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { + viewerName = viewerNameIN; + cameraName = cameraNameIn; + _serviceManager = _serviceManagerIN; + _detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg"); + _detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls"); + _detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2"); + ganeralDet = new detCallbackChain(_serviceManagerIN, &_detParams, bridgeIn); + ganeralDet->registerProcessAlgoCallback(BaoMoHouCeMian); + ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouCeMian::resultHandle, this, _1, _2)); + } + //9200 1 + void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + auto camera = _serviceManager->_cameraManager->getCamera(cameraName); + //for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + //data->oriImgs.push_back(cv::imread("D://Image_20250809193611532.bmp", -1)); + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + //QThread::msleep(3000); + //} + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; + } + void resultHandle(std::shared_ptr data, _581_Result resultData) { + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位 + _serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects); + } +private: + qtFuncBridge* bridge; + ServiceManager* _serviceManager = nullptr; +}; class _581Baomo_trigger2ImgTemplate { public: detParams _detParams; @@ -57,7 +224,7 @@ public: std::string cameraName; QString viewerName; void init(std::string cameraNameIn, QString viewerNameIN, - ServiceManager * _serviceManagerIN, + ServiceManager* _serviceManagerIN, nlohmann::ordered_json& _missionJson, SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { viewerName = viewerNameIN; @@ -68,18 +235,22 @@ public: ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2)); } //9200 1 - void evaluate(int triggerPos,int triggerValue,int snPos,int finishSignalPos,QByteArray& byteArray) { - _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(finishSignalPos) + "_1");//完成信号 + void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) { std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - std::shared_ptr data = _serviceManager->_detDataManager->createDetData( - QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 - camera->captureImage(data);//拍照 - ganeralDet->ansyncProcess(data, "");//处理算法 - data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); - data->additional["触发地址"] = triggerPos; - data->additional["完成信号"] = finishSignalPos; - qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);; + //for (int i = 0; i < 2; i++) { + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包 + camera->captureImage(data);//拍照 + ganeralDet->ansyncProcess(data, "");//处理算法 + data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图")); + data->additional["触发地址"] = triggerPos; + data->additional["完成信号"] = triggerPos + 98; + data->additional["结果信号"] = triggerPos + 106; + data->additional["数据地址"] = dataPos; + //} + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号 + qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);; } void resultHandle(std::shared_ptr data, _581_Result resultData) { _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果 @@ -90,11 +261,10 @@ private: qtFuncBridge* bridge; ServiceManager* _serviceManager = nullptr; }; - class _581_BaoMo : public mission { public: - _581Baomo_trigger2ImgTemplate _station_1; - _581Baomo_trigger2ImgTemplate _station_2; + _581Baomo_BaoMoHouCeMian _station_1; + _581Baomo_BaoMoHouCeMian _station_2; _581Baomo_trigger2ImgTemplate _station_3; summaryData<_581_Result> _summaryData; detCallbackChain* algo_liubai; @@ -112,26 +282,26 @@ public: #pragma region 初始化外部参数 parseJson(_missionJson); HDevEngineCpp::HDevEngine myEngine; - //myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl"); + myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); #pragma endregion #pragma region 注册触发器回调 _station_1.init("Camera1","包膜后侧面贴胶错位检测相机9",_serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn); _serviceManager->_triggerManager->registerCallback(19600, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_1.evaluate(triggerPos, triggerValue, 19610, 19698, byteArray); }, "D19600拍照触发"); + {_station_1.evaluate(triggerPos, triggerValue, 19610, 19714, byteArray); }, "D19600拍照触发"); _serviceManager->_triggerManager->registerCallback(19602, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_1.evaluate(triggerPos, triggerValue, 19632, 19698, byteArray); }, "D19602拍照触发"); + {_station_1.evaluate(triggerPos, triggerValue, 19632, 19734, byteArray); }, "D19602拍照触发"); _station_2.init("Camera2", "包膜后侧面贴胶错位检测相机10", _serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn); _serviceManager->_triggerManager->registerCallback(19800, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_2.evaluate(triggerPos, triggerValue, 19810, 19898, byteArray); }, "D19800拍照触发"); + {_station_2.evaluate(triggerPos, triggerValue, 19810, 19914, byteArray); }, "D19800拍照触发"); _serviceManager->_triggerManager->registerCallback(19802, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_2.evaluate(triggerPos, triggerValue, 19832, 19898, byteArray); }, "D19802拍照触发"); + {_station_2.evaluate(triggerPos, triggerValue, 19832, 19934, byteArray); }, "D19802拍照触发"); _station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)", _serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn); _serviceManager->_triggerManager->registerCallback(20000, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_3.evaluate(triggerPos, triggerValue, 20010, 20098, byteArray); }, "D20000拍照触发"); + {_station_3.evaluate(triggerPos, triggerValue, 20010, 20114, byteArray); }, "D20000拍照触发"); _serviceManager->_triggerManager->registerCallback(20002, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) - {_station_3.evaluate(triggerPos, triggerValue, 20032, 20098, byteArray); }, "D20002拍照触发"); + {_station_3.evaluate(triggerPos, triggerValue, 20032, 20134, byteArray); }, "D20002拍照触发"); #pragma endregion return true; } diff --git a/src/mission/581-BaoMo-Cam91011/CMakeLists.txt b/src/mission/581-BaoMo-Cam91011/CMakeLists.txt index 76bbff3..bba2e81 100644 --- a/src/mission/581-BaoMo-Cam91011/CMakeLists.txt +++ b/src/mission/581-BaoMo-Cam91011/CMakeLists.txt @@ -40,8 +40,8 @@ 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) +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} @@ -64,6 +64,7 @@ target_link_libraries(${CURRENT_FOLDER} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Sql ) diff --git a/src/src.zip b/src/src.zip deleted file mode 100644 index 1c43069..0000000 Binary files a/src/src.zip and /dev/null differ