This commit is contained in:
2025-11-13 01:31:30 +08:00
parent 3d52fcb85b
commit 2d00ce0db1
50 changed files with 1993 additions and 186 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ public:
bool algoEvaluate(std::shared_ptr <detData> data, handleAiModelsTemplate* model, addressTemplate address = addressTemplate()) {
std::chrono::steady_clock::time_point algoStartTime = std::chrono::steady_clock::now();
bool result;
bool result = true;
try {
result = _processAlgoCallback(data, model, address);
}
+1 -1
View File
@@ -89,7 +89,7 @@ public:
factoryIconLabel->setFixedSize(topBarHeight, topBarHeight);
leftLayout->addWidget(factoryIconLabel);
QString title(TR("AI Detection System"));
QString title(TR("AI Detection System") + " " + QString::fromStdString(config->softwareTile));
QLabel* titleLabel = new QLabel(title);
titleLabel->setFont(font);
titleLabel->setPalette(palette);
@@ -1,101 +0,0 @@
#include <missionBase.hpp>
#include <sxGlobal.h>
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
#pragma endregion
class yuHanHanHouParams {
public:
handdleAI::pSegmentation* segHanYinZhuaQu = nullptr;
handdleAI::pSegmentation* segYuHanDingWei = nullptr;
handdleAI::pSegmentation* segHanHou = nullptr;
handdleAI::pClassification* clsHanHou = nullptr;
bool isTong = true;
};
struct halconResult {
bool result = true;
double jiErWidth = -1;
double jiErHeight = -1;
double hanYin1 = -1;
};
void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint,
bool& silieResult, bool& fanZheResult,
cv::Point offset, handdleAI::pClassification* clsPtr, std::vector<cv::Mat>& clsImgs);
halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegmentation* seg_hanYinZhuaQu, cv::Mat& segResult);
bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address);
bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address);
namespace hanhou45{
}
class _581_YuHan_hanhou : public mission {
public:
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top90_1;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down90_2;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top90_3;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down90_4;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top45_5;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down45_6;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top45_7;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down45_8;
std::vector < yuHanHanHouParams> tongDetParams = std::vector < yuHanHanHouParams>(4);
std::vector < yuHanHanHouParams> lvDetParams = std::vector < yuHanHanHouParams>(4);
bool initOnce = false;
void onConfigReloaded() {
HDevEngineCpp::HDevEngine myEngine;
myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl");
if (initOnce == false) {
for (auto& params : tongDetParams) {
params.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-T.BHD", 64, 0);
params.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanDingWei-T.BHD", 64, 0);
params.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-T.BHD", 64, 0);
params.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-T.BHD", 0, 1);
}
for (auto& params : lvDetParams) {
params.segHanYinZhuaQu = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-hanYinZhuaQu-L.BHD", 64, 1);
params.segYuHanDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanDingWei-L.BHD", 64, 1);
params.segHanHou = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanhou/seg-yuHanhanHou-L.BHD", 64, 1);
params.clsHanHou = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanhou/cls-yuHanhanHou-L.BHD", 1, 1);
}
initOnce = true;
}
}
bool initCustom() {
#pragma region 注册触发器回调
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);
}
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_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;
}
};
#pragma once
@@ -0,0 +1,8 @@
#include <952_15_Q_2D3D.h>
mission* createMission() {
return new _952_15_Q_2D3D();
}
void destroyMission(mission* _mission) {
delete _mission;
}
@@ -0,0 +1,355 @@
#include <triggerManager.h>
#include <cameraManager.h>
#include <missionBase.hpp>
#include <summaryData.h>
#include <hdevengine/HDevEngineCpp.h>
#include <detCallbackChain.hpp>
#include <serviceManager.h>
struct _952_15_Q_2D3D_1_summaryData
{
QString _2D_P_Result = "-1";
QString _2D_N_Result = "-1";
QString _3D_1_Result = "-1";
};
class _952_address {
public:
int triggerAddr = -1;
int triggerValue = -1;
std::vector<int> snAddr;
QByteArray completeAddr;
QByteArray resultAddr = "-1";
int valueOffsetAddr = -1;
};
class _2dP_detParams {
public:
handdleAI::pSegmentation* SEG_2D_HuaShang_P;
handdleAI::pSegmentation* SEG_2D_ZangWu_P;
handdleAI::pClassification* CLS_2D_HuaShang_P;
handdleAI::pClassification* CLS_2D_ZangWu_P;
};
class _2dN_detParams {
public:
};
class _3d_detParams {
public:
};
#pragma region 算法
#include <detData.h>
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
static bool _952_15_Q_2D_P_ALGO_HuaShangAI(std::shared_ptr <detData> data, QMutex* mutex, cv::Mat& img, _2dP_detParams* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) {
cv::Mat segImg = ~_handleAiModelManager->SEG_2D_HuaShang_P->Evaluate(img);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
bool isNg = false;
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓
auto clsImgs = cutImg2ClsVec(rect, img);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
QMutexLocker locker(mutex);
data->clsOriginImgs.push_back(std::make_pair("划伤", clsImg));
int clsResult = _handleAiModelManager->CLS_2D_HuaShang_P->Evaluate(clsImg);
if (clsResult == 1) { // 假设1表示NG
clsIsNg = true;
break;
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isNg = true;
QMutexLocker locker(&paintMutex);
cv::drawContours(Paint, contours, i, color, 2);
}
else {
QMutexLocker locker(&paintMutex);
cv::rectangle(Paint, rect, color, 3);
}
putTextZH(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
return isNg;
}
static bool _952_15_Q_2D_P_ALGO_ZangWuAI(std::shared_ptr <detData> data, QMutex* mutex, cv::Mat& img, _2dP_detParams* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) {
cv::Mat segImg = ~_handleAiModelManager->SEG_2D_ZangWu_P->Evaluate(img);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
bool isNg = false;
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓
auto clsImgs = cutImg2ClsVec(rect, img);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
{
QMutexLocker locker(mutex);
data->clsOriginImgs.push_back(std::make_pair("脏污", clsImg));
}
int clsResult = _handleAiModelManager->CLS_2D_ZangWu_P->Evaluate(clsImg);
if (clsResult == 1) { // 假设1表示NG
clsIsNg = true;
break;
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isNg = true;
QMutexLocker locker(&paintMutex);
cv::drawContours(Paint, contours, i, color, 2);
}
else {
QMutexLocker locker(&paintMutex);
cv::rectangle(Paint, rect, color, 3);
}
putTextZH(Paint, "脏污", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
return isNg;
}
static bool _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, _2dP_detParams* _handleAiModelManager, _952_address address) {
//获取模型
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 3)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paintx;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paintx, cv::COLOR_GRAY2BGR);
else
data->oriImgs[0].copyTo(Paintx);
TextRendererZH textPainter(Paintx.cols, Paintx.rows, 300);
textPainter.putText(Paintx, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0));
data->resultImgs.push_back(Paintx);
return true;
cv::Mat Paint;
cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR);
QMutex paintMutex;
QMutex mutex;
std::future <bool> futureHuaShang = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_HuaShangAI, data, &mutex, data->oriImgs[1], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex));
std::future <bool> futureZangWu = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_ZangWuAI, data, &mutex, data->oriImgs[2], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex));
bool huaShangResult = futureHuaShang.get();
if (huaShangResult) {
putTextZH(Paint, "划伤检测结果: NG", cv::Point(100, 100), 150, cv::Scalar(0, 0, 255));
}
else {
putTextZH(Paint, "划伤检测结果: OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
}
bool zangWuResult = futureZangWu.get();
if (zangWuResult) {
putTextZH(Paint, "脏污检测结果: NG", cv::Point(100, 200), 150, cv::Scalar(0, 0, 255));
}
else {
putTextZH(Paint, "脏污检测结果: OK", cv::Point(100, 200), 150, cv::Scalar(0, 255, 0));
}
data->resultImgs.push_back(Paint);
data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG
return true;
}
static bool _952_15_Q_2D_N_ALGO(std::shared_ptr <detData> data, _2dN_detParams* _handleAiModelManager, _952_address address) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paint;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR);
else
data->oriImgs[0].copyTo(Paint);
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
textPainter.putText(Paint, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0));
data->resultImgs.push_back(Paint);
return true;
}
static bool _952_15_Q_3D_ALGO(std::shared_ptr <detData> data, _3d_detParams* _handleAiModelManager, _952_address address) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 2)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paint;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR);
else
data->oriImgs[0].copyTo(Paint);
putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
data->resultImgs.push_back(Paint);
return true;
}
#pragma endregion
class _952_15_Q_2D3D : public mission {
public:
_2dP_detParams __2dP_detParams;
_2dN_detParams __2dN_detParams;
_3d_detParams __3d_detParams;
detCallbackChain<_2dP_detParams, _952_address >* algo_2D_P;
detCallbackChain<_2dN_detParams, _952_address >* algo_2D_N;
detCallbackChain<_3d_detParams, _952_address >* algo_3D;
summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData;
//8010 1
bool Qian_2D_P_SecondTime = false;
void Qian_2D_P(QByteArray& byteArray) {
int snPos = _2dP_address.snAddr[0];
_serviceManager->_triggerManager->writeShort(_2dP_address.triggerAddr + "_0");//清0
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData("Qian_2D_P", sn, 3, _2DCamera_P->config.oriSaveFormat);
_2DCamera_P->captureImage(data);
algo_2D_P->ansyncProcess(data, _2dP_address, ("D" + _2dP_address.completeAddr + "_1,1")); //处理算法
data->resultImgShowSet.push_back(showImgPack("通道1-2D正极" + QString::number(Qian_2D_P_SecondTime + 1), "结果图"));
Qian_2D_P_SecondTime = !Qian_2D_P_SecondTime;
}
//8020 1
bool Qian_2D_N_SecondTime = false;
void Qian_2D_N(QByteArray& byteArray) {
int snPos = _2dN_address.snAddr[0];
_serviceManager->_triggerManager->writeShort(_2dN_address.triggerAddr + "_0");//清0
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData(
"Qian_2D_N", sn, 1, _2DCamera_N->config.oriSaveFormat);
_2DCamera_N->captureImage(data);
algo_2D_N->ansyncProcess(data, _2dN_address, ("D" + _2dN_address.completeAddr + "_1,1")); //处理算法
data->resultImgShowSet.push_back(showImgPack("通道1-2D负极" + QString::number(Qian_2D_N_SecondTime + 1), "结果图"));
Qian_2D_N_SecondTime = !Qian_2D_N_SecondTime;
}
//8030 1
bool Qian_3D_1_SecondTime = false;
void Qian_3D_1(QByteArray& byteArray) {
int snPos = _3d_address.snAddr[0];
_serviceManager->_triggerManager->writeShort(_3d_address.triggerAddr + "_0");//清0
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData(
"Qian_3D", sn, 2, _3DCamera_1->config.oriSaveFormat);
_3DCamera_1->captureImage(data);
algo_3D->ansyncProcess(data, _3d_address, ("D" + _3d_address.completeAddr + "_1,1")); //处理算法
data->resultImgShowSet.push_back(showImgPack("通道1-3D" + QString::number(Qian_3D_1_SecondTime + 1), "结果图"));
Qian_3D_1_SecondTime = !Qian_3D_1_SecondTime;
}
//8040 1 Summary1
void sumRequest1(int triggerPos ,QByteArray& byteArray) {
if (triggerPos == 8090) {
_serviceManager->_triggerManager->writeShort({ "D8040_0" ,"D8042_1","D8045_1","D8046_1","D8047_1","D8048_1" });
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, 8500, false, false, -1);
_952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn);
_serviceManager->_triggerManager->writeShort({
"D6020_1", "D6021_1", "D6022_1", "D6023_1", "D6024_1",
"D6025_1", "D6026_1", "D6027_1", "D6028_1", "D6029_1",
"D6030_1", "D6031_1", "D6032_1", "D6033_1", "D6034_1",
"D6035_1", "D6036_1", "D6037_1", "D6038_1", "D6039_1"
});
_summaryData.remove(sn);
}
else{
_serviceManager->_triggerManager->writeShort({ "D8090_0" ,"D8092_1","D8095_1","D8096_1","D8097_1","D8098_1" });
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, 9000, false, false, -1);
_952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn);
_serviceManager->_triggerManager->writeShort({
"D6120_1", "D6121_1", "D6122_1", "D6123_1", "D6124_1",
"D6125_1", "D6126_1", "D6127_1", "D6128_1", "D6129_1",
"D6130_1", "D6131_1", "D6132_1", "D6133_1", "D6134_1",
"D6135_1", "D6136_1", "D6137_1", "D6138_1", "D6139_1"
});
_summaryData.remove(sn);
}
}
bool initOnce = false;
void onConfigReloaded() {
if (initOnce == false) {
/*__2dP_detParams.SEG_2D_ZangWu_P = handdleAI::CreateSegObj("./handleaiModels/seg_zangWu_P_0708.BHD", 1, 0);
__2dP_detParams.SEG_2D_HuaShang_P = handdleAI::CreateSegObj("./handleaiModels/seg_huaShang_P_0708.BHD", 1, 0);
__2dP_detParams.CLS_2D_ZangWu_P = handdleAI::CreateClsObjV3("./handleaiModels/cls_zangWu_P_0708.BHD", 0, 1);
__2dP_detParams.CLS_2D_HuaShang_P = handdleAI::CreateClsObjV3("./handleaiModels/cls_huaShang_P_0708.BHD", 0, 1);*/
initOnce = true;
}
}
bool initCustom() {
#pragma region 注册触发器回调
if (_serviceManager->_paramSyncManager->get("way", "IN").toString() == "IN") {
_2dP_address = { 8010 ,1,{8200} ,"8011" ,"-1", - 1};
_2dN_address = { 8020 ,1,{8300} ,"8021" ,"-1", -1 };
_3d_address = { 8030 ,1,{8400} ,"8031" ,"-1", -1 };
summary_triggerPos = 8040;
}
else {
_2dP_address = { 8060 ,1,{8700} ,"8061" ,"-1", -1 };
_2dN_address = { 8070 ,1,{8800} ,"8071" ,"-1", -1 };
_3d_address = { 8080 ,1,{8900} ,"8081" ,"-1", -1 };
summary_triggerPos = 8090;
}
_serviceManager->_triggerManager->registerCallback(_2dP_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_2D_P(byteArray); }, "2D_1拍照触发");
_serviceManager->_triggerManager->registerCallback(_2dN_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发");
_serviceManager->_triggerManager->registerCallback(_3d_address.triggerAddr, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发");
_serviceManager->_triggerManager->registerCallback(summary_triggerPos, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray) {sumRequest1(triggerPos,byteArray); }, "结果获取触发");
#pragma endregion
#pragma region 处理算法回调链
algo_2D_P = new detCallbackChain<_2dP_detParams, _952_address>(_serviceManager, &__2dP_detParams, bridge);
algo_2D_P->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO);
algo_2D_N = new detCallbackChain<_2dN_detParams, _952_address>(_serviceManager, &__2dN_detParams, bridge);
algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO);
algo_3D = new detCallbackChain<_3d_detParams, _952_address>(_serviceManager, &__3d_detParams, bridge);
algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO);
#pragma endregion
_2DCamera_P = _serviceManager->_cameraManager->getCamera("Camera1");//获取相机
_2DCamera_N = _serviceManager->_cameraManager->getCamera("Camera2");//获取相机
_3DCamera_1 = _serviceManager->_cameraManager->getCamera("Camera3");//获取相机
_serviceManager->_triggerManager->registerPlcValueViewer("通道1-2D正极",
{ {"触发",_2dP_address.triggerAddr },
{"反馈1", _2dP_address.completeAddr.toInt()},
{"反馈2",_2dP_address.completeAddr.toInt()+1}});
_serviceManager->_triggerManager->registerPlcValueViewer("通道1-2D负极",
{ {"触发",_2dN_address.triggerAddr },
{"反馈1", _2dN_address.completeAddr.toInt()},
{"反馈2",_2dN_address.completeAddr.toInt() + 1} });
_serviceManager->_triggerManager->registerPlcValueViewer("通道1-3D",
{ {"触发",_3d_address.triggerAddr },
{"反馈1", _3d_address.completeAddr.toInt()},
{"反馈2",_3d_address.completeAddr.toInt() + 1} });
return true;
}
private:
int summary_triggerPos = 8040;
_952_address _2dP_address, _2dN_address, _3d_address;
camera* _2DCamera_P = nullptr, * _2DCamera_N = nullptr, * _3DCamera_1 = nullptr;
};
#pragma once
@@ -0,0 +1,8 @@
#include <952_15_Q_2D3D.h>
mission* createMission() {
return new _952_15_Q_2D3D_1();
}
void destroyMission(mission* _mission) {
delete _mission;
}
@@ -0,0 +1,491 @@
#include <triggerManager.h>
#include <cameraManager.h>
#include <missonBase.hpp>
#include <summaryData.h>
#include <qtBridge.h>
#include <hdevengine/HDevEngineCpp.h>
#include <detCallbackChain.hpp>
#include <serviceManager.h>
struct _952_15_Q_2D3D_1_summaryData
{
QString _2D_P_Result = "-1";
QString _2D_N_Result = "-1";
QString _3D_1_Result = "-1";
};
class handleAIModels {
public:
handleAiModelSeg* SEG_2D_HuaShang_P;
handleAiModelSeg* SEG_2D_ZangWu_P;
handleAiModelCls* CLS_2D_HuaShang_P;
handleAiModelCls* CLS_2D_ZangWu_P;
};
#pragma region 算法
#include <detData.h>
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
static bool _952_15_Q_2D_P_ALGO_HuaShangAI(cv::Mat& img, handleAIModels* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) {
cv::Mat segImg = ~_handleAiModelManager->SEG_2D_HuaShang_P->Evaluate(img);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
bool isNg = false;
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓
auto clsImgs = cutImg2ClsVec(rect, img);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
int clsResult = _handleAiModelManager->CLS_2D_HuaShang_P->Evaluate(clsImg);
if (clsResult == 1) { // 假设1表示NG
clsIsNg = true;
break;
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isNg = true;
QMutexLocker locker(&paintMutex);
cv::drawContours(Paint, contours, i, color, 2);
}
else {
QMutexLocker locker(&paintMutex);
cv::rectangle(Paint, rect, color, 3);
}
putTextZH(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
return isNg;
}
static bool _952_15_Q_2D_P_ALGO_ZangWuAI(cv::Mat& img, handleAIModels* _handleAiModelManager, cv::Mat& Paint, QMutex& paintMutex) {
cv::Mat segImg = ~_handleAiModelManager->SEG_2D_ZangWu_P->Evaluate(img);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
bool isNg = false;
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if (rect.width < 50 || rect.height < 50) continue; // 过滤掉小轮廓
auto clsImgs = cutImg2ClsVec(rect, img);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
int clsResult = _handleAiModelManager->CLS_2D_ZangWu_P->Evaluate(clsImg);
if (clsResult == 1) { // 假设1表示NG
clsIsNg = true;
break;
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isNg = true;
QMutexLocker locker(&paintMutex);
cv::drawContours(Paint, contours, i, color, 2);
}
else {
QMutexLocker locker(&paintMutex);
cv::rectangle(Paint, rect, color, 3);
}
putTextZH(Paint, "脏污", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
return isNg;
}
static bool _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
//获取模型
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 3)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paint;
cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR);
data->resultImgs.push_back(Paint);
return true;
QMutex paintMutex;
std::future <bool> futureHuaShang = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_HuaShangAI, data->oriImgs[1], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex));
std::future <bool> futureZangWu = std::async(std::launch::async, _952_15_Q_2D_P_ALGO_ZangWuAI, data->oriImgs[2], _handleAiModelManager, std::ref(Paint), std::ref(paintMutex));
bool huaShangResult = futureHuaShang.get();
if (huaShangResult) {
putTextZH(Paint, "划伤检测结果: NG", cv::Point(100, 100), 150, cv::Scalar(0, 0, 255));
}
else {
putTextZH(Paint, "划伤检测结果: OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
}
bool zangWuResult = futureZangWu.get();
if (zangWuResult) {
putTextZH(Paint, "脏污检测结果: NG", cv::Point(100, 200), 150, cv::Scalar(0, 0, 255));
}
else {
putTextZH(Paint, "脏污检测结果: OK", cv::Point(100, 200), 150, cv::Scalar(0, 255, 0));
}
data->resultImgs.push_back(Paint);
data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG
return true;
}
static bool _952_15_Q_2D_N_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paint;
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR);
putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
data->resultImgs.push_back(Paint);
return true;
}
static bool _952_15_Q_3D_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 2)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
cv::Mat Paint;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2BGR);
else
data->oriImgs[0].copyTo(Paint);
putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
data->resultImgs.push_back(Paint);
return true;
}
#pragma endregion
class _952_15_Q_2D3D_1 : public mission {
public:
#pragma region 由外部输入的参数
std::string _2D_P_Camera_Name;
std::string _2D_N_Camera_Name;
std::string _3D_1_Camera_Name;
int _2D_P_triggerPos;
std::vector<std::string> _2D_P_triggerReply;
int _2D_P_snPos;
QString _2D_P_viewName;
int _2D_N_triggerPos;
std::vector<std::string> _2D_N_triggerReply;
int _2D_N_snPos;
QString _2D_N_viewName;
int _3D_triggerPos;
std::vector<std::string> _3D_triggerReply;
int _3D_snPos;
QString _3D_P_viewName;
int summary_triggerPos;
#pragma endregion
handleAIModels _handleAIModels;
std::shared_ptr< detCallbackChain<handleAIModels>> algo_2D_P;
std::shared_ptr< detCallbackChain<handleAIModels>> algo_2D_N;
std::shared_ptr< detCallbackChain<handleAIModels>> algo_3D;
summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData;
bool init(ServiceManager* _serviceManagerIN,
nlohmann::json& _missionJson,
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
bridge = bridgeIn;
_serviceManager = _serviceManagerIN;
prasingJson(_missionJson);
#pragma region 相机获取
_2DCamera_P = _serviceManager->_cameraManager->getCamera(_2D_P_Camera_Name);
if (_2DCamera_P == nullptr) {
std::cout << "camera ->> " << _2D_P_Camera_Name << " not found" << std::endl;
return false;
}
_2DCamera_N = _serviceManager->_cameraManager->getCamera(_2D_N_Camera_Name);
if (_2DCamera_N == nullptr) {
std::cout << "camera ->> " << _2D_N_Camera_Name << " not found" << std::endl;
return false;
}
_3DCamera_1 = _serviceManager->_cameraManager->getCamera(_3D_1_Camera_Name);
if (_3DCamera_1 == nullptr) {
std::cout << "camera ->> " << _3D_1_Camera_Name << " not found" << std::endl;
return false;
}
#pragma endregion
#pragma region 注册触发器回调
_serviceManager->_triggerManager->registerCallback(_2D_P_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_P(byteArray); }, "2D_1拍照触发");
_serviceManager->_triggerManager->registerCallback(_2D_N_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发");
_serviceManager->_triggerManager->registerCallback(_3D_triggerPos, 1, [this](QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发");
_serviceManager->_triggerManager->registerCallback(summary_triggerPos, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "结果获取触发");
#pragma endregion
#pragma region 处理算法回调链
algo_2D_P = std::make_shared<detCallbackChain<handleAIModels>>(_serviceManager->_imgSaveThreadManager, &_handleAIModels);
algo_2D_P->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO);
algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
Qian_2D_P_ResultHandle(data);
}));
algo_2D_N = std::make_shared<detCallbackChain<handleAIModels>>(_serviceManager->_imgSaveThreadManager, &_handleAIModels);
algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO);
algo_2D_N->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
Qian_2D_P_ResultHandle(data);
}));
algo_3D = std::make_shared<detCallbackChain<handleAIModels>>(_serviceManager->_imgSaveThreadManager, &_handleAIModels);
algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO);
algo_3D->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
Qian_2D_P_ResultHandle(data);
}));
#pragma endregion
_handleAIModels.SEG_2D_HuaShang_P = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_2D_HuaShang_P");
_handleAIModels.SEG_2D_ZangWu_P = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_2D_ZangWu_P");
_handleAIModels.CLS_2D_HuaShang_P = _serviceManagerIN->_handleAiModelManager->getClsModel("CLS_2D_HuaShang_P");
_handleAIModels.CLS_2D_ZangWu_P = _serviceManagerIN->_handleAiModelManager->getClsModel("CLS_2D_ZangWu_P");
//HDevEngineCpp::HDevEngine myEngine;
//myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl");
return true;
}
void prasingJson(nlohmann::json& _missionJson) {
try {
_2D_P_Camera_Name = _missionJson["_2D_P_Camera_Name"].get<std::string>();
_2D_N_Camera_Name = _missionJson["_2D_N_Camera_Name"].get<std::string>();
_3D_1_Camera_Name = _missionJson["_3D_1_Camera_Name"].get<std::string>();
_2D_P_triggerPos = _missionJson["_2D_P_triggerPos"].get<int>();
_2D_P_triggerReply = _missionJson["_2D_P_triggerReply"].get<std::vector<std::string>>();
_2D_P_snPos = _missionJson["_2D_P_snPos"].get<int>();
_2D_P_viewName = QString::fromStdString(_missionJson["_2D_P_viewName"].get<std::string>());
_2D_N_triggerPos = _missionJson["_2D_N_triggerPos"].get<int>();
_2D_N_triggerReply = _missionJson["_2D_N_triggerReply"].get<std::vector<std::string>>();
_2D_N_snPos = _missionJson["_2D_N_snPos"].get<int>();
_2D_N_viewName = QString::fromStdString(_missionJson["_2D_N_viewName"].get<std::string>());
_3D_triggerPos = _missionJson["_3D_triggerPos"].get<int>();
_3D_triggerReply = _missionJson["_3D_triggerReply"].get<std::vector<std::string>>();
_3D_snPos = _missionJson["_3D_snPos"].get<int>();
_3D_P_viewName = QString::fromStdString(_missionJson["_3D_P_viewName"].get<std::string>());
summary_triggerPos = _missionJson["summary_triggerPos"].get<int>();
}
catch (const nlohmann::json::out_of_range& e) {
std::cerr << "JSON out-of-range error: " << e.what() << std::endl;
}
catch (const nlohmann::json::type_error& e) {
std::cerr << "JSON type error: " << e.what() << std::endl;
}
catch (const nlohmann::json::exception& e) {
std::cerr << "JSON general exception: " << e.what() << std::endl;
}
}
//8010 1
bool Qian_2D_P_SecondTime = false;
void Qian_2D_P(QByteArray& byteArray) {
int snPos = _2D_P_snPos;
_serviceManager->_triggerManager->writeShort(_2D_P_triggerReply);
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData("Qian_2D_P", sn, 3, _2DCamera_P->config.oriSaveFormat);
_2DCamera_P->captureImage(data);
algo_2D_P->ansyncProcess(data); //处理算法
/*data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-93_Count0.bmp", -1));
data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-94_Count1.bmp", -1));
data->oriImgs.push_back(cv::imread("I:\\952Code\\CODES\\7.07\\7.07\\zj\\zw\\A2250707-100400132132177\\A2250707-100400132132177Qian_2D_P_10-02-06-94_Count2.bmp", -1));*/
qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
std::cout << "通道1 SN:" << sn << "检测开始" << std::endl;
data->resultImgShowSet.push_back(new showImgPack(_2D_P_viewName + QString::number(Qian_2D_P_SecondTime + 1), "结果图"));
Qian_2D_P_SecondTime = !Qian_2D_P_SecondTime;
}
void Qian_2D_P_ResultHandle(std::shared_ptr <detData>data) {
//发送图片
if (data->resultImgs.size() > 0) {
for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++) {
showImgPack* pack = data->resultImgShowSet[min(i, (int)data->resultImgShowSet.size() - 1)];
QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]);
pack->img = pixmap;
emit bridge->displayWidget_sendImg(pack);
pixmap = QPixmap();
}
}
//结果数据保存
if (data->resultData.size() > 0) {
std::string sn = data->SNcode;
try {
_952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn);
// dataPtr->LT_Distance = data->resultData["LT_Distance"].toString();
//dataPtr->RT_Distance = data->resultData["RT_Distance"].toString();
// dataPtr->LD_Distance = data->resultData["LD_Distance"].toString();
// dataPtr->RD_Distance = data->resultData["RD_Distance"].toString();
// dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString();
// dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString();
// if (data->cameraKeyName == "2.5D-H-1") {
// emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble());
// emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble());
// }
// else{
// emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble());
// emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble());
//
// }
}
catch (...) {
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
}
}
else {
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode);
}
std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl;
}
//8020 1
bool Qian_2D_N_SecondTime = false;
void Qian_2D_N(QByteArray& byteArray) {
int snPos = _2D_N_snPos;
_serviceManager->_triggerManager->writeShort(_2D_N_triggerReply);
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData(
"Qian_2D_N", sn, 1, _2DCamera_N->config.oriSaveFormat);
_2DCamera_N->captureImage(data);
algo_2D_N->ansyncProcess(data); //处理算法
qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
std::cout << "通道1 SN:" << sn << "检测开始" << std::endl;
data->resultImgShowSet.push_back(new showImgPack(_2D_N_viewName + QString::number(Qian_2D_N_SecondTime + 1), "结果图"));
Qian_2D_N_SecondTime = !Qian_2D_N_SecondTime;
}
//8030 1
bool Qian_3D_1_SecondTime = false;
void Qian_3D_1(QByteArray& byteArray) {
int snPos = _3D_snPos;
_serviceManager->_triggerManager->writeShort(_3D_triggerReply);
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
std::shared_ptr <detData> data =
_serviceManager->_detDataManager->createDetData(
"Qian_3D", sn, 2, _3DCamera_1->config.oriSaveFormat);
_3DCamera_1->captureImage(data);
algo_3D->ansyncProcess(data); //处理算法
qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
std::cout << "通道1 SN:" << sn << "检测开始" << std::endl;
data->resultImgShowSet.push_back(new showImgPack(_3D_P_viewName + QString::number(Qian_3D_1_SecondTime + 1), "结果图"));
Qian_3D_1_SecondTime = !Qian_3D_1_SecondTime;
}
void HouDuan12ResultHandle(std::shared_ptr <detData>data) {
//发送图片
if (data->resultImgs.size() > 0) {
for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++) {
showImgPack* pack = data->resultImgShowSet[min(i, (int)data->resultImgShowSet.size() - 1)];
QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]);
pack->img = pixmap;
emit bridge->displayWidget_sendImg(pack);
pixmap = QPixmap();
}
}
//结果数据保存
if (data->resultData.size() > 0) {
std::string sn = data->SNcode;
try {
_952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn);
// dataPtr->LT_Distance = data->resultData["LT_Distance"].toString();
//dataPtr->RT_Distance = data->resultData["RT_Distance"].toString();
// dataPtr->LD_Distance = data->resultData["LD_Distance"].toString();
// dataPtr->RD_Distance = data->resultData["RD_Distance"].toString();
// dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString();
// dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString();
// if (data->cameraKeyName == "2.5D-H-1") {
// emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble());
// emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble());
// }
// else{
// emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble());
// emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble());
// emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble());
//
// }
}
catch (...) {
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
}
}
else {
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode);
}
std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl;
}
//8040 1 Summary1
void sumRequest1(QByteArray& byteArray) {
_serviceManager->_triggerManager->writeShort({ "D8040_0" ,"D9402_1","D9404_1" });
int snPos = summary_triggerPos;
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
_952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn);
_serviceManager->_triggerManager->writeShort({
"D6020_1", "D6021_1", "D6022_1", "D6023_1", "D6024_1",
"D6025_1", "D6026_1", "D6027_1", "D6028_1", "D6029_1",
"D6030_1", "D6031_1", "D6032_1", "D6033_1", "D6034_1",
"D6035_1", "D6036_1", "D6037_1", "D6038_1", "D6039_1"
});
_serviceManager->_triggerManager->sendFinsMsg("write_float_D8046_" + dataPtr->_2D_P_Result);//右上留白
_serviceManager->_triggerManager->sendFinsMsg("write_float_D8047_" + dataPtr->_2D_N_Result);//右下留白
_serviceManager->_triggerManager->sendFinsMsg("write_float_D8048_" + dataPtr->_3D_1_Result);//右对其度
std::cout << "通道1 SN:" << sn << " 发送结果" << std::endl;//:\n左留白->" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString()<<std::endl;
_summaryData.remove(sn);
}
static bool processAlgo(std::shared_ptr <detData> data, handleAiModelManager* _handleAiModelManager) {
cv::Mat testImg;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], testImg, cv::COLOR_GRAY2BGR);
cv::putText(testImg, "result test", cv::Point(200, 200),
1, 10, cv::Scalar(0, 255, 0), 4);
data->resultImgs.push_back(testImg);
return false;
}
private:
camera* _2DCamera_P = nullptr, * _2DCamera_N = nullptr, * _3DCamera_1 = nullptr;
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
#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/back
${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 ON)
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/qtBridge.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})
@@ -0,0 +1,78 @@
# 获取获取当前目录名
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 ON)
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 Sql REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Sql 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
Qt${QT_VERSION_MAJOR}::Sql
)
# 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})
@@ -0,0 +1,49 @@
{
"missionDllPath": "952_15_Q_2D3D_1",
"imgSavePath": "D://CCD",
"Triggers": {
"key": "finstcp",
"initStr": "init_192.168.1.50_9600_128_6_0",
"sleepTime": 20,
"readNum": 400,
"writeType": "ushort",
"heartBeatCmd": "writeHeart_short_D9204_1",
"readAllCmd": "read_byte_D8000_800",
"moduleName": "Hd_SocketModule_FinsTcp"
},
"CameraSetting": [
{
"key": "2D-P-1 (24488341)",
"connectionName": "2D-P-1 (24488341)",
"serialNum": "",
"triggerMode": "software_trigger",
"moduleName": "Hd_CameraModule_Basler_hard",
"imageShow": [
"通道1-2D正极#曝光1",
"通道1-2D正极#曝光2",
"通道1-2D正极#曝光3"
]
},
{
"key": "2D-N-1 (24488402)",
"connectionName": "2D-N-1 (24488402)",
"serialNum": "",
"triggerMode": "software_trigger",
"moduleName": "Hd_CameraModule_Basler_hard-2",
"imageShow": [
"通道1-2D负极#曝光1"
]
},
{
"key": "162762",
"connectionName": "162762",
"serialNum": "",
"triggerMode": "software_trigger",
"moduleName": "Hd_3DCameraLMI_module_PointCloud",
"imageShow": [
"通道1-3D#高度图",
"通道1-3D#亮度图"
]
}
]
}
@@ -0,0 +1,6 @@
{
"952BiaoDing_3d_threshold": 0.5,
"952BiaoDing_in_InnerOffset": 3.0,
"952BiaoDing_in_OutOffset": 23.0,
"952BiaoDing_mode": 0
}
+623
View File
@@ -0,0 +1,623 @@
{
"952-15-2D3D-1": {
"ImageView": {
"通道1-2D正极1": {
"viewer": [
"结果图",
"曝光1",
"曝光2",
"曝光3"
],
"xPos": 0,
"yPos": 0
},
"通道1-2D正极2": {
"viewer": [
"结果图",
"曝光1",
"曝光2",
"曝光3"
],
"xPos": 0,
"yPos": 1
},
"通道1-2D负极1": {
"viewer": [
"结果图",
"曝光1"
],
"xPos": 1,
"yPos": 0
},
"通道1-2D负极2": {
"viewer": [
"结果图",
"曝光1"
],
"xPos": 1,
"yPos": 1
},
"通道1-3D1": {
"viewer": [
"结果图",
"高度图",
"亮度图"
],
"xPos": 2,
"yPos": 0
},
"通道1-3D2": {
"viewer": [
"结果图",
"高度图",
"亮度图"
],
"xPos": 2,
"yPos": 1
}
},
"backend": {
"CameraSetting": [
{
"connectionName": "2D-P-1 (24488341)",
"dllPath": "Hd_CameraModule_Basler_hard",
"imageShow": [
"通道1-2D正极1#曝光1",
"通道1-2D正极1#曝光2",
"通道1-2D正极1#曝光3",
"通道1-2D正极2#曝光1",
"通道1-2D正极2#曝光2",
"通道1-2D正极2#曝光3"
],
"key": "2D-P-1 (24488341)",
"oriSaveFormat": []
},
{
"connectionName": "2D-N-1 (24488402)",
"dllPath": "Hd_CameraModule_Basler_hard",
"imageShow": [
"通道1-2D负极1#曝光1",
"通道1-2D负极2#曝光1"
],
"key": "2D-N-1 (24488402)",
"oriSaveFormat": []
},
{
"connectionName": "162762",
"dllPath": "Hd_3DCameraLMI_module_PointCloud",
"imageShow": [
"通道1-3D1#高度图",
"通道1-3D1#亮度图",
"通道1-3D2#高度图",
"通道1-3D2#亮度图"
],
"key": "162762",
"oriSaveFormat": [
"tiff",
"bmp"
]
}
],
"Triggers": {
"heartBeatCmd": "writeHeart_short_D8014_1",
"initStr": "init_192.168.1.50_9600_128_6_0",
"moduleName": "Hd_SocketModule_FinsTcp",
"readAllCmd": "read_byte_D8000_800",
"readNum": 400
},
"handleAi": {
"modelPath": "./HandleAiModels"
},
"handleAiModel": {
"cls": {
"CLS_2D_HuaShang_P": {
"gpuIndex": 0,
"modelPath": "./handleaiModels/cls_huaShang_P_0708.BHD"
},
"CLS_2D_ZangWu_P": {
"gpuIndex": 0,
"modelPath": "./handleaiModels/cls_zangWu_P_0708.BHD"
}
},
"det": {},
"seg": {
"SEG_2D_HuaShang_P": {
"gpuIndex": 1,
"modelPath": "./handleaiModels/seg_huaShang_P_0708.BHD"
},
"SEG_2D_ZangWu_P": {
"gpuIndex": 1,
"modelPath": "./handleaiModels/seg_zangWu_P_0708.BHD"
}
}
},
"imgSaveBasePath": "D://CCD",
"missionDllPath": "952_15_Q_2D3D",
"missionSettings": {
"_2D_N_Camera_Name": "2D-N-1 (24488402)",
"_2D_N_snPos": 8300,
"_2D_N_triggerPos": 8020,
"_2D_N_triggerReply": [
"D8020_0",
"D8021_1",
"D8022_1"
],
"_2D_N_viewName": "通道1-2D负极",
"_2D_P_Camera_Name": "2D-P-1 (24488341)",
"_2D_P_snPos": 8200,
"_2D_P_triggerPos": 8010,
"_2D_P_triggerReply": [
"D8010_0",
"D8011_1",
"D8012_1"
],
"_2D_P_viewName": "通道1-2D正极",
"_3D_1_Camera_Name": "162762",
"_3D_P_viewName": "通道1-3D",
"_3D_snPos": 8400,
"_3D_triggerPos": 8030,
"_3D_triggerReply": [
"D8030_0",
"D8031_1",
"D8032_1"
],
"summary_triggerPos": 8040
}
},
"softwareTile": "952-15前段端面1",
"sublUiSetting": {}
},
"952-15-2D3D-2": {
"ImageView": {
"通道2-2D正极1": {
"viewer": [
"结果图",
"曝光1",
"曝光2",
"曝光3"
],
"xPos": 0,
"yPos": 0
},
"通道2-2D正极2": {
"viewer": [
"结果图",
"曝光1",
"曝光2",
"曝光3"
],
"xPos": 0,
"yPos": 1
},
"通道2-2D负极1": {
"viewer": [
"结果图",
"曝光1"
],
"xPos": 1,
"yPos": 0
},
"通道2-2D负极2": {
"viewer": [
"结果图",
"曝光1"
],
"xPos": 1,
"yPos": 1
},
"通道2-3D1": {
"viewer": [
"结果图",
"高度图",
"亮度图"
],
"xPos": 2,
"yPos": 0
},
"通道2-3D2": {
"viewer": [
"结果图",
"高度图",
"亮度图"
],
"xPos": 2,
"yPos": 1
}
},
"backend": {
"CameraSetting": [
{
"connectionName": "2D-P-2 (24488342)",
"dllPath": "Hd_VirualCamera",
"imageShow": [
"通道2-2D正极1#曝光1",
"通道2-2D正极1#曝光2",
"通道2-2D正极1#曝光3",
"通道2-2D正极2#曝光1",
"通道2-2D正极2#曝光2",
"通道2-2D正极2#曝光3"
],
"key": "2D-P-2 (24488342)",
"oriSaveFormat": []
},
{
"connectionName": "2D-N-2 (24488458)",
"dllPath": "Hd_VirualCamera",
"imageShow": [
"通道2-2D负极1#曝光1",
"通道2-2D负极2#曝光1"
],
"key": "2D-N-2 (24488458)",
"oriSaveFormat": []
},
{
"connectionName": "156112",
"dllPath": "Hd_VirualCamera",
"imageShow": [
"通道2-3D1#高度图",
"通道2-3D1#亮度图",
"通道2-3D2#高度图",
"通道2-3D2#亮度图"
],
"key": "156112",
"oriSaveFormat": [
"tiff",
"bmp"
]
}
],
"Triggers": {
"heartBeatCmd": "writeHeart_short_D9204_1",
"initStr": "init_127.0.0.1_9600_128_6_0",
"moduleName": "Hd_SocketModule_FinsTcp",
"readAllCmd": "read_byte_D8000_800",
"readNum": 400
},
"handleAi": {
"modelPath": "./HandleAiModels"
},
"imgSaveBasePath": "D://CCD",
"missionDllPath": "952_15_Q_2D3D",
"missionSettings": {
"_2D_N_Camera_Name": "2D-N-2 (24488458)",
"_2D_N_snPos": 8800,
"_2D_N_triggerPos": 8070,
"_2D_N_triggerReply": [
"D8070_0",
"D8071_1",
"D8072_1"
],
"_2D_N_viewName": "通道2-2D负极",
"_2D_P_Camera_Name": "2D-P-2 (24488342)",
"_2D_P_snPos": 8700,
"_2D_P_triggerPos": 8060,
"_2D_P_triggerReply": [
"D8060_0",
"D8061_1",
"D8062_1"
],
"_2D_P_viewName": "通道2-2D正极",
"_3D_1_Camera_Name": "156112",
"_3D_P_viewName": "通道2-3D",
"_3D_snPos": 8900,
"_3D_triggerPos": 8080,
"_3D_triggerReply": [
"D8080_0",
"D8081_1",
"D8082_1"
],
"summary_triggerPos": 8090
}
},
"softwareTile": "952-15前段端面2",
"sublUiSetting": {}
},
"952-15-H": {
"ImageView": {
"后段1-1": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 0,
"yPos": 0
},
"后段1-2": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 0,
"yPos": 1
},
"后段2-1": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 1,
"yPos": 0
},
"后段2-2": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 1,
"yPos": 1
}
},
"backend": {
"CameraSetting": [
{
"connectionName": "25D-1",
"dllPath": "Hd_25DCameraVJ_module-ch1",
"imageShow": [
"后段1-1#正反射图像",
"后段1-1#形状图像1",
"后段1-1#标准图像",
"后段1-2#正反射图像",
"后段1-2#形状图像1",
"后段1-2#标准图像"
],
"key": "25D-1",
"oriSaveFormat": []
},
{
"connectionName": "25D-2",
"dllPath": "Hd_25DCameraVJ_module-ch2",
"imageShow": [
"后段2-1#正反射图像",
"后段2-1#形状图像1",
"后段2-1#标准图像",
"后段2-2#正反射图像",
"后段2-2#形状图像1",
"后段2-2#标准图像"
],
"key": "25D-2",
"oriSaveFormat": []
}
],
"Triggers": {
"heartBeatCmd": "writeHeart_short_D9204_1",
"initStr": "init_192.168.1.51_9600_128_6_0",
"key": "finstcp",
"moduleName": "Hd_SocketModule_FinsTcp",
"readAllCmd": "read_byte_D9200_800",
"readNum": 400,
"sleepTime": 20,
"writeType": "ushort"
},
"imgSaveBasePath": "D://CCD",
"missionDllPath": "952_15_H_25D.dll"
},
"missionSettings": {},
"softwareTile": "952-15后段",
"sublUiSetting": [
{
"height": 0,
"key": "后段1-左上留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 0,
"y": 0
},
{
"height": 0,
"key": "后段1-右上留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 1,
"y": 0
},
{
"height": 0,
"key": "后段1-左下留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 0,
"y": 1
},
{
"height": 0,
"key": "后段1-右下留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 1,
"y": 1
},
{
"height": 0,
"key": "后段1-左对齐度",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 0,
"y": 2
},
{
"height": 0,
"key": "后段1-右对齐度",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 1,
"y": 2
},
{
"height": 0,
"key": "后段2-左上留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 2,
"y": 0
},
{
"height": 0,
"key": "后段2-右上留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 3,
"y": 0
},
{
"height": 0,
"key": "后段2-左下留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 2,
"y": 1
},
{
"height": 0,
"key": "后段2-右下留白",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 3,
"y": 1
},
{
"height": 0,
"key": "后段2-左对齐度",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 2,
"y": 2
},
{
"height": 0,
"key": "后段2-右对齐度",
"limitHigh": 1.5,
"limitLow": -0.5,
"widgetType": "WaveFormWidget",
"width": 0,
"x": 3,
"y": 2
}
]
},
"952-15-Q": {
"ImageView": {
"前段1-1": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 0,
"yPos": 0
},
"前段1-2": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 0,
"yPos": 1
},
"前段2-1": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 1,
"yPos": 0
},
"前段2-2": {
"viewer": [
"结果图",
"正反射图像",
"形状图像1",
"标准图像"
],
"xPos": 1,
"yPos": 1
}
},
"backend": {
"CameraSetting": [
{
"connectionName": "25D-1",
"dllPath": "Hd_25DCameraVJ_module-ch1",
"imageShow": [
"后段1-1#正反射图像",
"后段1-1#形状图像1",
"后段1-1#标准图像",
"后段1-2#正反射图像",
"后段1-2#形状图像1",
"后段1-2#标准图像"
],
"key": "25D-1",
"oriSaveFormat": []
},
{
"connectionName": "25D-2",
"dllPath": "Hd_25DCameraVJ_module-ch2",
"imageShow": [
"后段2-1#正反射图像",
"后段2-1#形状图像1",
"后段2-1#标准图像",
"后段2-2#正反射图像",
"后段2-2#形状图像1",
"后段2-2#标准图像"
],
"key": "25D-2",
"oriSaveFormat": []
}
],
"Triggers": {
"heartBeatCmd": "writeHeart_short_D9204_1",
"initStr": "init_127.0.0.1_9600_128_6_0",
"key": "finstcp",
"moduleName": "Hd_SocketModule_FinsTcp",
"readAllCmd": "read_byte_D9200_800",
"readNum": 400,
"sleepTime": 20,
"writeType": "ushort"
},
"imgSaveBasePath": "D://CCD",
"missionDllPath": "952_15_Q_25D.dll"
},
"missionSettings": {},
"softwareTile": "952-15前段主体",
"sublUiSetting": {}
},
"main": {
"jsonVersion": "1.0.1",
"loginPassWord": "",
"objectSelect": "952-15-2D3D-1"
}
}
+11
View File
@@ -0,0 +1,11 @@
# CMakeList.txt: 遍历文件夹 添加子项目
set(OUR_LIBS "")
SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF)
message("OUR_LIBS :" ${OUR_LIBS})
# 遍历子库
foreach(dll ${OUR_LIBS})
add_subdirectory(${dll})
endforeach(dll ${})
+11
View File
@@ -0,0 +1,11 @@
# CMakeList.txt: 遍历文件夹 添加子项目
set(OUR_LIBS "")
SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF)
message("OUR_LIBS :" ${OUR_LIBS})
# 遍历子库
foreach(dll ${OUR_LIBS})
add_subdirectory(${dll})
endforeach(dll ${})
@@ -1,5 +1,11 @@
#include <581_YuHan_hanhou.h>
std::string controlAccuracy(float num, int length) {
std::string resultString = std::to_string(num);
resultString = resultString.substr(0, resultString.find(".") + length + 1);
return resultString;
}
void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint,
bool& silieResult, bool& fanZheResult,
cv::Point offset, handdleAI::pClassification* clsPtr, std::vector<cv::Mat>& clsImgs){
@@ -13,7 +19,7 @@ void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint,
rect.x += offset.x;
rect.y += offset.y;
if (originRect.width < 50 || originRect.height < 50)
if (originRect.width < 200 || originRect.height < 200)
continue;
std::vector<cv::Mat> clsImgVec = cutImg2ClsVec(rect, src);
std::vector<int> clsRes;//true ok
@@ -69,7 +75,7 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment
out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量
out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量
if (out_Flag.D() == 1)
if (out_Flag.D() == 0)
{
for (auto i = 0; i < out_LinePoint.Length(); i += 4)
{
@@ -79,13 +85,23 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment
cv::Scalar(0, 255, 0), 5);
}
double value1 = out_Distance[0].D();
double value2 = out_Distance[1].D();
double value3 = out_Distance[2].D();
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 jiEr_Height = out_Distance[4].D();//极耳的高度
double hanYin_Distance_Up = out_Distance[5].D();//焊印上边缘到极耳上边缘的距离
double hanYin_Distance_Down = out_Distance[6].D();//焊印下边缘到极耳下边缘的距离
result.jiErWidth = value1;
result.jiErHeight = value2;
result.hanYin1 = value3;
result.jiErWidth = jiEr_Width;
result.jiErHeight = jiEr_Height;
result.hanYin_Width = hanYin_Width;
result.hanYin_Height = hanYin_Height;
result.hanYin_Area = hanYIn_Area;
result.hanYin_Distance_Up = hanYin_Distance_Up;
result.hanYin_Distance_Down = hanYin_Distance_Down;
}
}
else
{
@@ -100,33 +116,17 @@ halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegment
bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address) {
QByteArray plcResult = "2";
try {
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
QString resultTag = "OK";
Mat srcImage;
srcImage = img2D.clone();
cv::Mat dstImage;
srcImage.copyTo(dstImage);
cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5);
putTextHusky(dstImage, utf8_to_gbk("AI_OK").c_str(), cv::Point(1800, 50), cv::Scalar(0, 255, 0), 200);
putTextHusky(dstImage, utf8_to_gbk("ALGO_OK").c_str(), cv::Point(1800, 250), cv::Scalar(0, 255, 0), 200);
cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5);
resMat.push_back(dstImage);
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, resultTag));
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, resultTag));
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
cv::Mat sourceImg = data->oriImgs[0];
//sourceImg = cv::imread("./testImages/" + std::to_string(_detParams->cameraIndex) + ".bmp");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
//HALCON异步处理
cv::Mat hySegResult;
auto futrue = std::async(std::launch::async, halconAlgoProcess, sourceImg, Paint, _detParams->segHanYinZhuaQu, std::ref(hySegResult));//异步执行
auto futrue = std::async(std::launch::async, halconAlgoProcess,sourceImg, Paint, _detParams->segHanYinZhuaQu, std::ref(hySegResult));//异步执行
//handleAI主线程处理 定位极耳
float resizeRate = 5.0;
@@ -147,10 +147,11 @@ bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams
cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet);
bool silieOk = true, fanZheOk = true;
std::vector<cv::Mat> clsImgs;
handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rect.x * resizeRate, rect.y * resizeRate), _detParams->clsHanHou, clsImgs);
//handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rectCutJier.x, rectCutJier.y, _detParams->clsHanHou, clsImgs);
//等待halcon算法完成
futrue.wait();
data->oriImgs.push_back(hySegResult);
halconResult halconResult = futrue.get();
//结果处理
QString okNgSaveText = "OK";
@@ -158,39 +159,58 @@ bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams
QByteArray fanzheResultText = fanZheOk == true ? "1" : "2";
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
if (silieOk == true && fanZheOk == true) {//OK
textPainter.putText(Paint, "缺陷检测OK", cv::Point(4000, 50), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "缺陷检测OK", cv::Point(4200, 50), cv::Scalar(0, 255, 0));
}
else {
textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4000, 50), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(4200, 50), cv::Scalar(0, 0, 255));
plcResult = "2";
data->aiDetOK = false;
}
if (halconResult.result == true) {
textPainter.putText(Paint, "算法OK", cv::Point(4000, 350), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "算法OK", cv::Point(4200, 350), cv::Scalar(0, 255, 0));
}
else {
textPainter.putText(Paint, "算法NG", cv::Point(4000, 350), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "算法NG", cv::Point(4200, 350), cv::Scalar(0, 0, 255));
plcResult = "2";
data->halconOK = false;
}
plcResult = "1"; 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("极耳长度(上限)", 10.5).toDouble();
double jierChangLimitLow = data->service->_paramSyncManager->get("极耳长度(下限)", 9.5).toDouble();
bool jierChangEnable = data->service->_paramSyncManager->get("极耳长度判定启用", false).toBool();
#pragma endregion
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_" + silieResultText);//发送数据-撕裂OKNG
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 1) + "_" + fanzheResultText);//发送数据-翻折OKNG
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(halconResult.jiErWidth));//发送数据-极耳宽
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(halconResult.jiErHeight));//发送数据-极耳高
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//发送数据-焊印位置判定结果
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(halconResult.hanYin1));//发送数据-芯包顶部到焊印的距离
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(halconResult.hanYin_Distance_Down));//发送数据-芯包顶部到焊印的距离
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_" + QByteArray::number(halconResult.hanYin_Width));//发送数据-极耳宽
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, "极耳高度" + std::to_string(halconResult.jiErHeight), cv::Point(100, 300), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "焊印上边缘到极耳上边缘高度" + std::to_string(halconResult.hanYin1), cv::Point(100, 550), cv::Scalar(0, 255, 0));
//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));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
return true;
#endif
}
CATCH_EXCEPTIONS
@@ -200,7 +220,7 @@ bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0));
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");//结果反馈
@@ -210,28 +230,10 @@ bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams
bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address) {
QByteArray plcResult = "2";
try{
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
QString resultTag = "OK";
Mat srcImage;
srcImage = img2D.clone();
cv::Mat dstImage;
srcImage.copyTo(dstImage);
cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5);
putTextHusky(dstImage, utf8_to_gbk("AI_OK").c_str(), cv::Point(1800, 50), cv::Scalar(0, 255, 0), 200);
cv::resize(dstImage, dstImage, cv::Size(), 0.5, 0.5);
resMat.push_back(dstImage);
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, resultTag));
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, resultTag));
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
//存图数据加保存队列,加锁,避免数据访问冲突
cv::Mat sourceImg = data->oriImgs[0];
//sourceImg = cv::imread("./testImages/"+ std::to_string(_detParams->cameraIndex) +".bmp");
cv::Mat Paint;
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
@@ -252,19 +254,24 @@ bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, s
//SEG缺陷检测
cv::Mat SegRes = ~_detParams->segHanHou->Evaluate(matDet);
data->segOriginImgs.push_back(matDet);
bool silieOk = true, fanZheOk = true;
std::vector<cv::Mat> clsImgs;
handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rect.x * resizeRate, rect.y * resizeRate), _detParams->clsHanHou, clsImgs);
if (_detParams->cameraIndex > 4) {
handleAiProcess(sourceImg, SegRes, Paint, silieOk, fanZheOk, cv::Point(rectCutJier.x, rectCutJier.y), _detParams->clsHanHou, clsImgs);
}
QString okNgSaveText = "OK";
QByteArray silieResultText = silieOk == true ? "1" : "2";
QByteArray fanzheResultText = fanZheOk == true ? "1" : "2";
plcResult = "1";
cv::Rect cutPaintRect = cv::Rect(rectCutJier.x - 100, rectCutJier.y - 100, rectCutJier.width + 200, rectCutJier.height + 200) & cv::Rect(0, 0, sourceImg.cols, sourceImg.rows);
Paint = Paint(cutPaintRect).clone();//裁切结果图,确保界面只显示一个极耳
TextRendererZH textPainter(Paint.cols, Paint.rows, 200);
if (silieOk == true && fanZheOk == true) {//OK
textPainter.putText(Paint, "OK", cv::Point(3000, 50), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
}
else {
textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(3000, 50), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "撕裂/翻折NG", cv::Point(50, 50), cv::Scalar(0, 0, 255));
plcResult = "2";
data->aiDetOK = false;
}
@@ -274,7 +281,6 @@ bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, s
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
return true;
#endif
}
CATCH_EXCEPTIONS
@@ -284,7 +290,7 @@ bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, s
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0));
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");//结果反馈
@@ -292,8 +298,11 @@ bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, s
}
mission* createMission() {
return new _581_YuHan_hanhou();
return new _581_YuHan_hanqian();
}
void destroyMission(mission* _mission) {
delete _mission;
@@ -0,0 +1,156 @@
#include <missionBase.hpp>
#include <sxGlobal.h>
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
#pragma endregion
class yuHanHanHouParams {
public:
handdleAI::pSegmentation* segHanYinZhuaQu = nullptr;
handdleAI::pSegmentation* segYuHanDingWei = nullptr;
handdleAI::pSegmentation* segHanHou = nullptr;
handdleAI::pClassification* clsHanHou = nullptr;
int cameraIndex = 1;
bool isTong = true;
};
struct halconResult {
bool result = true;
double hanYin_Width = -1;//焊印宽度
double hanYin_Height = -1;//焊印高度
double hanYin_Area = -1;//焊印面积
double jiErWidth = -1;//极耳的宽度
double jiErHeight = -1;//极耳的高度
double hanYin_Distance_Up = -1;//焊印上边缘到极耳上边缘的距离
double hanYin_Distance_Down = -1;//焊印下边缘到极耳下边缘的距离
};
void handleAiProcess(cv::Mat& src, cv::Mat& segRes, cv::Mat& Paint,
bool& silieResult, bool& fanZheResult,
cv::Point offset, handdleAI::pClassification* clsPtr, std::vector<cv::Mat>& clsImgs,int sgin);
halconResult halconAlgoProcess(cv::Mat& img, cv::Mat& Paint, handdleAI::pSegmentation* seg_hanYinZhuaQu, cv::Mat& segResult);
bool hanHouCeLiang(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address);
bool hanHouDown(std::shared_ptr <detData> data, yuHanHanHouParams* _detParams, sx_581_address address);
class _581_YuHan_hanqian : public mission {
public:
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top90_1;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down90_2;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top90_3;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down90_4;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_top45_5;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> lv_down45_6;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_top45_7;
_581_SX_Single_triggerTemplate< yuHanHanHouParams> tong_down45_8;
//std::vector < yuHanHanHouParams> tongDetParams;
//std::vector < yuHanHanHouParams> lvDetParams;
std::vector < yuHanHanHouParams> tong_90_DetParams;
std::vector < yuHanHanHouParams> lv_90_DetParams;
std::vector < yuHanHanHouParams> dibu_45_tong_DetParams;
std::vector < yuHanHanHouParams> dingbu_45_tong_DetParams;
std::vector < yuHanHanHouParams> dibu_45_lv_DetParams;
std::vector < yuHanHanHouParams> dingbu_45_lv_DetParams;
bool initOnce = false;
void onConfigReloaded() {
HDevEngineCpp::HDevEngine myEngine;
myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl");
if (initOnce == false) {
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.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_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.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_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_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_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_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_DetParams.push_back(dingbu_45_tong);
initOnce = true;
}
lv_90_DetParams[0].cameraIndex = 1;
lv_90_DetParams[1].cameraIndex = 2;
tong_90_DetParams[0].cameraIndex = 3;
tong_90_DetParams[1].cameraIndex = 4;
dingbu_45_lv_DetParams[0].cameraIndex = 5;
dibu_45_lv_DetParams[0].cameraIndex = 6;
dingbu_45_tong_DetParams[0].cameraIndex = 7;
dibu_45_tong_DetParams[0].cameraIndex = 8;
}
bool initCustom() {
#pragma region 注册触发器回调
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);
tong_down90_4.init("Camera4", "极耳尺寸-外-铜-相机4(底部90°)", { { 528, 1,{540},"529","536",-1} }, 1, &tong_90_DetParams[1], _serviceManager, bridge, hanHouDown);
lv_top45_5.init("Camera5", "底部撕裂-外-铝-相机5(顶部45°)", { { 562,1,{540},"563","570",-1} }, 1, &dingbu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown);
lv_down45_6.init("Camera6", "底部撕裂-外-铝-相机6(底部45°)", { { 564, 1,{540},"565","572",-1} }, 1, &dibu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown);
tong_top45_7.init("Camera7", "底部撕裂-外-铜-相机7(顶部45°)", { { 566, 1,{540},"567","574",-1} }, 1, &dingbu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown);
tong_down45_8.init("Camera8", "底部撕裂-外-铜-相机8(底部45°)", { { 568, 1,{540},"569","576",-1} }, 1, &dibu_45_tong_DetParams[0], _serviceManager, bridge, hanHouDown);
}
else {
lv_top90_1.init("Camera1", "极耳尺寸-内-铝-相机1(顶部90°)", { { 602, 1,{580},"603","610",860} }, 1, &lv_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang);
lv_down90_2.init("Camera2", "极耳尺寸-内-铝-相机2(底部90°)", { { 604, 1,{580},"605","612",-1} }, 1, &lv_90_DetParams[1], _serviceManager, bridge, hanHouDown);
tong_top90_3.init("Camera3", "极耳尺寸-内-铜-相机3(顶部90°)", { { 606,1,{580},"607","614",840} }, 1, &tong_90_DetParams[0], _serviceManager, bridge, hanHouCeLiang);
tong_down90_4.init("Camera4", "极耳尺寸-内-铜-相机4(底部90°)", { { 608, 1,{580},"609","616",-1} }, 1, &tong_90_DetParams[1], _serviceManager, bridge, hanHouDown);
lv_top45_5.init("Camera5", "底部撕裂-内-铝-相机5(顶部45°)", { { 642,1,{580},"643","650",-1} }, 1, &dingbu_45_lv_DetParams[0], _serviceManager, bridge, hanHouDown);
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;
}
};
#pragma once
@@ -68,7 +68,7 @@ bool handleAiProcess(cv::Mat& seg_detImg, cv::Mat& seg_Paint,
for (int i = 0; i < contours.size(); i++)
{
cv::Rect cls_rect = cv::boundingRect(contours[i]);
if (cls_rect.width < 50 || cls_rect.height < 50)
if (cls_rect.width < 200 || cls_rect.height < 200)
continue;
#if 1
std::vector<cv::Mat> clsImgVec = cutImg2ClsVec(cls_rect, seg_detImg);
@@ -164,11 +164,12 @@ bool jiErFanZhe(std::shared_ptr <detData> data, yuHanHanQianParams* _detParams,
auto rect = getImageLocateRect(sourceImg, _detParams->segDingWei, 1.0 / resizeRate);//定位
rect = rect & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows));//防止越界
bool isNG = false;
cv::Mat seg_saveImg;
cv::Mat seg_CutImg,seg_LocateImg;
sourceImg(rect).copyTo(seg_CutImg);
cv::resize(sourceImg, seg_LocateImg, cv::Size(), 0.2, 0.2);
if (rect.width > 500 || rect.height > 500) {
isNG = handleAiProcess(sourceImg(rect), Paint(rect), _detParams->segJiErFanZhe, _detParams->clsJiErFanZhe, data->clsOriginImgs);
cv::rectangle(Paint, rect, cv::Scalar(0, 255, 255), 3);
cv::resize(sourceImg(rect), seg_saveImg, cv::Size(), 0.5, 0.5);
}
else {
isNG = true;
@@ -182,14 +183,15 @@ bool jiErFanZhe(std::shared_ptr <detData> data, yuHanHanQianParams* _detParams,
}
else
{
textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "NG", cv::Point(100, 50), cv::Scalar(0, 0, 255));
data->aiDetOK = false;
plcResult = "2";
}
plcResult = "1";//强制OK
data->resultImgs.push_back(Paint);
sourceImg.release();
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
data->segOriginImgs.push_back(seg_CutImg);
data->segOriginImgs.push_back(seg_LocateImg);
data->resultImgs.push_back(Paint);
return true;
#endif
}
@@ -228,13 +230,13 @@ public:
if (initOnce == false) {
for (auto& params : tongDetParams) {
params.segDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_dingwei_seg.BHD", 64, 0);
params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_segT.BHD", 64, 0);
params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/60_2_hanqian_clsT.BHD", 0, 1);
params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/hanqian_T-seg.BHD", 64, 0);
params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/hanqian_T-cls.BHD", 0, 1);
}
for (auto& params : lvDetParams) {
params.segDingWei = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_dingwei_seg.BHD", 64, 1);
params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/60_2_hanqian_segL.BHD", 64, 1);
params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/60_2_hanqian_clsL.BHD", 1, 1);
params.segJiErFanZhe = handdleAI::CreateSegObjS("./handleaiModels/yuhan_hanqian/hanqian_L-seg.BHD", 64, 1);
params.clsJiErFanZhe = handdleAI::CreateClsObjV3("./handleaiModels/yuhan_hanqian/hanqian_L-cls.BHD", 1, 1);
params.isTong = false;
}
initOnce = true;
@@ -244,8 +246,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);
+11
View File
@@ -0,0 +1,11 @@
# CMakeList.txt: 遍历文件夹 添加子项目
set(OUR_LIBS "")
SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF)
message("OUR_LIBS :" ${OUR_LIBS})
# 遍历子库
foreach(dll ${OUR_LIBS})
add_subdirectory(${dll})
endforeach(dll ${})
@@ -128,7 +128,9 @@ bool zhongHan_hanHouCeLiang(std::shared_ptr <detData> data, zhongHan2dCeLiangPar
textPainter.putText(Paint, "上焊印长:" + QString::number(out_HYValues1[0].D(),'f', 3).toStdString() + "mm", cv::Point(50, 360), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "上焊印宽:" + QString::number(out_HYValues1[1].D(),'f', 3).toStdString() + "mm", cv::Point(50, 480), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "上焊印面积:" + QString::number(out_HYValues1[2].D(), 'f', 3).toStdString() + "mm²", cv::Point(50, 600), cv::Scalar(0, 255, 0));
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance1[1].D()));
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance1[2].D()));
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(out_Distance1[2].D()));
}
//2
{
@@ -143,8 +145,12 @@ bool zhongHan_hanHouCeLiang(std::shared_ptr <detData> data, zhongHan2dCeLiangPar
else {
textPainter.putText(Paint, "下焊印右边缘到连接片圆心竖直间距:" + QString::number(out_Distance2[1].D(), 'f', 3).toStdString() + "mm", cv::Point(50, cutImage.rows - 170), cv::Scalar(0, 255, 0));
}
xingBaoDingBuDaoHanYinJianJu = (out_Distance1[2].D() + out_Distance2[2].D())/2;
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 8) + "_" + QByteArray::number(out_Distance2[2].D()));
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 10) + "_" + QByteArray::number(out_Distance2[2].D()));
if (data->cameraKeyName == "Camera1")
data->service->_triggerManager->writeFloat("D5820_" + QByteArray::number(xingBaoDingBuDaoHanYinJianJu));
else
@@ -174,11 +174,6 @@ bool hanQianCeLiang_Main(std::shared_ptr <detData> data, zhongHanHanQianParams*
cv::drawMarker(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), cv::Scalar(0, 255, 0), cv::MARKER_CROSS, 200, 5);
cv::circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5);
}
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
plcResult = "1";//强制OK
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
return true;
}
else{
std::string errTails = out_NGTails.S().Text();
@@ -192,6 +187,7 @@ bool hanQianCeLiang_Main(std::shared_ptr <detData> data, zhongHanHanQianParams*
plcResult = "1";//强制OK
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
return true;
}
CATCH_EXCEPTIONS
+11
View File
@@ -0,0 +1,11 @@
# CMakeList.txt: 遍历文件夹 添加子项目
set(OUR_LIBS "")
SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF)
message("OUR_LIBS :" ${OUR_LIBS})
# 遍历子库
foreach(dll ${OUR_LIBS})
add_subdirectory(${dll})
endforeach(dll ${})
@@ -45,7 +45,7 @@ bool Hd_VirtualCamera::readData(std::vector<cv::Mat>& mat, QByteArray& data)
n_mutex->unlock();
//for (int i=0;i<dstMat.size();i++)
// imwrite("D://CCD//2.5//2.5D_" + to_string(clock()) + "_"+ sImageType [i] + ".bmp", dstMat[i]);
mat.assign(dstMat.begin(), dstMat.end());
mat.insert(mat.end(), dstMat.begin(), dstMat.end());
qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << "get image";
return true;