From c586dd932c5334f356fe564d202c386083aee4ea Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Tue, 18 Nov 2025 00:30:17 +0800 Subject: [PATCH] =?UTF-8?q?V20251118-2.2.2=20=E4=BC=98=E5=8C=96CLS?= =?UTF-8?q?=E5=88=87=E5=9B=BE=E7=AE=97=E6=B3=95=E3=80=82=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96PCIE=E7=9B=B8=E6=9C=BA=E6=97=A0=E6=B3=95=E6=89=BE?= =?UTF-8?q?=E5=88=B0=E8=AE=BE=E5=A4=87=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/global.h | 2 +- include/simpleAlgo.h | 10 +- src/core/service/imgSaveThreadManager.h | 113 +++---- src/cutImage/baoMo.hpp | 84 +++++- src/cutImage/main.cpp | 2 +- .../581_RuanLianJie_majiatiejiao.cpp | 9 + .../581_RuanLianJie_majiatiejiao.h | 284 ++++++++++++++++++ .../CMakeLists.txt | 77 +++++ .../Hd_CameraModule_HIK_PCIE.cpp | 2 +- 9 files changed, 500 insertions(+), 83 deletions(-) create mode 100644 src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp create mode 100644 src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h create mode 100644 src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt diff --git a/include/global.h b/include/global.h index aac9c75..626f615 100644 --- a/include/global.h +++ b/include/global.h @@ -11,7 +11,7 @@ #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251117-2.2.1"; +const std::string softwareVersion = "20251118-2.2.2"; 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 70dd8f5..692efbd 100644 --- a/include/simpleAlgo.h +++ b/include/simpleAlgo.h @@ -116,8 +116,8 @@ static cv::Mat cutImg2Cls(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targe return squareImage; } -static std::vector cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) -{ +static std::vector cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)){ + std::vector result; if (boundingBox.width <= 0 || boundingBox.height <= 0 || imgInput.empty()) { @@ -127,7 +127,9 @@ static std::vector cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput const int w = boundingBox.width; const int h = boundingBox.height; - const int minSide = std::min(w, h); + const int targetMinSide = std::max(1, std::min(targetSize.width, targetSize.height)); + int minSide = std::min(w, h); + minSide = std::max(minSide, targetMinSide); if (minSide <= 0) { std::cerr << "Bounding box has zero width or height." << std::endl; return result; @@ -147,7 +149,7 @@ static std::vector cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput starts.emplace_back(s); } // 确保包含末端(避免遗漏),同时避免与最后一个重复 - const int lastStart = endCoord - step; + const int lastStart = std::max(beginCoord, endCoord - step); if (starts.empty() || starts.back() != lastStart) { starts.emplace_back(lastStart); } diff --git a/src/core/service/imgSaveThreadManager.h b/src/core/service/imgSaveThreadManager.h index ac50b40..4265c82 100644 --- a/src/core/service/imgSaveThreadManager.h +++ b/src/core/service/imgSaveThreadManager.h @@ -269,65 +269,48 @@ public: saveCls = _paramSyncManager->get("通用设置", "存储Cls图", true).toBool(); getParamTimer.restart(); } + try { + std::shared_ptr oriJob(new saveJob("[ORI_JOB]" + data->SNcode)); + std::shared_ptr resJob(new saveJob("[RES_JOB]" + data->SNcode)); - std::shared_ptr oriJob(new saveJob("[ORI_JOB]" + data->SNcode)); - std::shared_ptr resJob(new saveJob("[RES_JOB]" + data->SNcode)); + QString oriSavePath = _ImageSavePathFormatter.genPath(data, oriImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 + if (saveOri == true || saveSeg == true || saveCls == true) { + createDirectoryIfNotExists(oriSavePath);//不存在此文件夹则创建 + if (data->oriImgs.size() != 0 && saveOri == true) { + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->oriImgs);//按规则为文件创建命名 + packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->oriImgs);//打包数据 + } + //SEG原图 + if (data->segOriginImgs.size() != 0 && saveSeg == true) { + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->segOriginImgs);//按规则为文件创建命名 + packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->segOriginImgs);//打包数据 + } + //CLS原图 + if (data->clsOriginImgs.size() != 0 && saveCls == true) { + std::vectorfileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->clsOriginImgs);//按规则为文件创建命名 + packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->clsOriginImgs);//打包数据 + } + } - QString oriSavePath = _ImageSavePathFormatter.genPath(data, oriImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 - if (saveOri == true || saveSeg == true || saveCls == true) { - createDirectoryIfNotExists(oriSavePath);//不存在此文件夹则创建 - if (data->oriImgs.size() != 0 && saveOri == true) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->oriImgs);//按规则为文件创建命名 - packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->oriImgs);//打包数据 - } - //SEG原图 - if (data->segOriginImgs.size() != 0 && saveSeg == true) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->segOriginImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->segOriginImgs);//打包数据 - } - //CLS原图 - if (data->clsOriginImgs.size() != 0 && saveCls == true) { - std::vectorfileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->clsOriginImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->clsOriginImgs);//打包数据 + + QString resSavePath = _ImageSavePathFormatter.genPath(data, resImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 + if (saveRes == true) { + createDirectoryIfNotExists(resSavePath);//不存在此文件夹则创建 + //结果图保存 + if (data->resultImgs.size() != 0) { + std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->resultImgs);//按规则为文件创建命名 + packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->resultImgs);//打包数据 + } } + + if (oriJob->imgQueue.size() != 0) + saveThread.addJob(oriJob); + if (resJob->imgQueue.size() != 0) + saveThread.addJob(resJob, imgSaveThread::priority); } - - - QString resSavePath = _ImageSavePathFormatter.genPath(data, resImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名 - if (saveRes == true){ - createDirectoryIfNotExists(resSavePath);//不存在此文件夹则创建 - //结果图保存 - if (data->resultImgs.size() != 0) { - std::vectorfileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->resultImgs);//按规则为文件创建命名 - packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->resultImgs);//打包数据 - } + catch (...) { + qDebug() << "存图崩溃 SN" << QString::fromStdString(data->SNcode) << " uuid" << data->uuid; } - - if (oriJob->imgQueue.size() != 0) - saveThread.addJob(oriJob); - if (resJob->imgQueue.size() != 0) - saveThread.addJob(resJob, imgSaveThread::priority); - //额外储存NG文件夹 - //std::string additionalSaveNgImgPath = genDirName(data, additionalSaveNgImg); - //std::vectoradditionalSaveNgImgNames = genFileNames(data, additionalSaveNgImg); - //if (additionalSaveNgImgNames.size() > 0) - // createDirectoryIfNotExists(additionalSaveNgImgPath);//不存在此文件夹则创建 - //int additionalSaveNgImgNamesIndex = 0; - //for (int index = 0; index < data->segOriginImgs.size()&& additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++) - //{ - // saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->segOriginImgs[index]); - // additionalSaveNgImgNamesIndex++; - //} - //for (int index = 0; index < data->oriImgs.size() && additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++) - //{ - // saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->oriImgs[index]); - // additionalSaveNgImgNamesIndex++; - //} - //for (int index = 0; index < data->resultImgs.size() && additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++) - //{ - // saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->resultImgs[index]); - // additionalSaveNgImgNamesIndex++; - //} } private: bool saveOri = true, saveRes = true, saveSeg = true, saveCls = true; @@ -339,15 +322,8 @@ private: qWarning() << "检测到存图文件名数量与图片数量不符"; for (int index = 0; index < fileNames.size() && index < mats.size(); index++) { - try { - - if (mats[index].data == nullptr) { - qDebug() << "在存图线程中发现空指针"; - continue; - } - } - catch (...) { - qDebug() << "在存图线程中发现无效图像"; + if (mats[index].data == nullptr) { + qDebug() << "在存图线程中发现空指针"; continue; } @@ -361,15 +337,8 @@ private: qWarning() << "检测到存图文件名数量与图片数量不符"; for (int index = 0; index < fileNames.size() && index < mats.size(); index++) { - try { - - if (mats[index].second.data == nullptr) { - qDebug() << "在存图线程中发现空指针"; - continue; - } - } - catch (...) { - qDebug() << "在存图线程中发现无效图像"; + if (mats[index].second.data == nullptr) { + qDebug() << "在存图线程中发现空指针"; continue; } diff --git a/src/cutImage/baoMo.hpp b/src/cutImage/baoMo.hpp index 7d7872f..b67d516 100644 --- a/src/cutImage/baoMo.hpp +++ b/src/cutImage/baoMo.hpp @@ -6,11 +6,12 @@ using namespace std; -void baomoXiaDMianCut(const std::string path, const std::string format, const std::string outputPath,cv::Size fillter) { +void baomoShangDMianCut(const std::string path, const std::string format, const std::string outputPath,cv::Size fillter) { //int - handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImgFiles/baoMoXiaDaMian_seg.BHD", 1, 0); + handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImageFiles/baoMoXiaDaMian_seg.BHD", 1, 0); std::vector images; cv::glob(path + "/*." + format, images, false); + std::cout << "files count" << images.size() << std::endl; for (size_t i = 0; i < images.size(); i++) { std::string filePath = outputPath + "/" + std::to_string(i) + "/"; createDirectoryIfNotExists(QString::fromStdString(filePath)); @@ -29,9 +30,9 @@ void baomoXiaDMianCut(const std::string path, const std::string format, const st std::vector> contours; cv::findContours(SegResult,contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); for (int ii = 0; ii < contours.size(); ii++) { - cv::Rect rect = cv::boundingRect(contours[i]); + cv::Rect rect = cv::boundingRect(contours[ii]); if (rect.width > fillter.width || rect.height > fillter.height) { - cv::putText(Paint, std::to_string(i), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(255, 255, 255), 5); + cv::putText(Paint, std::to_string(ii), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(255, 255, 255), 5); cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); auto imgs = cutImg2ClsVec(rect, srcImage); for (int o = 0; o < imgs.size(); o++) { @@ -40,5 +41,80 @@ void baomoXiaDMianCut(const std::string path, const std::string format, const st } } cv::imwrite(filePath + "/Paint.bmp", Paint); + std::cout << i << "/" << images.size() << std::endl; + } +} + +void baomoXiaDMianSiJiaoCut(const std::string path, const std::string format, const std::string outputPath, cv::Size fillter) { + //int + handdleAI::pSegmentation* dingwei = handdleAI::CreateSegObjS("./cutImageFiles/Seg_Baomo_Xiadamian_Sijiao.BHD", 1, 0); + handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImageFiles/Seg_2025-11-14_12-24-59_8.303497.BHD", 1, 0); + std::vector images; + cv::glob(path + "/*." + format, images, false); + std::cout << "files count" << images.size() << std::endl; + for (size_t i = 0; i < images.size(); i++) { + std::string filePath = outputPath + "/" + std::to_string(i) + "/"; + createDirectoryIfNotExists(QString::fromStdString(filePath)); + cv::Mat srcImage = cv::imread(images[i], -1); + cv::Mat Paint; + if (srcImage.channels() == 1) + cv::cvtColor(srcImage, Paint, cv::COLOR_GRAY2BGR); + else + srcImage.copyTo(Paint); + + if (srcImage.empty()) { + std::cout << "ͼƬΪ¿գ¡" << std::endl; + continue; + } + + //¶¨λ¸ß>800 ¿í>6000µÄ + std::vector dingWeiImgs; + std::vector rects; + { + cv::Mat forDingWei; + cv::resize(srcImage, forDingWei, cv::Size(), 0.1, 0.1); + cv::Mat dingweiSegResult = ~dingwei->Evaluate(forDingWei); + std::vector> contours; + cv::findContours(dingweiSegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + for (int o = 0; o < contours.size(); o++) { + cv::Rect rect = cv::boundingRect(contours[o]); + rect.width = rect.width * 10 + 10; + rect.height = rect.height * 10 + 10; + rect.x = rect.x * 10 - 10; + rect.y = rect.y * 10 - 10; + + if (rect.width > 5500, rect.height > 700) { + dingWeiImgs.push_back(srcImage(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)std:cout << "ͼƬ²»Âú×ã2"<Evaluate(forSeg); + std::vector> contours; + cv::findContours(SegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + for (int ii = 0; ii < contours.size(); ii++) { + cv::Rect rect = cv::boundingRect(contours[ii]); + if (rect.width > fillter.width || rect.height > fillter.height) { + auto imgs = cutImg2ClsVec(rect, forSeg); + for (int o = 0; o < imgs.size(); o++) { + cv::imwrite(filePath + "/" + std::to_string(imgIndex) + "_" + std::to_string(ii) + "_" + std::to_string(o) + "CLS.bmp", imgs[o]); + } + rect.x += +rects[imgIndex].x /2; + rect.y += +rects[imgIndex].y /2; + cv::putText(Paint, std::to_string(ii), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(0, 0, 255), 5); + cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3); + } + } + } + cv::imwrite(filePath + "/Paint.jpg", Paint); + std::cout << i << "/" << images.size() << std::endl; } } \ No newline at end of file diff --git a/src/cutImage/main.cpp b/src/cutImage/main.cpp index 9d8e7c8..2c16816 100644 --- a/src/cutImage/main.cpp +++ b/src/cutImage/main.cpp @@ -2,6 +2,6 @@ int main(int argc, char* argv[]) { - //baomoXiaDMianCut( + baomoXiaDMianSiJiaoCut("E:\\imgs", "bmp", "./outputs/" , cv::Size(50, 50)); return 1; } \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp new file mode 100644 index 0000000..1a09e77 --- /dev/null +++ b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.cpp @@ -0,0 +1,9 @@ +#include <581_RuanLianJie_majiatiejiao.h> + +mission* createMission() { + return new _581_YuHan_hanqian(); +} + +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h new file mode 100644 index 0000000..c53f7c7 --- /dev/null +++ b/src/mission/581_RuanLianJie_majiatiejiao/581_RuanLianJie_majiatiejiao.h @@ -0,0 +1,284 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +class RuanLianJie_majiatiejiao { +public: + +}; +#if 0 +bool top_tiejiaojianece(std::shared_ptr data, RuanLianJie_majiatiejiao* _detParams, sx_581_address address) { + try{ +#if 0 + /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ + cv::Mat resultImage = img2D.clone(); + if (resultImage.channels() == 1) { + cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); + } + QString okng_tag = "OK"; + cv::Mat seg_detectImage; + cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); + plcResult = "1"; + bool isNG = false; + if (DOGLIVE) { + std::vector>clsImgs; + bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); + for (int i = 0; i < clsImgs.size(); i++) { + addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); + } + } + if (isNG == false)//OK + { + putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); + okng_tag = "OK"; + } + else + { + putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); + plcResult = "2"; + } + cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); + resMat.push_back(resultImage); + if (resMat.size() > 0) + { + addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 + addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 + } + addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 + + return true; + /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ +#else + data->oriImgs[0] = cv::imread("D:\\testImage\\Camera1.bmp", -1); + QByteArray plcResult = "2"; + cv::Mat sourceImg; + data->oriImgs[0].copyTo(sourceImg); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HDevEngineCpp::HDevProcedure proc("_4_Inspection_Packaging_tape"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image; + in_Image = MatToHObject(sourceImg); + procedureCall.SetInputIconicParamObject("in_Image", in_Image); + procedureCall.Execute();//执行halcon程序 + + HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDeTails; + out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle"); + out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle"); + //out_NgDeTails = procedureCall.GetOutputCtrlParamTuple("out_NgDeTails"); + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + + int flag = out_Flag.D(); + std::string NgDeTails = out_NgDeTails.ToString(); + plcResult = "1"; + TextRendererZH textPainter(Paint.cols, Paint.rows, 500); + if (flag == 1) + { + int out_GlueRectangle_L = out_GlueRectangle.Length(); + for (auto i = 0; i < out_GlueRectangle_L / 4; i++) + cv::rectangle(Paint, + cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1], + out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]), + cv::Scalar(0, 255, 0), 5); + textPainter.putText(Paint, + "OK", + cv::Point(0, 50), cv::Scalar(0, 255, 0)); + } + else + { + int out_ErrRectangle_L = out_ErrRectangle.Length(); + for (auto i = 0; i < out_ErrRectangle_L / 4; i++) + cv::rectangle(Paint, + cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1], + out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]), + cv::Scalar(0, 255, 0), 5); + textPainter.putText(Paint, + "NG", + cv::Point(0, 50), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + plcResult = "1"; + sourceImg.release(); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + + return true; +#endif + } + CATCH_EXCEPTIONS + + qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + TextRendererZH textPainter(Paint.cols, Paint.rows, 500); + textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + return true; +} +#endif +bool tiejiaojianece(std::shared_ptr data, RuanLianJie_majiatiejiao * _detParams, sx_581_address address) { + try { +#if 0 + /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ + cv::Mat resultImage = img2D.clone(); + if (resultImage.channels() == 1) { + cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); + } + QString okng_tag = "OK"; + cv::Mat seg_detectImage; + cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); + plcResult = "1"; + bool isNG = false; + if (DOGLIVE) { + std::vector>clsImgs; + bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); + for (int i = 0; i < clsImgs.size(); i++) { + addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); + } + } + if (isNG == false)//OK + { + putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); + okng_tag = "OK"; + } + else + { + putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); + plcResult = "2"; + } + cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); + resMat.push_back(resultImage); + if (resMat.size() > 0) + { + addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图 + addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 + } + addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 + + return true; + /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ +#else + //data->oriImgs[0] = cv::imread("D:\\testImage\\" + data->cameraKeyName + ".bmp",-1); + //存图数据加保存队列,加锁,避免数据访问冲突 + QByteArray plcResult = "2"; + cv::Mat sourceImg; + data->oriImgs[0].copyTo(sourceImg); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HDevEngineCpp::HDevProcedure proc("_3_Inspection_Packaging_Tape"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image; + in_Image = MatToHObject(sourceImg); + procedureCall.SetInputIconicParamObject("in_Image", in_Image); + procedureCall.Execute();//执行halcon程序 + + HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDetails; + out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle"); + out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle"); + out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails"); + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + + int flag = out_Flag.D(); + std::string NgDeTails = gbkToUtf8(out_NgDetails.ToString().Text()); + plcResult = "1"; + TextRendererZH textPainter(Paint.cols, Paint.rows, 500); + if (flag == 1) + { + int out_GlueRectangle_L = out_GlueRectangle.Length(); + for (auto i = 0; i < out_GlueRectangle_L / 4; i++) + cv::rectangle(Paint, + cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1], + out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]), + cv::Scalar(0, 255, 0), 5); + textPainter.putText(Paint, + "OK", + cv::Point(0, 50), cv::Scalar(0, 255, 0)); + } + else + { + int out_ErrRectangle_L = out_ErrRectangle.Length(); + for (auto i = 0; i < out_ErrRectangle_L / 4; i++) + cv::rectangle(Paint, + cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1], + out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]), + cv::Scalar(0, 0, 255), 10); + textPainter.putText(Paint,"NG",cv::Point(0, 50), cv::Scalar(0, 0, 255)); + textPainter.putText(Paint, NgDeTails, cv::Point(0, 550), cv::Scalar(0, 0, 255)); + plcResult = "2"; + } + if(data->service->_paramSyncManager->get("通用设置","强制OK",false).toBool()) + plcResult = "1"; + sourceImg.release(); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 + + return true; +#endif + } + CATCH_EXCEPTIONS + + qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + TextRendererZH textPainter(Paint.cols, Paint.rows, 500); + textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 0, 255)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool()) + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + else + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 + return true; +} +class _581_YuHan_hanqian : public mission { +public: + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_1; + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_2; + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_3; + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_4; + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_1; + _581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_2; + + RuanLianJie_majiatiejiao DetParams; + //RuanLianJie_majiatiejiao lvDetParams; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); + } + bool initCustom() { +#pragma region 注册触发器回调 + dingbu_1.init("Camera1", "马甲贴胶检测-A面-顶部相机-相机1", { { 5000, 1,{5010},"5002","5006",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-顶部相机-相机1"); + dingbu_2.init("Camera2", "马甲贴胶检测-B面-顶部相机-相机1", { { 5100, 1,{5110},"5102","5106",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-顶部相机-相机1"); + dibu_1.init("Camera3", "马甲贴胶检测-A面-底部相机-相机1", { { 5200, 1,{5210},"5202","5206",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机1"); + dibu_2.init("Camera4", "马甲贴胶检测-A面-底部相机-相机2", { { 5300, 1,{5310},"5302","5306",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机2"); + dibu_3.init("Camera5", "马甲贴胶检测-B面-底部相机-相机1", { { 5400, 1,{5410},"5402","5406",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机1"); + dibu_4.init("Camera6", "马甲贴胶检测-B面-底部相机-相机2", { { 5500, 1,{5510},"5502","5506",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机2"); + + + +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt b/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt new file mode 100644 index 0000000..76e9200 --- /dev/null +++ b/src/mission/581_RuanLianJie_majiatiejiao/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/service + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC OFF) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/interface.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp index 677e85d..24a06dd 100644 --- a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp +++ b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp @@ -38,7 +38,7 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra //搜索所有设备 int SearchDevice(){ - if (m_stIFList.nInterfaceNum != 0) { + if (m_stIFList.nInterfaceNum == 0) { const char* chCtiPath = "MvFGProducerXoF.cti";//.cti文件路径 int nRet = 0; nRet = MV_CC_EnumInterfacesByGenTL(&m_stIFList, chCtiPath);