备份
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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 ${})
|
||||
@@ -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 ${})
|
||||
+73
-64
@@ -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
|
||||
+14
-12
@@ -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);
|
||||
@@ -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 ${})
|
||||
+7
-1
@@ -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
|
||||
+1
-5
@@ -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
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user