备份
This commit is contained in:
@@ -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 <detData> 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -76,8 +76,15 @@ public:
|
||||
QMutexLocker locker(&globalMutex);
|
||||
std::vector<std::pair<QString, QVariant>> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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})
|
||||
@@ -0,0 +1,21 @@
|
||||
#include <iostream>
|
||||
#include <opencv.hpp>
|
||||
#include <handleAI.h>
|
||||
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<std::string> 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);
|
||||
|
||||
//}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <baoMo.hpp>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
std::cout << "hello world" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <qtimer.h>
|
||||
#include <generalJsonParsing.hpp>
|
||||
#include <qspinbox.h>
|
||||
#include "git_version.h"
|
||||
#include <appConfig/appConfig.h>
|
||||
#include <qgroupbox.h>
|
||||
#include <qframe.h>
|
||||
|
||||
@@ -65,8 +65,13 @@ public:
|
||||
|
||||
void setParams(std::vector<std::pair<QString, QVariant>> 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<QString> groups;
|
||||
QMap<QString, std::vector<std::pair<QString, QVariant>>> groupedParams;
|
||||
QMap<QString, std::vector<QString>> 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<std::pair<QString, QVariant>> 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<std::pair<QString, QVariant>> 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<std::pair<QString, QVariant>> m_allParams;
|
||||
QMap<QString, std::vector<std::pair<QString, QVariant>>> m_groupedParams;
|
||||
QMap<QString, QVariant> m_allParams;
|
||||
QMap<QString, std::vector<QString>> m_groupedParamsNames;//分组 名字
|
||||
//QMap<QString, QWidget*> 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;
|
||||
|
||||
@@ -25,6 +25,7 @@ void exceptionResume(std::shared_ptr<detData> data, mfd_detParams* _detParams, y
|
||||
using namespace HDevEngineCpp;
|
||||
static bool ManHan(std::shared_ptr <detData> 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<QString, QVariant> sqlMapData;
|
||||
sqlMapData["项目"] = "满焊";
|
||||
sqlMapData["相机"] = "相机" + address.triggerAddr;
|
||||
|
||||
@@ -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 <detData> 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 <detData> 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 <detData> 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 <detData> 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 <detData> 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;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include <missionBase.hpp>
|
||||
#include <missionBase.hpp>
|
||||
#include <sxGlobal.h>
|
||||
#pragma region 算法
|
||||
#include <simpleAlgo.h>
|
||||
@@ -62,47 +62,47 @@ public:
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
yuHanHanHouParams tong_90;
|
||||
tong_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-T-seg.BHD", 64, 0);
|
||||
/*tong_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-T-seg.BHD", 64, 0);
|
||||
tong_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
|
||||
tong_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-T.BHD", 64, 0);
|
||||
tong_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1);
|
||||
tong_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1);*/
|
||||
tong_90_DetParams.push_back(tong_90);
|
||||
|
||||
yuHanHanHouParams lv_90;
|
||||
lv_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-L-seg.BHD", 64, 1);
|
||||
/*lv_90.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-90-L-seg.BHD", 64, 1);
|
||||
lv_90.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
|
||||
lv_90.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-L.BHD", 64, 1);
|
||||
lv_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1);
|
||||
lv_90.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1);*/
|
||||
lv_90_DetParams.push_back(lv_90);
|
||||
|
||||
}
|
||||
|
||||
yuHanHanHouParams dibu_45_lv;
|
||||
dibu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1);
|
||||
dibu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
|
||||
dibu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-seg.BHD", 64, 1);
|
||||
dibu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-cls.BHD", 1, 1);
|
||||
//dibu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1);
|
||||
//dibu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
|
||||
//dibu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-seg.BHD", 64, 1);
|
||||
//dibu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-L-cls.BHD", 1, 1);
|
||||
dibu_45_lv_DetParams.push_back(dibu_45_lv);
|
||||
|
||||
yuHanHanHouParams dibu_45_tong;
|
||||
dibu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0);
|
||||
dibu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
|
||||
dibu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-seg.BHD", 64, 0);
|
||||
dibu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-cls.BHD", 0, 1);
|
||||
//dibu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0);
|
||||
//dibu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
|
||||
//dibu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-seg.BHD", 64, 0);
|
||||
//dibu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dibu-45-T-cls.BHD", 0, 1);
|
||||
dibu_45_tong_DetParams.push_back(dibu_45_tong);
|
||||
|
||||
yuHanHanHouParams dingbu_45_lv;
|
||||
dingbu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1);
|
||||
dingbu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
|
||||
dingbu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-L-seg.BHD", 64, 1);
|
||||
dingbu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-45-L-cls.BHD", 1, 1);//未更新
|
||||
//dingbu_45_lv.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-L-seg.BHD", 64, 1);
|
||||
//dingbu_45_lv.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
|
||||
//dingbu_45_lv.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-L-seg.BHD", 64, 1);
|
||||
//dingbu_45_lv.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-45-L-cls.BHD", 1, 1);//未更新
|
||||
dingbu_45_lv_DetParams.push_back(dingbu_45_lv);
|
||||
|
||||
yuHanHanHouParams dingbu_45_tong;
|
||||
dingbu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0);
|
||||
dingbu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
|
||||
dingbu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-seg.BHD", 64, 0);
|
||||
dingbu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-cls.BHD", 0, 1);
|
||||
//dingbu_45_tong.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanDingWei-45-T-seg.BHD", 64, 0);
|
||||
//dingbu_45_tong.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
|
||||
//dingbu_45_tong.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-seg.BHD", 64, 0);
|
||||
//dingbu_45_tong.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/yuHanhanHou-dingbu-45-T-cls.BHD", 0, 1);
|
||||
dingbu_45_tong_DetParams.push_back(dingbu_45_tong);
|
||||
|
||||
initOnce = true;
|
||||
@@ -122,7 +122,7 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
/*if (_serviceManager->_paramSyncManager->get(_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;
|
||||
}
|
||||
|
||||
@@ -148,11 +148,12 @@ bool jiErFanZhe(std::shared_ptr <detData> 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 <detData> 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);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#include <581_YuHan_jixing.h>
|
||||
|
||||
mission* createMission() {
|
||||
return new _581_YuHan_hanqian();
|
||||
}
|
||||
void destroyMission(mission* _mission) {
|
||||
delete _mission;
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
#include <missionBase.hpp>
|
||||
#include <sxGlobal.h>
|
||||
#pragma region 算法
|
||||
#include <simpleAlgo.h>
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
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 <detData> 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<std::pair <int, cv::Mat >>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
|
||||
@@ -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})
|
||||
Binary file not shown.
Reference in New Issue
Block a user