diff --git a/include/global.h b/include/global.h index 874c535..81d4c34 100644 --- a/include/global.h +++ b/include/global.h @@ -8,7 +8,7 @@ #include #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251101-2.1.5"; +const std::string softwareVersion = "20251104-2.1.6"; 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 dd29758..50367be 100644 --- a/include/simpleAlgo.h +++ b/include/simpleAlgo.h @@ -2,6 +2,9 @@ #include #include #include +#include +#include +#include #pragma once using namespace HalconCpp; struct MatchResult { @@ -749,3 +752,25 @@ static cv::Mat tiledImages(std::vector& imgs) } return showMat; }; + +// 字符编码转换:GBK 编码的 std::string 转为 UTF-8 编码的 std::string(基于 Qt 5.14.x) +// 入参:gbkStr - GBK/GB2312/GB18030 字节序列(std::string 仅作为原始字节容器) +// 返回:UTF-8 编码的字节序列(std::string) +static inline std::string gbkToUtf8(const std::string& gbkStr) +{ + // 使用 Qt 的 QTextCodec 进行编码转换 + // 在 Windows 简体中文环境下,本地编码通常是 GBK/GB2312;此处显式指定 "GBK" + QTextCodec* codec = QTextCodec::codecForName("GBK"); + if (!codec) { + // 兜底:如果没有 GBK codec(极少见),退化为直接当作本地 8-bit 解码 + QString tmp = QString::fromLocal8Bit(gbkStr.data(), static_cast(gbkStr.size())); + QByteArray utf8 = tmp.toUtf8(); + return std::string(utf8.constData(), static_cast(utf8.size())); + } + + // 将 GBK 字节解码为 Unicode(QString) + QString unicode = codec->toUnicode(gbkStr.data(), static_cast(gbkStr.size())); + // 再编码为 UTF-8 + QByteArray utf8 = unicode.toUtf8(); + return std::string(utf8.constData(), static_cast(utf8.size())); +} diff --git a/include/sxGlobal.h b/include/sxGlobal.h index 35d99cf..7715181 100644 --- a/include/sxGlobal.h +++ b/include/sxGlobal.h @@ -25,7 +25,7 @@ struct sx_581_address { int triggerAddr = -1; int triggerValue = -1; - int snAddr; + std::vector snAddr; QByteArray completeAddr = "-1"; QByteArray resultAddr = "-1"; int valueOffsetAddr = -1; @@ -133,7 +133,15 @@ public: //获取图片并进行检测 void evaluate(int batteryOffset, QByteArray& byteArray) { _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(address[0].triggerAddr) + "_0");//触发信号清零 - std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1); + std::string sn; + + for (auto& snAddr : address[batteryOffset].snAddr) { + sn.append(_serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snAddr, false, false, -1)); + if (snAddr != address[batteryOffset].snAddr.back()) { + sn.append("_"); + } + } + auto camera = _serviceManager->_cameraManager->getCamera(cameraName);//获取相机 camera->clearCache();//清除缓存 std::shared_ptr data = _serviceManager->_detDataManager->createDetData( diff --git a/src/core/service/missionBase.hpp b/src/core/service/missionBase.hpp index d441eaf..2cd6b79 100644 --- a/src/core/service/missionBase.hpp +++ b/src/core/service/missionBase.hpp @@ -13,231 +13,6 @@ #include class detProcess; -class configMap { -public: - // 构造函数和析构函数 - configMap() = default; - configMap(const configMap& other) { - QMutexLocker locker(&mutex); - QMutexLocker otherLocker(&other.mutex); - data = other.data; - _missionJson = other._missionJson; - } - - configMap& operator=(const configMap& other) { - if (this != &other) { - QMutexLocker locker(&mutex); - QMutexLocker otherLocker(&other.mutex); - data = other.data; - _missionJson = other._missionJson; - } - return *this; - } - - // 插入或更新 - void set(const QString& key, const QVariant& value) { - QMutexLocker locker(&mutex); - data[key] = value; - } - - // 查询(带默认值) - QVariant get(const QString& key, const QVariant& defaultValue = QVariant()) const { - QMutexLocker locker(&mutex); - return data.value(key, defaultValue); - } - - // 类型安全的获取方法 - QString getString(const QString& key, const QString& defaultValue = QString()) const { - return get(key, defaultValue).toString(); - } - - int getInt(const QString& key, int defaultValue = 0) const { - return get(key, defaultValue).toInt(); - } - - bool getBool(const QString& key, bool defaultValue = false) const { - return get(key, defaultValue).toBool(); - } - - double getDouble(const QString& key, double defaultValue = 0.0) const { - return get(key, defaultValue).toDouble(); - } - - // 删除 - bool erase(const QString& key) { - QMutexLocker locker(&mutex); - return data.remove(key) > 0; - } - - // 检查是否包含键 - bool contains(const QString& key) const { - QMutexLocker locker(&mutex); - return data.contains(key); - } - - // 检查是否为空 - bool isEmpty() const { - QMutexLocker locker(&mutex); - return data.isEmpty(); - } - - // 获取大小 - int size() const { - QMutexLocker locker(&mutex); - return data.size(); - } - - // 清空所有数据 - void clear() { - QMutexLocker locker(&mutex); - data.clear(); - } - - // 获取所有键 - QList keys() const { - QMutexLocker locker(&mutex); - return data.keys(); - } - - // 获取所有值 - QList values() const { - QMutexLocker locker(&mutex); - return data.values(); - } - - // 操作符重载 - QVariant& operator[](const QString& key) { - QMutexLocker locker(&mutex); - return data[key]; - } - - const QVariant operator[](const QString& key) const { - QMutexLocker locker(&mutex); - return data.value(key); - } - - // 批量设置 - void setMultiple(const QMap& keyValues) { - QMutexLocker locker(&mutex); - for (auto it = keyValues.begin(); it != keyValues.end(); ++it) { - data[it.key()] = it.value(); - } - } - - // 批量获取 - QMap getMultiple(const QStringList& keys) const { - QMutexLocker locker(&mutex); - QMap result; - for (const QString& key : keys) { - if (data.contains(key)) { - result[key] = data[key]; - } - } - return result; - } - - bool loadFromJson(nlohmann::ordered_json& jsonData) { - QMutexLocker locker(&mutex); - try { - _missionJson = jsonData; - data.clear(); - for (auto it = jsonData.begin(); it != jsonData.end(); ++it) { - QString key = QString::fromStdString(it.key()); - if (it.value().is_string()) { - data[key] = QString::fromStdString(it.value()); - } else if (it.value().is_number_integer()) { - data[key] = static_cast(it.value()); - } else if (it.value().is_boolean()) { - data[key] = static_cast(it.value()); - } else if (it.value().is_number_float()) { - data[key] = static_cast(it.value()); - } else { - data[key] = QString::fromStdString(it.value().dump()); - } - } - return true; - } catch (...) { - return false; - } - return false; - } - - // 从现有的_missionJson加载配置 - void loadFromMissionJson() { - QMutexLocker locker(&mutex); - try { - for (auto it = _missionJson.begin(); it != _missionJson.end(); ++it) { - QString key = QString::fromStdString(it.key()); - if (it.value().is_string()) { - data[key] = QString::fromStdString(it.value()); - } else if (it.value().is_number_integer()) { - data[key] = static_cast(it.value()); - } else if (it.value().is_boolean()) { - data[key] = static_cast(it.value()); - } else if (it.value().is_number_float()) { - data[key] = static_cast(it.value()); - } else { - data[key] = QString::fromStdString(it.value().dump()); - } - } - } catch (...) { - // 处理JSON解析错误 - } - } - - // 将当前配置保存到_missionJson - void saveToMissionJson() { - QMutexLocker locker(&mutex); - try { - _missionJson.clear(); - for (auto it = data.begin(); it != data.end(); ++it) { - QString key = it.key(); - QVariant value = it.value(); - - if (value.type() == QVariant::String) { - _missionJson[key.toStdString()] = value.toString().toStdString(); - } else if (value.type() == QVariant::Int) { - _missionJson[key.toStdString()] = value.toInt(); - } else if (value.type() == QVariant::Bool) { - _missionJson[key.toStdString()] = value.toBool(); - } else if (value.type() == QVariant::Double) { - _missionJson[key.toStdString()] = value.toDouble(); - } else { - _missionJson[key.toStdString()] = value.toString().toStdString(); - } - } - } catch (...) { - // 处理JSON转换错误 - } - } - - // 迭代器支持 - QMap::const_iterator begin() const { - QMutexLocker locker(&mutex); - return data.begin(); - } - - QMap::const_iterator end() const { - QMutexLocker locker(&mutex); - return data.end(); - } - - // 调试输出 - QString toString() const { - QMutexLocker locker(&mutex); - QStringList items; - for (auto it = data.begin(); it != data.end(); ++it) { - items << QString("%1: %2").arg(it.key(), it.value().toString()); - } - return QString("configMap{%1}").arg(items.join(", ")); - } - - nlohmann::ordered_json _missionJson; - -private: - QMap data; - mutable QMutex mutex; -}; class mission { public: @@ -253,7 +28,6 @@ public: virtual bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { return true; }; virtual QString command(QString& command) { return "NG"; }; void reloadConfig(nlohmann::ordered_json& _missionJson) { - _configMap.loadFromJson(_missionJson); onConfigReloaded(); } void reloadConfig() { @@ -265,7 +39,6 @@ protected: virtual bool initCustom() = 0; qtFuncBridge* bridge = nullptr; ServiceManager* _serviceManager = nullptr; - configMap _configMap; }; static QString snHex(QString sn) { diff --git a/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h b/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h index a6d7c26..94fa59e 100644 --- a/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h +++ b/src/mission/581-Dgh-DB-2/581-Dgh-DB-2.h @@ -4,11 +4,229 @@ #include #include #pragma region 算法 - +class GunYaHou2DParam { +public: + handdleAI::pSegmentation* seg = nullptr; + handdleAI::pClassification* cls = nullptr; + handdleAI::pDetection* det = nullptr; +}; using namespace HDevEngineCpp; -#pragma endregion +static bool generalAlgoTestDuanBian(std::shared_ptr data, detParams* _detParams, yh_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + data->customPath = "{imgSaveRootDir}/{yyyy-MM-dd}/{saveObjectName}{imageType}/{HH}H/{processResult}/"; + std::vector < std::string> defects = { "测试" }; + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() < 1) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return false; + } + if (data->oriImgs[0].rows == 100) { + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + cv::Mat Paint; + QMutex paintMutex; + clock_t start, finish; + start = clock(); + cv::Mat src1 = data->oriImgs[0]; + if (src1.channels() != 3) + cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); + else + src1.copyTo(Paint); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + textPainter.putText(Paint, "划伤", cv::Point(10, 10), cv::Scalar(0, 255, 0)); + cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.123");//发送数据1 + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.456");//发送数据2 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 + data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果 + return false; +} + +void exceptionResume(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address, QString why = "") { + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 +} +cv::Mat LocalCutImg_DET(handdleAI::pDetection* pDet, cv::Mat src, float zoom, int checkNameId, cv::Rect& cutRoi) +{ + cv::Mat dst; + cv::resize(src, dst, cv::Size(src.cols / zoom, src.rows / zoom)); + std::vector resultBox = pDet->Evaluate(dst); //结果为中心点+宽高 + + cv::Mat contourImg; + std::vector> contours; + //cv::threshold(dstImg, contourImg, pSeg->m_classes, 255, cv::THRESH_BINARY_INV); + //cv::findContours(contourImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + + cv::Mat roiImg; + + if (resultBox.size() <= 0) + { + cv::Mat rstMat = cv::Mat(100, 100, CV_8UC1, cv::Scalar(0, 0, 0)); + cutRoi = cv::Rect(0, 0, 100, 100); + return rstMat; + } + + double maxArea = 0; + int index = -1; + for (int j = 0; j < resultBox.size(); j++) + { + double area = resultBox[j].w * resultBox[j].h; + if (area >= maxArea) + { + maxArea = area; + index = j; + } + } + + /*cv::Rect rect = cv::boundingRect(contours[index]); + cv::rectangle(roiImg, cv::Rect(resultBox[j].x - resultBox[j].w / 2, resultBox[j].y - resultBox[j].h / 2, resultBox[j].w, resultBox[j].h), cv::Scalar(0, 0, 255), 5);*/ + int addpixel = 15; + + cutRoi.x = ((resultBox[index].x - resultBox[index].w / 2) * zoom); + cutRoi.y = ((resultBox[index].y - resultBox[index].h / 2) * zoom); + cutRoi.width = (resultBox[index].w * zoom); + cutRoi.height = (resultBox[index].h * zoom); + //cv::rectangle(src, cutRoi, cv::Scalar(0, 0, 255), 2, 8); + /* cutRoi.x = rect.x * zoom; + cutRoi.y = rect.y * zoom; + cutRoi.width = rect.width * zoom; + cutRoi.height = rect.height * zoom;*/ + + src(cutRoi).copyTo(roiImg); + return roiImg; +} +static std::vectordingGaiHanClsCut(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) +{ + std::vector result; + int splitCount = getMax(boundingBox.width, boundingBox.height) / getMax(boundingBox.width, boundingBox.height); + //std::cout << "splitCount" << splitCount; + if (splitCount > 2) {//大于2分段裁 + if (boundingBox.width > boundingBox.height) {//宽大于高,横着裁 + for (int i = 0; i < splitCount; i++) { + result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.height * i, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); + } + result.push_back(cutImg2Cls(cv::Rect(boundingBox.x + boundingBox.width - boundingBox.height, boundingBox.y, boundingBox.height, boundingBox.height), imgInput)); + } + else { + for (int i = 0; i < splitCount; i++) { + result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.width * i, boundingBox.width, boundingBox.width), imgInput)); + } + result.push_back(cutImg2Cls(cv::Rect(boundingBox.x, boundingBox.y + boundingBox.height - boundingBox.width, boundingBox.width, boundingBox.width), imgInput)); + } + return result; + } + else + return std::vector(1, cutImg2Cls(boundingBox, imgInput, targetSize)); +} +bool handleAiEvaluate(std::shared_ptr data, GunYaHou2DParam* _detParams,cv::Mat& srcImg, cv::Mat& showImg) { + bool handleAiResultIsOK = true; + clock_t start = clock(); + cv::Mat imgForDet; + srcImg.copyTo(imgForDet); + cv::Rect detRect; + cv::Mat det_Image = LocalCutImg_DET(_detParams->det, imgForDet, 1, 0, detRect); + //addImgToSaveStruct(det_Image, "0", savePath_sorce + "/" + SN + "_det_" + sdataTime_name + ".bmp");//保存seg图 + cv::Mat segImg = ~_detParams->seg->Evaluate(det_Image);//一定要取反,因为seg默认抓到的区域为黑色 + data->segOriginImgs.push_back(segImg); + clock_t stop = clock(); + std::vector>contours;//点集 + stop = clock(); + cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); // 寻找白色区域并储存为点集 + //QMutexLocker lock(showImgLocker);//加锁防止和halcon线程冲突 + int clsResult = 0; + for (int i = 0; i < contours.size(); i++)//遍历点集 + { + cv::Rect rect = cv::boundingRect(contours[i]);//最小外接矩形 + //if( (rect.height > 25 || rect.width > 50) && (rect.height > 10 && rect.width > 10))// 过滤 + if ((rect.height > 40 || rect.width > 100) && (rect.height > 30 && rect.width > 10)) + { + auto clsimgs = dingGaiHanClsCut(rect, det_Image); + bool isNg = false; + int cnt = 0; + for (auto& clsImg : clsimgs) + { + clsResult = _detParams->cls->Evaluate(clsImg);//cls检测 得出的是int型 从0开始 + if (clsResult == 1 || clsResult == 3) { + isNg = true; + } + //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/" + SN + "_cls" + QString::number(clsResult) + "_" + sdataTime_name + ".bmp"); + data->clsOriginImgs.push_back({std::to_string(clsResult),clsImg}); + cnt++; + drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); + } + if (isNg == true) + { + rectangle(showImg, cv::Rect{ rect.x + detRect.x,rect.y + detRect.y,rect.width ,rect.height }, cv::Scalar(0, 0, 255), 2, 8, 0); + //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); + handleAiResultIsOK = false; + } + else + { + if (clsResult == 2) + { + rectangle(showImg, cv::Rect{ rect.x + detRect.x,rect.y + detRect.y,rect.width ,rect.height }, cv::Scalar(0, 255, 255), 2, 8, 0); + //drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); + } + } + } + else + { + auto clsimgs = dingGaiHanClsCut(rect, det_Image); + int cnt = 0; + for (auto& clsImg : clsimgs) + { + data->clsOriginImgs.push_back({ std::to_string(clsResult),clsImg }); + //addImgToSaveStruct(clsImg, "0", savePath_sorce + "/CSSMALL_" + SN + "_" + sdataTime_name + ".bmp"); + cnt++; + drawContours(showImg(detRect), contours, i, cv::Scalar(0, 255, 0), 1); + } + } + } + return handleAiResultIsOK; +} +static bool GunYaHou2D(std::shared_ptr data, GunYaHou2DParam* _detParams, yh_581_address address) { + try { + cv::Mat sourceImg = data->oriImgs[0]; + cv::Mat Paint; + sourceImg.copyTo(Paint); + + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + handleAiEvaluate(data, _detParams,sourceImg,Paint); + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + } + CATCH_EXCEPTIONS + exceptionResume(data, _detParams, address,"算法异常"); + return true; +} +#pragma endregion class _581_Dgh : public mission { public: @@ -16,25 +234,30 @@ public: generalTrigger dgh_db_mh_2d_1; generalTrigger dgh_db_mh_2d_2; - generalTrigger dgh_db_gy_2d_1; - generalTrigger dgh_db_gy_2d_2; + _581_Union_triggerTemplate dgh_db_gy_2d_1; + _581_Union_triggerTemplate dgh_db_gy_2d_2; generalTrigger dgh_db_gy_3d_1; generalTrigger dgh_db_gy_3d_2; detParams _params; + std::vector _GunYaHou2DParam = std::vector(2); + bool initOnce = false; void onConfigReloaded() { HDevEngineCpp::HDevEngine myEngine; myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); + if (initOnce == false) { + initOnce = true; + } } bool initCustom(){ #pragma region 注册触发器回调 满焊 - dgh_db_mh_2d_1.init("Camera1", "短边满焊前2D-1", 18400,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_mh_2d_2.init("Camera2", "短边满焊前2D-2", 18600,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_gy_2d_1.init("Camera3", "短边滚压后2D-1", 19200,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_gy_2d_2.init("Camera4", "短边滚压后2D-2", 19400,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_gy_3d_1.init("Camera5", "短边滚压后3D-1", 19600,4,1, &_params, _serviceManager, bridge, generalAlgoTest); - dgh_db_gy_3d_2.init("Camera6", "短边滚压后3D-2", 19800,4,1, &_params, _serviceManager, bridge, generalAlgoTest); + dgh_db_mh_2d_1.init("Camera1", "短边满焊前2D-1", 18400,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); + dgh_db_mh_2d_2.init("Camera2", "短边满焊前2D-2", 18600,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "满焊前2D"); + dgh_db_gy_2d_1.init("Camera3", "短边滚压后2D-1-外侧", 19200,4,1, &_GunYaHou2DParam[0], _serviceManager, bridge, GunYaHou2D, "滚压后2D"); + dgh_db_gy_2d_2.init("Camera4", "短边滚压后2D-2-内侧", 19400,4,1, &_GunYaHou2DParam[1], _serviceManager, bridge, GunYaHou2D, "滚压后2D"); + dgh_db_gy_3d_1.init("Camera5", "短边滚压后3D-1", 19600,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "滚压后3D"); + dgh_db_gy_3d_2.init("Camera6", "短边滚压后3D-2", 19800,4,1, &_params, _serviceManager, bridge, generalAlgoTestDuanBian, "滚压后3D"); #pragma endregion return true; } diff --git a/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h b/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h index 24e91d3..f1b5230 100644 --- a/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h +++ b/src/mission/581_YiCiZhuYe_canye/581_YiCiZhuYe_canye.h @@ -42,9 +42,9 @@ public: bool initCustom() { #pragma region 注册触发器回调 - cam_1.init("Camera1", "残液检测-相机1", { { 1900, 1,1800,"1910","1920"} }, 1, &canyeDetParams[0], _serviceManager, bridge, yizhuCanYe); - cam_2.init("Camera2", "残液检测-相机2", { { 1901, 1,1830,"1911","1921"} }, 1, &canyeDetParams[1], _serviceManager, bridge, yizhuCanYe); - cam_3.init("Camera3", "残液检测-相机3", { { 1902, 1,1850,"1912","1922"} }, 1, &canyeDetParams[2], _serviceManager, bridge, yizhuCanYe); + cam_1.init("Camera1", "残液检测-相机1", { { 1900, 1,{1800},"1910","1920"} }, 1, &canyeDetParams[0], _serviceManager, bridge, yizhuCanYe); + cam_2.init("Camera2", "残液检测-相机2", { { 1901, 1,{1830},"1911","1921"} }, 1, &canyeDetParams[1], _serviceManager, bridge, yizhuCanYe); + cam_3.init("Camera3", "残液检测-相机3", { { 1902, 1,{1850},"1912","1922"} }, 1, &canyeDetParams[2], _serviceManager, bridge, yizhuCanYe); #pragma endregion return true; diff --git a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h index 3b54e5d..558aeb1 100644 --- a/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h +++ b/src/mission/581_YuHan_hanhou/581_YuHan_hanhou.h @@ -67,27 +67,27 @@ public: } bool initCustom() { #pragma region 注册触发器回调 - if (_configMap["hanhou"] == "OUT") { - lv_top90_1.init("Camera1", "极耳尺寸-外-铝-相机1(顶部90°)", { { 522, 1,540,"523","530",820} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); - lv_down90_2.init("Camera2", "极耳尺寸-外-铝-相机2(底部90°)", { { 524, 1,540,"525","532",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); - tong_top90_3.init("Camera3", "极耳尺寸-外-铜-相机3(顶部90°)", { { 526,1,540,"527","534",800} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); - tong_down90_4.init("Camera4", "极耳尺寸-外-铜-相机4(底部90°)", { { 528, 1,540,"529","536",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); + if (_serviceManager->_paramSyncManager->get("hanhou","OUT") == "OUT") { + lv_top90_1.init("Camera1", "极耳尺寸-外-铝-相机1(顶部90°)", { { 522, 1,{540},"523","530",820} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); + lv_down90_2.init("Camera2", "极耳尺寸-外-铝-相机2(底部90°)", { { 524, 1,{540},"525","532",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); + tong_top90_3.init("Camera3", "极耳尺寸-外-铜-相机3(顶部90°)", { { 526,1,{540},"527","534",800} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); + tong_down90_4.init("Camera4", "极耳尺寸-外-铜-相机4(底部90°)", { { 528, 1,{540},"529","536",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); - lv_top45_5.init("Camera5", "底部撕裂-外-铝-相机5(顶部45°)", { { 562,1,540,"563","570",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); - lv_down45_6.init("Camera6", "底部撕裂-外-铝-相机6(底部45°)", { { 564, 1,540,"565","572",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); - tong_top45_7.init("Camera7", "底部撕裂-外-铜-相机7(顶部45°)", { { 566, 1,540,"567","574",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); - tong_down45_8.init("Camera8", "底部撕裂-外-铜-相机8(底部45°)", { { 568, 1,540,"569","576",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); + lv_top45_5.init("Camera5", "底部撕裂-外-铝-相机5(顶部45°)", { { 562,1,{540},"563","570",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); + lv_down45_6.init("Camera6", "底部撕裂-外-铝-相机6(底部45°)", { { 564, 1,{540},"565","572",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); + tong_top45_7.init("Camera7", "底部撕裂-外-铜-相机7(顶部45°)", { { 566, 1,{540},"567","574",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); + tong_down45_8.init("Camera8", "底部撕裂-外-铜-相机8(底部45°)", { { 568, 1,{540},"569","576",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); } else { - lv_top90_1.init("Camera1", "极耳尺寸-内-铝-相机1(顶部90°)", { { 602, 1,580,"603","610",860} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); - lv_down90_2.init("Camera2", "极耳尺寸-内-铝-相机2(底部90°)", { { 604, 1,580,"605","612",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); - tong_top90_3.init("Camera3", "极耳尺寸-内-铜-相机3(顶部90°)", { { 606,1,580,"607","614",840} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); - tong_down90_4.init("Camera4", "极耳尺寸-内-铜-相机4(底部90°)", { { 608, 1,580,"609","616",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); + lv_top90_1.init("Camera1", "极耳尺寸-内-铝-相机1(顶部90°)", { { 602, 1,{580},"603","610",860} }, 1, &lvDetParams[0], _serviceManager, bridge, hanHouCeLiang); + lv_down90_2.init("Camera2", "极耳尺寸-内-铝-相机2(底部90°)", { { 604, 1,{580},"605","612",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, hanHouDown); + tong_top90_3.init("Camera3", "极耳尺寸-内-铜-相机3(顶部90°)", { { 606,1,{580},"607","614",840} }, 1, &tongDetParams[0], _serviceManager, bridge, hanHouCeLiang); + tong_down90_4.init("Camera4", "极耳尺寸-内-铜-相机4(底部90°)", { { 608, 1,{580},"609","616",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, hanHouDown); - lv_top45_5.init("Camera5", "底部撕裂-内-铝-相机5(顶部45°)", { { 642,1,580,"643","650",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); - lv_down45_6.init("Camera6", "底部撕裂-内-铝-相机6(底部45°)", { { 644, 1,580,"645","652",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); - tong_top45_7.init("Camera7", "底部撕裂-内-铜-相机7(顶部45°)", { { 646, 1,580,"647","654",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); - tong_down45_8.init("Camera8", "底部撕裂-内-铜-相机8(底部45°)", { { 648, 1,580,"649","656",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); + lv_top45_5.init("Camera5", "底部撕裂-内-铝-相机5(顶部45°)", { { 642,1,{580},"643","650",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, hanHouDown); + lv_down45_6.init("Camera6", "底部撕裂-内-铝-相机6(底部45°)", { { 644, 1,{580},"645","652",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, hanHouDown); + tong_top45_7.init("Camera7", "底部撕裂-内-铜-相机7(顶部45°)", { { 646, 1,{580},"647","654",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, hanHouDown); + tong_down45_8.init("Camera8", "底部撕裂-内-铜-相机8(底部45°)", { { 648, 1,{580},"649","656",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, hanHouDown); } #pragma endregion return true; diff --git a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h index 46ae801..d0bf975 100644 --- a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h +++ b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h @@ -242,15 +242,15 @@ public: } bool initCustom() { #pragma region 注册触发器回调 - in_lv_top_1.init("Camera1", "极耳翻折-铝-内-相机1(顶部)", { { 682, 1,760,"683","670",-1} }, 1, &lvDetParams[0], _serviceManager, bridge, jiErFanZhe); - in_lv_down_2.init("Camera2", "极耳翻折-铝-内-相机2(底部)", { { 684, 1,760,"685","672",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, jiErFanZhe); - in_tong_top_3.init("Camera3", "极耳翻折-铜-内-相机3(顶部)", { { 686,1,760,"687","674",-1} }, 1, &tongDetParams[0], _serviceManager, bridge, jiErFanZhe); - in_tong_down_4.init("Camera4", "极耳翻折-铜-内-相机4(底部)", { { 688, 1,760,"689","676",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, jiErFanZhe); + in_lv_top_1.init("Camera1", "极耳翻折-铝-内-相机1(顶部)", { { 682, 1,{760},"683","670",-1} }, 1, &lvDetParams[0], _serviceManager, bridge, jiErFanZhe); + in_lv_down_2.init("Camera2", "极耳翻折-铝-内-相机2(底部)", { { 684, 1,{760},"685","672",-1} }, 1, &lvDetParams[1], _serviceManager, bridge, jiErFanZhe); + in_tong_top_3.init("Camera3", "极耳翻折-铜-内-相机3(顶部)", { { 686,1,{760},"687","674",-1} }, 1, &tongDetParams[0], _serviceManager, bridge, jiErFanZhe); + in_tong_down_4.init("Camera4", "极耳翻折-铜-内-相机4(底部)", { { 688, 1,{760},"689","676",-1} }, 1, &tongDetParams[1], _serviceManager, bridge, jiErFanZhe); - out_lv_top_5.init("Camera5", "极耳翻折-铝-外-相机5(顶部)", { { 702,1,720,"703","710",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, jiErFanZhe); - out_lv_down_6.init("Camera6", "极耳翻折-铝-外-相机6(底部)", { { 704, 1,720,"705","712",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, jiErFanZhe); - out_tong_top_7.init("Camera7", "极耳翻折-铜-外-相机7(顶部)", { { 706, 1,720,"707","714",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, jiErFanZhe); - out_tong_down_8.init("Camera8", "极耳翻折-铜-外-相机8(底部)", { { 708, 1,720,"709","716",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, jiErFanZhe); + out_lv_top_5.init("Camera5", "极耳翻折-铝-外-相机5(顶部)", { { 702,1,{720},"703","710",-1} }, 1, &lvDetParams[2], _serviceManager, bridge, jiErFanZhe); + out_lv_down_6.init("Camera6", "极耳翻折-铝-外-相机6(底部)", { { 704, 1,{720},"705","712",-1} }, 1, &lvDetParams[3], _serviceManager, bridge, jiErFanZhe); + out_tong_top_7.init("Camera7", "极耳翻折-铜-外-相机7(顶部)", { { 706, 1,{720},"707","714",-1} }, 1, &tongDetParams[2], _serviceManager, bridge, jiErFanZhe); + out_tong_down_8.init("Camera8", "极耳翻折-铜-外-相机8(底部)", { { 708, 1,{720},"709","716",-1} }, 1, &tongDetParams[3], _serviceManager, bridge, jiErFanZhe); #pragma endregion return true; } diff --git a/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h b/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h index 4004ae5..163e625 100644 --- a/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h +++ b/src/mission/581_ZhongHan_hanhou/581_ZhongHan_hanhou.h @@ -84,15 +84,15 @@ public: } bool initCustom() { #pragma region 注册触发器回调 - lv_top_1.init("Camera1", "焊印检测-内-铜-相机1(90°)", { { 5360, 1,5340,"5362","5364",-1} }, 1, &tongZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang); - lv_left45_2.init("Camera2", "翻折撕裂-内-铜-相机2(45°)", { { 5370, 1,5340,"5372","5374",-1} }, 1, &tongZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian); - lv_right45_3.init("Camera3", "翻折撕裂-内-铜-相机3(45°)", { { 5380,1,5340,"5382","5384",5406} }, 1, &tongZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian); - _3D_1.init("Camera4", "焊后检测-3D相机1" , { { 5400, 1,5340,"5402","5404",-1} }, 1, &tongZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D); + lv_top_1.init("Camera1", "焊印检测-内-铜-相机1(90°)", { { 5360, 1,{5340},"5362","5364",-1} }, 1, &tongZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang); + lv_left45_2.init("Camera2", "翻折撕裂-内-铜-相机2(45°)", { { 5370, 1,{5340},"5372","5374",-1} }, 1, &tongZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian); + lv_right45_3.init("Camera3", "翻折撕裂-内-铜-相机3(45°)", { { 5380,1,{5340},"5382","5384",5406} }, 1, &tongZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian); + _3D_1.init("Camera4", "焊后检测-3D相机1" , { { 5400, 1,{5340},"5402","5404",-1} }, 1, &tongZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D); - tong_top_5.init("Camera5", "焊印检测-外-铝-相机5(90°)", { { 5440, 1,5420,"5442","5444",-1} }, 1, &lvZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang); - tong_left45_6.init("Camere6", "翻折撕裂-外-铝-相机6(45°)", { { 5450,1,5420,"5452","5454",-1} }, 1, &lvZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian); - tong_right45_7.init("Camera7", "翻折撕裂-外-铝-相机7(45°)", { { 5460, 1,5420,"5462","5464",5486} }, 1, &lvZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian); - _3D_2.init("Camera8", "焊后检测-3D相机2", { { 5480, 1,5420,"5482","5484",-1} }, 1, &lvZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D); + tong_top_5.init("Camera5", "焊印检测-外-铝-相机5(90°)", { { 5440, 1,{5420},"5442","5444",-1} }, 1, &lvZhongHan2dCeLiangParams, _serviceManager, bridge, zhongHan_hanHouCeLiang); + tong_left45_6.init("Camere6", "翻折撕裂-外-铝-相机6(45°)", { { 5450,1,{5420},"5452","5454",-1} }, 1, &lvZhongHan2dCeMianParams[0], _serviceManager, bridge, zhongHan_hanHouCeMian); + tong_right45_7.init("Camera7", "翻折撕裂-外-铝-相机7(45°)", { { 5460, 1,{5420},"5462","5464",5486} }, 1, &lvZhongHan2dCeMianParams[1], _serviceManager, bridge, zhongHan_hanHouCeMian); + _3D_2.init("Camera8", "焊后检测-3D相机2", { { 5480, 1,{5420},"5482","5484",-1} }, 1, &lvZhongHan3DParams, _serviceManager, bridge, zhongHan_hanHou3D); #pragma endregion return true; } diff --git a/subModule/Hd_CameraModule_HIK_hard_PCIE/Hd_CameraModule_HIK_hard_PCIE.cpp b/subModule/Hd_CameraModule_HIK_hard_PCIE/Hd_CameraModule_HIK_hard_PCIE.cpp index 4f30253..1abe4b2 100644 --- a/subModule/Hd_CameraModule_HIK_hard_PCIE/Hd_CameraModule_HIK_hard_PCIE.cpp +++ b/subModule/Hd_CameraModule_HIK_hard_PCIE/Hd_CameraModule_HIK_hard_PCIE.cpp @@ -340,8 +340,8 @@ void CloseDevice() return; unsigned int nRet = MV_CC_StopGrabbing(handle); if (nRet == 0) { - MV_CC_CloseDevice(handle); - MV_CC_DestroyHandle(handle); + //MV_CC_CloseDevice(handle); + //MV_CC_DestroyHandle(handle); } //nRet = MV_CC_CloseDevice(handle); //nRet = MV_CC_DestroyHandle(handle); diff --git a/subModule/Hd_CameraModule_HIK_hard_USB/Hd_CameraModule_HIK_hard_USB.cpp b/subModule/Hd_CameraModule_HIK_hard_USB/Hd_CameraModule_HIK_hard_USB.cpp index 679fdfa..1559841 100644 --- a/subModule/Hd_CameraModule_HIK_hard_USB/Hd_CameraModule_HIK_hard_USB.cpp +++ b/subModule/Hd_CameraModule_HIK_hard_USB/Hd_CameraModule_HIK_hard_USB.cpp @@ -114,7 +114,7 @@ int SearchDevice() for (int i = 0; i < m_stDevList.nDeviceNum; i++) { //SN - unsigned char* name = m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.chSerialNumber; + unsigned char* name = m_stDevList.pDeviceInfo[i]->SpecialInfo.stUsb3VInfo.chSerialNumber; //userID //unsigned char* name=m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.chUserDefinedName; string userName = static_cast((LPCSTR)name);