diff --git a/src/core/service/imgSaveThreadManager.h b/src/core/service/imgSaveThreadManager.h index d26cdeb..ac50b40 100644 --- a/src/core/service/imgSaveThreadManager.h +++ b/src/core/service/imgSaveThreadManager.h @@ -254,19 +254,19 @@ public: imgSaveThreadManager(std::string pathIn, paramSyncManager* paramSyncManagerIn) { _ImageSavePathFormatter.rootDir = QString::fromStdString(pathIn); _paramSyncManager = paramSyncManagerIn; - saveOri = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储原图", true).toBool(); - saveRes = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储结果图", true).toBool(); - saveSeg = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储Seg图", true).toBool(); - saveCls = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储Cls图", true).toBool(); + saveOri = _paramSyncManager->get("通用设置", "存储原图", true).toBool(); + saveRes = _paramSyncManager->get("通用设置", "存储结果图", true).toBool(); + saveSeg = _paramSyncManager->get("通用设置", "存储Seg图", true).toBool(); + saveCls = _paramSyncManager->get("通用设置", "存储Cls图", true).toBool(); } ~imgSaveThreadManager() {}; imgSaveThread saveThread; void saveImage(std::shared_ptr data) { if (getParamTimer.elapsed() > 5000) { - saveOri = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储原图", true).toBool(); - saveRes = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储结果图", true).toBool(); - saveSeg = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储Seg图", true).toBool(); - saveCls = _paramSyncManager->get(_paramSyncManager->getGroup(0), "存储Cls图", true).toBool(); + saveOri = _paramSyncManager->get("通用设置", "存储原图", true).toBool(); + saveRes = _paramSyncManager->get("通用设置", "存储结果图", true).toBool(); + saveSeg = _paramSyncManager->get("通用设置", "存储Seg图", true).toBool(); + saveCls = _paramSyncManager->get("通用设置", "存储Cls图", true).toBool(); getParamTimer.restart(); } diff --git a/src/core/service/paramSyncManager.h b/src/core/service/paramSyncManager.h index 9ba2fd8..f1c56c4 100644 --- a/src/core/service/paramSyncManager.h +++ b/src/core/service/paramSyncManager.h @@ -76,8 +76,15 @@ public: QMutexLocker locker(&globalMutex); std::vector> result; updateJsonFromMap(); - for (auto it = map.begin(); it != map.end(); ++it) { - result.emplace_back(it.key(), it.value()); + for (auto it = json.begin(); it != json.end(); ++it) { + if (it->is_object()) { + std::string groupKey = it.key(); + for (auto it = json[groupKey].begin(); it != json[groupKey].end(); ++it) { + QString key = QString::fromStdString(it.key()); + QVariant value = jsonToQVariant(it.value()); + result.emplace_back(QString::fromStdString(groupKey) + "." + key, value); + } + } } return result; } @@ -126,14 +133,16 @@ public: } for (auto missionIt = jsonInput.begin(); missionIt != jsonInput.end(); ++missionIt) { - QString groupName = QString::fromStdString(missionIt.key()); - missionKey.push_back(groupName); + if (missionIt->is_object()) { + QString groupName = QString::fromStdString(missionIt.key()); + missionKey.push_back(groupName); - const auto& innerObject = *missionIt; - for (auto innerIt = innerObject.begin(); innerIt != innerObject.end(); ++innerIt) { - QString key = groupName + "." + QString::fromStdString(innerIt.key()); - QVariant value = jsonToQVariant(innerIt.value()); - map.insert(key, value); + const auto& innerObject = *missionIt; + for (auto innerIt = innerObject.begin(); innerIt != innerObject.end(); ++innerIt) { + QString key = groupName + "." + QString::fromStdString(innerIt.key()); + QVariant value = jsonToQVariant(innerIt.value()); + map.insert(key, value); + } } } } diff --git a/src/cutImage/CMakeLists.txt b/src/cutImage/CMakeLists.txt new file mode 100644 index 0000000..92e41bf --- /dev/null +++ b/src/cutImage/CMakeLists.txt @@ -0,0 +1,69 @@ +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) +STRING(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) +set(DLL_NAMES "halcon" "opencv" "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( + ${ENV_INCLUDE} + ${PROJECT_ROOT_PATH}/lib/${CMAKE_BUILD_TYPE} +) + +link_directories ( + ${ENV_LIB} +) +add_compile_options(/utf-8) +# qt引用 +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC OFF) +set(CMAKE_AUTORCC ON) + +find_package(Qt5 COMPONENTS ${qtlist} REQUIRED ) +foreach(item ${qtlist}) + list(APPEND lib_list Qt5::${item}) +endforeach() + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp") + + +FILE(GLOB_RECURSE APP_HEADERPP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp" ) +FILE(GLOB_RECURSE APP_HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h" ) +FILE(GLOB_RECURSE APP_SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +set(RESOURCES_DIR ${CMAKE_SOURCE_DIR}/resources/resources.qrc) +set(WIN_RC_DIR ${CMAKE_SOURCE_DIR}/resources/ff.rc) +include_directories(${CMAKE_BINARY_DIR}) +add_executable( ${CURRENT_FOLDER} + ${APP_HEADERPP_FILES} + ${APP_HEADER_FILES} + ${APP_SRC_FILES} + ${BREAKPAD_WINDOWS_CC_FILES} + ${APP_UI_FILES} + ${WIN_RC_DIR} + ${RESOURCES_DIR} ) +# 添加预处理定义 + +SET(ALL_DLL + ${ENV_TARGET} + ${lib_list} +) +#add_custom_target( +# run_cmd ALL +# COMMAND cmd /c "${ENVPATH}/qt5/bin/moc.exe ${PROJECT_ROOT_PATH}/include/frontendSignalHub.h -o ${CMAKE_CURRENT_SOURCE_DIR}/moc_qtBridge.cpp" +# COMMENT "Running command on every build" +#) +message("all_lib :" ${ALL_DLL}) +target_link_libraries(${CURRENT_FOLDER} ${ALL_DLL} ) +string(TIMESTAMP RUN_TIME) +message("C++ Standard: ${CMAKE_CXX_STANDARD}") +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) \ No newline at end of file diff --git a/src/cutImage/baoMo.hpp b/src/cutImage/baoMo.hpp new file mode 100644 index 0000000..7c6ab22 --- /dev/null +++ b/src/cutImage/baoMo.hpp @@ -0,0 +1,21 @@ +#include +#include +#include +using namespace std; + + +void baomoXiaDMianCut(const std::string path, const std::string format, const std::string outputPath) { + //int + //handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImgFiles/baoMoXiaDaMian_seg.BHD", 1, 0); + //std::vector images; + //cv::glob(path + "/*." + format, images, false); + //for (size_t i = 0; i < images.size(); i++) { + // cv::Mat srcImage = cv::imread(images[i],-1); + // if (srcImage.empty()) { + // std::cout << "ͼƬΪ¿գ¡" << std::endl; + // continue; + // } + // auto SegResult = ~seg->Evaluate(srcImage); + + //} +} \ No newline at end of file diff --git a/src/cutImage/main.cpp b/src/cutImage/main.cpp new file mode 100644 index 0000000..0b3a49d --- /dev/null +++ b/src/cutImage/main.cpp @@ -0,0 +1,7 @@ +#include + +int main(int argc, char* argv[]) +{ + std::cout << "hello world" << std::endl; + return 1; +} \ No newline at end of file diff --git a/src/launcher/GUI/pages/settingWidget.h b/src/launcher/GUI/pages/settingWidget.h index a3f9157..578121e 100644 --- a/src/launcher/GUI/pages/settingWidget.h +++ b/src/launcher/GUI/pages/settingWidget.h @@ -19,7 +19,6 @@ #include #include #include -#include "git_version.h" #include #include #include diff --git a/src/launcher/GUI/paramEditorDialog.h b/src/launcher/GUI/paramEditorDialog.h index 00df9c9..4fd03aa 100644 --- a/src/launcher/GUI/paramEditorDialog.h +++ b/src/launcher/GUI/paramEditorDialog.h @@ -65,8 +65,13 @@ public: void setParams(std::vector> params) { //保存所有参数 - m_allParams = params; - + for(auto& data : params) { + m_allParams.insert(data.first, data.second); + } + //生成参数修改控件的缓存 + //for (auto& it = params.begin(); it != params.end(); it++) { + // m_paramsEditItemsCache.insert(it->first, createEditorWidget(it->second, it->second.type())); + //} //清空现有数据 m_tableModel->setRowCount(0); m_editorWidgets.clear(); @@ -76,7 +81,7 @@ public: //提取分组信息 QSet groups; - QMap>> groupedParams; + QMap> groupedParams; for (auto& data : params) { const QString& fullKey = data.first; @@ -89,7 +94,7 @@ public: } groups.insert(groupName); - groupedParams[groupName].push_back(data); + groupedParams[groupName].push_back(fullKey); } //添加分组到侧边栏 @@ -103,9 +108,11 @@ public: } //保存分组参数 - m_groupedParams = groupedParams; - m_groupedParams["所有参数"] = params;// 添加所有参数选项 - + m_groupedParamsNames = groupedParams; + for (auto& it = params.begin(); it != params.end(); it++) { + m_groupedParamsNames["所有参数"].push_back(it->first); + } + //默认显示所有参数 displayGroupParams("所有参数"); @@ -116,51 +123,65 @@ public: private slots: void onAccept() { - std::vector> result; - - for (int row = 0; row < m_tableModel->rowCount(); ++row) { - QStandardItem* keyItem = m_tableModel->item(row, 0); - if (!keyItem) { - QMessageBox::warning(this, "错误", QString("第 %1 行数据不完整").arg(row + 1)); - return; - } - - QString fullKey = keyItem->data(Qt::UserRole).toString();//获取完整键名 - if (fullKey.isEmpty()) { - QMessageBox::warning(this, "错误", QString("第 %1 行 key 为空").arg(row + 1)); - return; - } - - //解析分组组名和参数名 - QString group, name; - int dotIndex = fullKey.indexOf('.'); - if (dotIndex != -1) { - group = fullKey.left(dotIndex); - name = fullKey.mid(dotIndex + 1); - } - else { - group = "默认分组"; - name = fullKey; - } - - // 获取原始类型 - if (m_originalTypes.find(fullKey) == m_originalTypes.end()) { - QMessageBox::warning(this, "错误", QString("第 %1 行找不到原始类型信息").arg(row + 1)); - return; - } - - auto expectedType = m_originalTypes[fullKey]; - + //更新当前数据 + for (auto& it : m_editorWidgets) { + auto expectedType = m_originalTypes[it.first]; // 从编辑器获取值 QVariant convertedValue; QString errorMsg; - if (!getValueFromEditor(fullKey, expectedType, convertedValue, errorMsg)) { - QMessageBox::critical(this, "类型验证失败", QString("第 %1 行值验证失败:\n%2").arg(row + 1).arg(errorMsg)); - return; + if (!getValueFromEditor(it.first, expectedType, convertedValue, errorMsg)) { + qCritical() << (this, "本地类型验证失败", QString("%1值验证失败:\n%2").arg(it.first).arg(errorMsg)); + continue; } + if (m_allParams.contains(it.first)) { + m_allParams[it.first] = convertedValue; + } + } + std::vector> result; + + for (auto& it = m_allParams.begin(); it != m_allParams.end(); it++) { + //解析分组组名和参数名 + QString group, name; + int dotIndex = it.key().indexOf('.'); + if (dotIndex != -1) { + group = it.key().left(dotIndex); + name = it.key().mid(dotIndex + 1); + } + else { + group = "默认分组"; + name = it.key(); + } + emit fSignalHub::getInstance()->editParam(group, name, it.value()); + //QStandardItem* keyItem = m_tableModel->item(row, 0); + //if (!keyItem) { + // QMessageBox::warning(this, "错误", QString("第 %1 行数据不完整").arg(row + 1)); + // return; + //} + + //QString fullKey = keyItem->data(Qt::UserRole).toString();//获取完整键名 + //if (fullKey.isEmpty()) { + // QMessageBox::warning(this, "错误", QString("第 %1 行 key 为空").arg(row + 1)); + // return; + //} + + //// 获取原始类型 + //if (m_originalTypes.find(fullKey) == m_originalTypes.end()) { + // QMessageBox::warning(this, "错误", QString("第 %1 行找不到原始类型信息").arg(row + 1)); + // return; + //} + + //auto expectedType = m_originalTypes[fullKey]; + + //// 从编辑器获取值 + //QVariant convertedValue; + //QString errorMsg; + //if (!getValueFromEditor(fullKey, expectedType, convertedValue, errorMsg)) { + // QMessageBox::critical(this, "类型验证失败", QString("第 %1 行值验证失败:\n%2").arg(row + 1).arg(errorMsg)); + // return; + //} // 发送参数编辑信号 - emit fSignalHub::getInstance()->editParam(group, name, convertedValue); + //emit fSignalHub::getInstance()->editParam(group, name, convertedValue); } this->close(); delete this; @@ -187,8 +208,10 @@ private: QFrame* m_dividerLine; // 参数数据 - std::vector> m_allParams; - QMap>> m_groupedParams; + QMap m_allParams; + QMap> m_groupedParamsNames;//分组 名字 + //QMap m_paramsEditItemsCache; + void createSidebar() { m_sidebarWidget = new QWidget(this); @@ -367,20 +390,33 @@ private: // 清空表格 m_tableModel->setRowCount(0); + for(auto& it:m_editorWidgets) { + auto expectedType = m_originalTypes[it.first]; + // 从编辑器获取值 + QVariant convertedValue; + QString errorMsg; + if (!getValueFromEditor(it.first, expectedType, convertedValue, errorMsg)) { + qCritical()<<(this, "本地类型验证失败", QString("%1值验证失败:\n%2").arg(it.first).arg(errorMsg)); + continue; + } + if(m_allParams.contains(it.first)) { + m_allParams[it.first] = convertedValue; + } + } m_editorWidgets.clear(); - if (!m_groupedParams.contains(groupName)) { + if (!m_groupedParamsNames.contains(groupName)) { return; } - const auto& params = m_groupedParams[groupName]; + const auto& params = m_groupedParamsNames[groupName]; int row = 0; for (auto data : params) { m_tableModel->insertRow(row); - const QString& fullKey = data.first; - const QVariant& value = data.second; + const QString& fullKey = data; + const QVariant& value = m_allParams[fullKey]; QString displayName = fullKey; //分组显示,去掉分组前缀 @@ -432,7 +468,7 @@ private: case QVariant::Type::Int: { QSpinBox* spinBox = new QSpinBox(); spinBox->setMaximumWidth(160); - spinBox->setRange(-1e6, 1e6); + spinBox->setRange(INT_MIN, INT_MAX); spinBox->setValue(value.toInt()); spinBox->setToolTip(generateTypeHint(type)); return spinBox; @@ -441,6 +477,7 @@ private: QDoubleSpinBox* spinBox = new QDoubleSpinBox(); spinBox->setMaximumWidth(160); spinBox->setDecimals(3);//显示小位数 + spinBox->setRange(-1e6, 1e6); spinBox->setValue(value.toDouble()); spinBox->setToolTip(generateTypeHint(type)); return spinBox; diff --git a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h index 79d22d2..e6aa369 100644 --- a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h +++ b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h @@ -25,6 +25,7 @@ void exceptionResume(std::shared_ptr data, mfd_detParams* _detParams, y using namespace HDevEngineCpp; static bool ManHan(std::shared_ptr data, mfd_detParams* _detParams, yh_581_address address){ try { + data->service->_triggerManager->writeFloat("D100_1,2,3,4,5,6,7,8,9,9"); std::map sqlMapData; sqlMapData["项目"] = "满焊"; sqlMapData["相机"] = "相机" + address.triggerAddr; diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp index 574994d..73cb514 100644 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.cpp @@ -88,8 +88,8 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment if(out_Distance.Length() > 6) { double hanYin_Width = out_Distance[0].D();//焊印的宽度 double hanYin_Height = out_Distance[1].D();//焊印的高度 - double hanYIn_Area = out_Distance[2].D();//焊印的面积 - double jiEr_Width = out_Distance[3].D() * 0.013682 * 0.013682;//极耳的宽度 + double hanYIn_Area = out_Distance[2].D() * 0.013682 * 0.013682;//焊印的面积 + double jiEr_Width = out_Distance[3].D();//极耳的宽度 double jiEr_Height = out_Distance[4].D();//极耳的高度 double hanYin_Distance_Up = out_Distance[5].D();//焊印上边缘到极耳上边缘的距离 double hanYin_Distance_Down = out_Distance[6].D();//焊印下边缘到极耳下边缘的距离 @@ -114,10 +114,10 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment return result; } bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { - QByteArray plcResult = "2"; + QByteArray plcResult = "1"; try { + //data->oriImgs[0] = cv::imread("D:/testImage/L.bmp", -1); cv::Mat sourceImg = data->oriImgs[0]; - //sourceImg = cv::imread("./testImages/" + std::to_string(_detParams->cameraIndex) + ".bmp"); cv::Mat Paint; sourceImg.copyTo(Paint); @@ -163,31 +163,58 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams } else { textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4200, 50), cv::Scalar(0, 0, 255)); - plcResult = "2"; + //plcResult = "2"; data->aiDetOK = false; } - if (halconResult.result == true) { - textPainter.putText(Paint, "算法OK", cv::Point(4200, 350), cv::Scalar(0, 255, 0)); + + silieResultText = "1"; fanzheResultText = "1"; +#pragma region 判断结果以及储存结果 + double hanyinChangLimitHigh = data->service->_paramSyncManager->get("焊印长","焊印长(上限)", 30.5).toDouble(); + double hanyinChangLimitLow = data->service->_paramSyncManager->get("焊印长", "焊印长(下限)", 29.5).toDouble(); + bool hanyinChangEnable = data->service->_paramSyncManager->get("焊印长", "焊印长判定启用", false).toBool(); + + double hanyinKuanLimitHigh = data->service->_paramSyncManager->get("焊印宽", "焊印宽(上限)", 10.5).toDouble(); + double hanyinKuanLimitLow = data->service->_paramSyncManager->get("焊印宽", "焊印宽(下限)", 9.5).toDouble(); + bool hanyinKuanEnable = data->service->_paramSyncManager->get("焊印宽", "焊印宽判定启用", false).toBool(); + + double jierChangLimitHigh = data->service->_paramSyncManager->get("极耳长度", "极耳长度(上限)", 21).toDouble(); + double jierChangLimitLow = data->service->_paramSyncManager->get("极耳长度", "极耳长度(下限)", 19).toDouble(); + bool jierChangEnable = data->service->_paramSyncManager->get("极耳长度", "极耳长度判定启用", false).toBool(); + + if (halconResult.hanYin_Width > hanyinChangLimitHigh || halconResult.hanYin_Width < hanyinChangLimitLow) { + textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 0, 255));//焊印宽度 + if (hanyinChangEnable == true) + plcResult = "2"; } else { - textPainter.putText(Paint, "算法NG", cv::Point(4200, 350), cv::Scalar(0, 0, 255)); - plcResult = "2"; - data->halconOK = false; + textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 255, 0));//焊印宽度 + } + + if (halconResult.hanYin_Height > hanyinKuanLimitHigh || halconResult.hanYin_Height < hanyinKuanLimitLow) { + textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 0, 255));//焊印高度 + if (hanyinKuanEnable == true) + plcResult = "2"; + } + else { + textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 255, 0));//焊印高度 } - plcResult = "1"; silieResultText = "1"; fanzheResultText = "1"; -#pragma region 判断结果以及储存结果 - /*double hanyinChangLimitHigh = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印长(上限)", 30.5).toDouble(); - double hanyinChangLimitLow = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印长(下限)", 29.5).toDouble(); - bool hanyinChangEnable = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印长判定启用", false).toBool(); + if (halconResult.jiErHeight > jierChangLimitHigh || halconResult.jiErHeight < jierChangLimitLow) { + textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 0, 255));//极耳高度 + if (hanyinKuanEnable == true) + plcResult = "2"; + } + else { + textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳高度 + } + if (plcResult == "2" || halconResult.result == false) { + textPainter.putText(Paint, "算法NG", cv::Point(4200, 350), cv::Scalar(0, 0, 255)); + data->halconOK = false; + } + if(data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool() == true) + plcResult = "1"; - double hanyinKuanLimitHigh = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印宽(上限)", 10.5).toDouble(); - double hanyinKuanLimitLow = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印宽(下限)", 9.5).toDouble(); - bool hanyinKuanEnable = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "焊印宽判定启用", false).toBool(); - - double jierChangLimitHigh = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "极耳长度(上限)", 10.5).toDouble(); - double jierChangLimitLow = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "极耳长度(下限)", 9.5).toDouble(); - bool jierChangEnable = data->service->_paramSyncManager->get(data->service->_paramSyncManager->getGroup(1), "极耳长度判定启用", false).toBool();*/ + data->sqlVec.insert({ {"焊印长度",halconResult.hanYin_Width }, { "焊印宽度",halconResult.hanYin_Height }, { "极耳裁切长度",halconResult.jiErHeight } }); #pragma endregion data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 @@ -201,9 +228,9 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 12) + "_" + QByteArray::number(halconResult.hanYin_Height));//发送数据-极耳高 //textPainter.putText(Paint, "极耳裁切宽度" + std::to_string(halconResult.jiErWidth), cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳宽度,暂时不显示 - textPainter.putText(Paint, "极耳裁切长度" + controlAccuracy(halconResult.jiErHeight, 4) + "mm", cv::Point(100, 50), cv::Scalar(0, 255, 0));//极耳高度 - textPainter.putText(Paint, "焊印长度" + controlAccuracy(halconResult.hanYin_Width, 4) + "mm", cv::Point(100, 300), cv::Scalar(0, 255, 0));//焊印宽度 - textPainter.putText(Paint, "焊印宽度" + controlAccuracy(halconResult.hanYin_Height, 4) + "mm", cv::Point(100, 550), cv::Scalar(0, 255, 0));//焊印高度 + + + textPainter.putText(Paint, "焊印面积" + controlAccuracy(halconResult.hanYin_Area, 4) + "mm²", cv::Point(100, 800), cv::Scalar(0, 255, 0));//焊印面积 textPainter.putText(Paint, "焊印上边缘到极耳上边缘高度" + controlAccuracy(halconResult.hanYin_Distance_Up, 4) + "mm", cv::Point(100, 1050), cv::Scalar(0, 255, 0)); textPainter.putText(Paint, "焊印下边缘到极耳下边缘高度" + controlAccuracy(halconResult.hanYin_Distance_Down, 4) + "mm", cv::Point(100, 1300), cv::Scalar(0, 255, 0)); @@ -223,13 +250,16 @@ bool hanHouCeLiang(std::shared_ptr data, yuHanHanHouParams* _detParams textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); data->resultImgs.push_back(Paint); - data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool() == true) + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + else + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈 return true; } bool hanHouDown(std::shared_ptr data, yuHanHanHouParams* _detParams, sx_581_address address) { QByteArray plcResult = "2"; - try{ + try { cv::Mat sourceImg = data->oriImgs[0]; //sourceImg = cv::imread("./testImages/"+ std::to_string(_detParams->cameraIndex) +".bmp"); cv::Mat Paint; diff --git a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h index b6ad81d..5504f1c 100644 --- a/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h +++ b/src/mission/YuHan/581_YuHan_hanhou/581_YuHan_hanhou.h @@ -1,4 +1,4 @@ -#include +#include #include #pragma region 算法 #include @@ -62,47 +62,47 @@ public: for (int i = 0; i < 2; i++) { yuHanHanHouParams tong_90; - tong_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-T-seg.BHD", 64, 0); + /*tong_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-T-seg.BHD", 64, 0); tong_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); tong_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-T.BHD", 64, 0); - tong_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1); + tong_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1);*/ tong_90_DetParams.push_back(tong_90); yuHanHanHouParams lv_90; - lv_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-L-seg.BHD", 64, 1); + /*lv_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-L-seg.BHD", 64, 1); lv_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); lv_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-L.BHD", 64, 1); - lv_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1); + lv_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1);*/ lv_90_DetParams.push_back(lv_90); } yuHanHanHouParams dibu_45_lv; - dibu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); - dibu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); - dibu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-seg.BHD", 64, 1); - dibu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-cls.BHD", 1, 1); + //dibu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); + //dibu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); + //dibu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-seg.BHD", 64, 1); + //dibu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-cls.BHD", 1, 1); dibu_45_lv_DetParams.push_back(dibu_45_lv); yuHanHanHouParams dibu_45_tong; - dibu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); - dibu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); - dibu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-seg.BHD", 64, 0); - dibu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-cls.BHD", 0, 1); + //dibu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); + //dibu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); + //dibu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-seg.BHD", 64, 0); + //dibu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-cls.BHD", 0, 1); dibu_45_tong_DetParams.push_back(dibu_45_tong); yuHanHanHouParams dingbu_45_lv; - dingbu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); - dingbu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); - dingbu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-L-seg.BHD", 64, 1); - dingbu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-45-L-cls.BHD", 1, 1);//未更新 + //dingbu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1); + //dingbu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1); + //dingbu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-L-seg.BHD", 64, 1); + //dingbu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-45-L-cls.BHD", 1, 1);//未更新 dingbu_45_lv_DetParams.push_back(dingbu_45_lv); yuHanHanHouParams dingbu_45_tong; - dingbu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); - dingbu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); - dingbu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-seg.BHD", 64, 0); - dingbu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-cls.BHD", 0, 1); + //dingbu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0); + //dingbu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0); + //dingbu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-seg.BHD", 64, 0); + //dingbu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-cls.BHD", 0, 1); dingbu_45_tong_DetParams.push_back(dingbu_45_tong); initOnce = true; @@ -122,7 +122,7 @@ public: } bool initCustom() { #pragma region 注册触发器回调 - /*if (_serviceManager->_paramSyncManager->get(_serviceManager->_paramSyncManager->getGroup(1), "hanhou","OUT") == "OUT") { + if (_serviceManager->_paramSyncManager->get("内外侧判断", "hanhou", "OUT") == "OUT") { lv_top90_1.init("Camera1", "极耳尺寸-外-铝-相机1(顶部90°)", { { 522, 1,{540},"523","530",820} }, 1, &lv_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); lv_down90_2.init("Camera2", "极耳尺寸-外-铝-相机2(底部90°)", { { 524, 1,{540},"525","532",-1} }, 1, &lv_90_DetParams[1], _serviceManager, bridge, hanHouDown); tong_top90_3.init("Camera3", "极耳尺寸-外-铜-相机3(顶部90°)", { { 526,1,{540},"527","534",800} }, 1, &tong_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang); @@ -143,7 +143,7 @@ public: lv_down45_6.init("Camera6", "底部撕裂-内-铝-相机6(底部45°)", { { 644, 1,{580},"645","652",-1} }, 1, &dibu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown); tong_top45_7.init("Camera7", "底部撕裂-内-铜-相机7(顶部45°)", { { 646, 1,{580},"647","654",-1} }, 1, &dingbu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); tong_down45_8.init("Camera8", "底部撕裂-内-铜-相机8(底部45°)", { { 648, 1,{580},"649","656",-1} }, 1, &dibu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown); - }*/ + } #pragma endregion return true; } diff --git a/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h index 3283e86..5d13766 100644 --- a/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h +++ b/src/mission/YuHan/581_YuHan_hanqian/581_YuHan_hanqian.h @@ -148,11 +148,12 @@ bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, } addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 - return true; + return true; /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ #else + bool detEnable = data->service->_paramSyncManager->get("极耳翻折","极耳翻折判定启用", true).toBool(); //存图数据加保存队列,加锁,避免数据访问冲突 - QByteArray plcResult = "2"; + QByteArray plcResult = "1"; cv::Mat sourceImg; data->oriImgs[0].copyTo(sourceImg); cv::Mat Paint; @@ -185,9 +186,11 @@ bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, { textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); data->aiDetOK = false; - plcResult = "2"; + if(data->service->_paramSyncManager->get("通用设置","极耳翻折判定启用", true).toBool() == true) + plcResult = "2"; } - plcResult = "1";//强制OK + if(data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool() == true) + plcResult = "1";//强制OK data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 data->segOriginImgs.push_back(seg_CutImg); data->segOriginImgs.push_back(seg_LocateImg); @@ -246,8 +249,8 @@ public: #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_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); diff --git a/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp new file mode 100644 index 0000000..7760162 --- /dev/null +++ b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.cpp @@ -0,0 +1,8 @@ +#include <581_YuHan_jixing.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/YuHan/581_YuHan_jixing/581_YuHan_jixing.h b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h new file mode 100644 index 0000000..d67e066 --- /dev/null +++ b/src/mission/YuHan/581_YuHan_jixing/581_YuHan_jixing.h @@ -0,0 +1,177 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +class yuHanParams { +public: + + bool isTong = true; +}; +bool halconProcess(cv::Mat& sourceImg, cv::Mat& Paint) { + try { + HDevEngineCpp::HDevProcedure proc("YH_Color_Inspection"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image = MatToHObject(sourceImg); + procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图像类变量 + procedureCall.Execute();//执行halcon程序 + HTuple out_ColorType; + HTuple out_Flag; + out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出图像类变量 + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + //相机2 OK为铜 NG为铝 + if (out_Flag.D() == 1) + { + if (out_ColorType.D() == 1)//铜 + { + //cv::putText(Paint, "OK", cv::Point(0, 550), 2, 10, cv::Scalar(0, 255, 0), 10); + return true; + } + else//铝 + { + //cv::putText(Paint, "NG", cv::Point(0, 550), 2, 10, cv::Scalar(0, 0, 255), 10); + return false; + } + } + else + { + //cv::putText(Paint, "NG", cv::Point(0, 550), 2, 10, cv::Scalar(0, 0, 255), 10); + return false; + } + } + catch (HDevEngineCpp::HDevEngineException& ex) { + + std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ + qDebug() << "HDevEngineException: " << ex.Message(); \ + } + catch (HalconCpp::HException& ex) { + + std::cout << "Halcon Exception Caught!" << std::endl; \ + std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ + std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ + qDebug() << "Halcon Exception Caught!"; \ + qDebug() << "Error Code: " << ex.ErrorCode(); \ + qDebug() << "Error Message: " << ex.ErrorMessage(); \ + } +} +bool jixingjiance(std::shared_ptr data, yuHanParams* 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 + //存图数据加保存队列,加锁,避免数据访问冲突 + bool jiXingEnable = data->service->_paramSyncManager->get("极性","极性判定启用", true).toBool(); + QByteArray plcResult = "1"; + cv::Mat sourceImg; + data->oriImgs[0].copyTo(sourceImg); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + bool isNG = halconProcess(sourceImg, Paint); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + if (isNG)//OK + { + textPainter.putText(Paint, "OK", cv::Point(100, 50), cv::Scalar(0, 255, 0)); + } + else + { + textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255)); + data->halconOK = false; + if(jiXingEnable == true) + plcResult = "2"; + } + if (jiXingEnable == false) + plcResult = "1";//强制OK + 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, 15); + textPainter.putText(Paint, "NG", cv::Point(1000, 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");//结果反馈 + return true; +} +class _581_YuHan_hanqian : public mission { +public: + _581_SX_Single_triggerTemplate< yuHanParams> in_lv_top_1; + _581_SX_Single_triggerTemplate< yuHanParams> in_lv_down_2; + _581_SX_Single_triggerTemplate< yuHanParams> in_tong_top_3; + _581_SX_Single_triggerTemplate< yuHanParams> in_tong_down_4; + + yuHanParams tongDetParams; + yuHanParams lvDetParams; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); + + lvDetParams.isTong = false; + } + bool initCustom() { +#pragma region 注册触发器回调 + in_lv_top_1.init("Camera1", "极性检测-相机1", { { 400, 1,{410},"401","402",-1} }, 1, &lvDetParams, _serviceManager, bridge, jixingjiance); + in_lv_down_2.init("Camera2", "极性检测-相机2", { { 430, 1,{440},"431","432",-1 }}, 1, & lvDetParams, _serviceManager, bridge, jixingjiance); + in_tong_top_3.init("Camera3", "极性检测-相机3", { { 460,1,{470},"461","462",-1} }, 1, &tongDetParams, _serviceManager, bridge, jixingjiance); + in_tong_down_4.init("Camera4", "极性检测-相机4", { { 490, 1,{500},"491","492",-1 }}, 1, & tongDetParams, _serviceManager, bridge, jixingjiance); + +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt b/src/mission/YuHan/581_YuHan_jixing/CMakeLists.txt new file mode 100644 index 0000000..76e9200 --- /dev/null +++ b/src/mission/YuHan/581_YuHan_jixing/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.zip b/subModule.zip new file mode 100644 index 0000000..8ffcd7e Binary files /dev/null and b/subModule.zip differ