稳定版本 备份
This commit is contained in:
@@ -41,9 +41,10 @@ static void createDirectoryIfNotExists(const std::string& path) {
|
||||
std::filesystem::create_directories(path);
|
||||
//std::cout << "已创建文件夹: " << path << std::endl;
|
||||
}
|
||||
else {/*
|
||||
std::cout << "文件夹已存在: " << path << std::endl;*/
|
||||
}
|
||||
}
|
||||
static void createDirectoryIfNotExists(const QString& path) {
|
||||
QDir dir;
|
||||
dir.mkpath(path);
|
||||
}
|
||||
|
||||
#pragma once
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
QString uuid = getUuid();//根据时间和随机数生成的值,唯一
|
||||
std::string SNcode;//SN条码
|
||||
std::string cameraKeyName;//相机名
|
||||
std::map<std::string, QVariant> resultData;//结果数据
|
||||
triggerManager* triggerPtr = nullptr;//触发器指针 一般为plc模块指针
|
||||
#pragma endregion
|
||||
#pragma region 存图相关
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <qqueue.h>
|
||||
#include <qdatetime.h>
|
||||
#include <backStruct.h>
|
||||
#define saveImgEnable 1
|
||||
enum imgSaveThreadType
|
||||
{
|
||||
oriImg,
|
||||
@@ -48,7 +49,9 @@ public:
|
||||
while (!localQueue.isEmpty()) {
|
||||
auto data = std::move(localQueue.dequeue());
|
||||
qDebug() << "saving img " << QString::fromStdString(data.first);
|
||||
#if saveImgEnable
|
||||
cv::imwrite(data.first, data.second);
|
||||
#endif
|
||||
// 不需要手动 release(), cv::Mat 会自动析构
|
||||
}
|
||||
}
|
||||
@@ -96,31 +99,31 @@ class imgSaveThreadManager
|
||||
{
|
||||
public:
|
||||
imgSaveThreadManager(std::string pathIn) {
|
||||
path = pathIn;
|
||||
path = QString::fromStdString(pathIn);
|
||||
}
|
||||
~imgSaveThreadManager() {};
|
||||
void setPath(std::string pathIn){
|
||||
void setPath(QString pathIn){
|
||||
path = pathIn;
|
||||
}
|
||||
imgSaveThread saveThread;
|
||||
std::string genDirName(std::shared_ptr <detData> data, imgSaveThreadType type) {
|
||||
QString genDirName(std::shared_ptr <detData> data, imgSaveThreadType type) {
|
||||
//sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data->SNcode);//查找之前的数据
|
||||
//获取关键数据
|
||||
std::string imgSaveDirStr = path;//所有图片的路径 sample "D://CCD"
|
||||
std::string imgTypeDirStr;//二级目录,图片类型决定 sample "Result"
|
||||
std::string dateDirStr;//三级目录,日期决定 sample"2024-6-8"
|
||||
std::string hourDirStr;//四级目录,小时段决定 sample "14H"
|
||||
std::string okNgStr;//五级目录,OK/NG决定 sample "OK"
|
||||
std::string detailNameStr;//六级目录 主要是SN,如没有sn则可能是相机名称
|
||||
QString imgSaveDirStr = path;//所有图片的路径 sample "D://CCD"
|
||||
QString imgTypeDirStr;//二级目录,图片类型决定 sample "Result"
|
||||
QString dateDirStr;//三级目录,日期决定 sample"2024-6-8"
|
||||
QString hourDirStr;//四级目录,小时段决定 sample "14H"
|
||||
QString okNgStr;//五级目录,OK/NG决定 sample "OK"
|
||||
QString detailNameStr;//六级目录 主要是SN,如没有sn则可能是相机名称
|
||||
#pragma region 赋值
|
||||
//imgTypeDirStr
|
||||
switch (type)
|
||||
{
|
||||
case oriImg:
|
||||
imgTypeDirStr = "Ori";
|
||||
imgTypeDirStr = "原图";
|
||||
break;
|
||||
case resImg:
|
||||
imgTypeDirStr = "Result";
|
||||
imgTypeDirStr = "结果图";
|
||||
break;
|
||||
default:
|
||||
imgTypeDirStr = "error";
|
||||
@@ -128,20 +131,24 @@ public:
|
||||
|
||||
{
|
||||
QDateTime currentDateTime = QDateTime::currentDateTime();
|
||||
dateDirStr = currentDateTime.toString("yyyy-MM-dd").toStdString();
|
||||
hourDirStr = std::to_string(currentDateTime.time().hour()) + "H//";
|
||||
dateDirStr = currentDateTime.toString("yyyy-MM-dd");
|
||||
hourDirStr = QString::number(currentDateTime.time().hour()) + "H//";
|
||||
}
|
||||
if(data->aiDetOK == true && data->halconOK == true)
|
||||
okNgStr = "OK";
|
||||
else
|
||||
if(data->aiDetOK == false && data->halconOK == false)
|
||||
okNgStr = "NG";
|
||||
else if (data->aiDetOK == false)
|
||||
okNgStr = "aiNG";
|
||||
else if (data->halconOK == false)
|
||||
okNgStr = "halconNG";
|
||||
else
|
||||
okNgStr = "OK";
|
||||
//detailNameStr
|
||||
if ((data->SNcode).length() != 0)
|
||||
detailNameStr = data->SNcode;
|
||||
detailNameStr = QString::fromStdString(data->SNcode);
|
||||
else
|
||||
detailNameStr = data->cameraKeyName;
|
||||
detailNameStr = QString::fromStdString(data->cameraKeyName);
|
||||
#pragma endregion
|
||||
return std::string(imgSaveDirStr + "/" +
|
||||
return QString(imgSaveDirStr + "/" +
|
||||
imgTypeDirStr + "/" +
|
||||
dateDirStr + "/" +
|
||||
hourDirStr + "/" +
|
||||
@@ -184,33 +191,34 @@ public:
|
||||
|
||||
void saveOri(std::shared_ptr <detData> data)
|
||||
{
|
||||
std::string fileSavePath = genDirName(data, oriImg);//获取文件夹名
|
||||
QString fileSavePath = genDirName(data, oriImg);//获取文件夹名
|
||||
createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建
|
||||
std::vector<std::string>fileNames = genFileNames(data, oriImg);
|
||||
|
||||
for (int index = 0; index < fileNames.size(); index++)
|
||||
saveThread.addData(fileSavePath+fileNames[index], data->oriImgs[index]);
|
||||
saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + fileNames[index], data->oriImgs[index]);
|
||||
int queueSize = saveThread.queueSize();
|
||||
if (queueSize > 10)
|
||||
qDebug() << "queueSize " << queueSize;
|
||||
}
|
||||
void saveRes(std::shared_ptr <detData> data)
|
||||
{
|
||||
std::string fileSavePath = genDirName(data, resImg);//获取文件夹名
|
||||
QString fileSavePath = genDirName(data, resImg);//获取文件夹名
|
||||
createDirectoryIfNotExists(fileSavePath);//不存在此文件夹则创建
|
||||
//结果图保存
|
||||
std::vector<std::string>resFileNames = genFileNames(data, resImg);
|
||||
for (int index = 0; index < resFileNames.size(); index++)
|
||||
saveThread.addData(fileSavePath + resFileNames[index], data->resultImgs[index], imgSaveThread::priority);
|
||||
saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + resFileNames[index], data->resultImgs[index], imgSaveThread::priority);
|
||||
|
||||
//seg
|
||||
std::vector<std::string>segFileNames = genFileNames(data, segImg);
|
||||
for (int index = 0; index < segFileNames.size(); index++)
|
||||
saveThread.addData(fileSavePath + segFileNames[index], data->segOriginImgs[index]);
|
||||
saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + segFileNames[index], data->segOriginImgs[index]);
|
||||
|
||||
//cls
|
||||
std::vector<std::string>clsFileNames = genFileNames(data, clsImg);
|
||||
for (int index = 0; index < clsFileNames.size(); index++)
|
||||
saveThread.addData(fileSavePath + clsFileNames[index], data->clsOriginImgs[index].second);
|
||||
saveThread.addData(fileSavePath.toLocal8Bit().toStdString() + clsFileNames[index], data->clsOriginImgs[index].second);
|
||||
|
||||
//额外储存NG文件夹
|
||||
//std::string additionalSaveNgImgPath = genDirName(data, additionalSaveNgImg);
|
||||
@@ -235,7 +243,7 @@ public:
|
||||
//}
|
||||
}
|
||||
private:
|
||||
std::string path = "";
|
||||
QString path = "";
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -36,6 +36,9 @@ void handleAiModelManager::handleAiModelManager::run()
|
||||
init = true;
|
||||
status = InitOK;
|
||||
}
|
||||
else {
|
||||
status = InitOK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
//#include <appCore.hpp>
|
||||
#include <serviceModule.h>
|
||||
#include <nlohmannJson.hpp>
|
||||
const bool enableHandleAiModel = true; // 是否启用HandleAI模型
|
||||
const bool enableHandleAiModel = false; // 是否启用HandleAI模型
|
||||
class handleAiModelSeg
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -6,25 +6,31 @@
|
||||
#include <HDevEngineCpp.h>
|
||||
#include <HalconCpp.h>
|
||||
#include <chrono>
|
||||
#include <functional>
|
||||
#include <serviceManager.h>
|
||||
|
||||
template<typename handleAiModelsTemplate>
|
||||
using namespace std::placeholders;
|
||||
template<typename handleAiModelsTemplate,typename resultTemplate>
|
||||
class detCallbackChain {
|
||||
public:
|
||||
enum class State { Idle, algoEvaluate, resultHandle, Finished };
|
||||
using resultHandleCallback = std::function<void(std::shared_ptr <detData>)>;
|
||||
using processAlgoCallback = std::function<bool(std::shared_ptr <detData>, handleAiModelsTemplate*)>;
|
||||
detCallbackChain(imgSaveThreadManager* imgSaveThreadManager = nullptr,
|
||||
handleAiModelsTemplate* _handleAiModelsIn = nullptr)
|
||||
: _imgSaveThreadManager(imgSaveThreadManager), _handleAiModels(_handleAiModelsIn) {
|
||||
using resultHandleCallback = std::function<void(std::shared_ptr <detData>, resultTemplate)>;
|
||||
using processAlgoCallback = std::function<resultTemplate(std::shared_ptr <detData>, handleAiModelsTemplate*)>;
|
||||
detCallbackChain(ServiceManager* _ServiceManagerIn, handleAiModelsTemplate* _handleAiModelsTemplateIn)
|
||||
: _imgSaveThreadManager(_ServiceManagerIn->_imgSaveThreadManager),
|
||||
_handleAiModels(_handleAiModelsTemplateIn),
|
||||
_triggerManager(_ServiceManagerIn->_triggerManager){
|
||||
|
||||
int threadCount = 2 * QThread::idealThreadCount();
|
||||
QThreadPool::globalInstance()->setMaxThreadCount(threadCount);
|
||||
|
||||
}
|
||||
void ansyncProcess(std::shared_ptr <detData> data) {
|
||||
void ansyncProcess(std::shared_ptr <detData> data, QByteArray afterTakeImgCmd = "") {
|
||||
#pragma region 方法1 较慢
|
||||
QFuture<void> future = QtConcurrent::run([this, data]() {
|
||||
process(data);
|
||||
QFuture<void> future = QtConcurrent::run([this, data, afterTakeImgCmd]() {
|
||||
process(data, afterTakeImgCmd);
|
||||
});
|
||||
//std::cout << "now runing" << std::to_string(QThreadPool::globalInstance()->activeThreadCount()) << std::endl;
|
||||
#pragma endregion
|
||||
#pragma region 方法2 较慢 安全
|
||||
//QThread* thread = new QThread;
|
||||
@@ -51,29 +57,30 @@ public:
|
||||
// });
|
||||
#pragma endregion
|
||||
}
|
||||
void process(std::shared_ptr <detData> data) {
|
||||
void process(std::shared_ptr <detData> data, QByteArray afterTakeImgCmd = "") {
|
||||
|
||||
while (data->oriImgs.size() < data->imgAmountMin) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
if(afterTakeImgCmd != "")
|
||||
_triggerManager->writeShort(afterTakeImgCmd); //发送拍照完成指令
|
||||
//等待图片满足要求后,储存原图,异步执行算法函数
|
||||
|
||||
algoEvaluate(data, _handleAiModels);
|
||||
auto resultData = algoEvaluate(data, _handleAiModels);
|
||||
//执行完毕后异步获取储存使用结果
|
||||
resultHandle(data);
|
||||
resultHandle(data, resultData);
|
||||
// 确保线程安全退出
|
||||
qDebug() << "Processing finished for data with UUID:" << data->uuid;
|
||||
QThread::currentThread()->quit();
|
||||
}
|
||||
|
||||
bool algoEvaluate(std::shared_ptr <detData> data, handleAiModelsTemplate* model) {
|
||||
|
||||
resultTemplate algoEvaluate(std::shared_ptr <detData> data, handleAiModelsTemplate* model) {
|
||||
resultTemplate result;
|
||||
try {
|
||||
std::chrono::steady_clock::time_point algoStartTime = std::chrono::steady_clock::now();
|
||||
bool result = _processAlgoCallback(data, model);
|
||||
result = _processAlgoCallback(data, model);
|
||||
std::chrono::steady_clock::time_point algoEndTime = std::chrono::steady_clock::now();
|
||||
data->algoTime = std::chrono::duration_cast<std::chrono::milliseconds>(algoEndTime - algoStartTime).count();
|
||||
return result;
|
||||
}
|
||||
catch (HDevEngineCpp::HDevEngineException& ex) {
|
||||
std::cout << "HDevEngineException: " << ex.Message() << std::endl;
|
||||
@@ -94,17 +101,17 @@ public:
|
||||
std::cout << "Caught exception: " << e.what() << std::endl;
|
||||
qDebug() << "Caught exception: " << e.what();
|
||||
}
|
||||
return false;
|
||||
return result;
|
||||
}
|
||||
|
||||
void resultHandle(std::shared_ptr <detData> data){
|
||||
void resultHandle(std::shared_ptr <detData> data, resultTemplate& resultdata){
|
||||
std::shared_ptr <detData> dataPtr = data;
|
||||
detDataManager* dManager = data->dManager;
|
||||
data->dManager->deleteDetData(data->uuid);
|
||||
try {
|
||||
detectionResultHandle(data);
|
||||
for (auto func : resultHandleCallbacks)
|
||||
func(data);
|
||||
func(data, resultdata);
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
@@ -125,12 +132,11 @@ public:
|
||||
qDebug() << totalCtStr;
|
||||
//std::cout << totalCtStr.toStdString() << std::endl;
|
||||
// 将耗时数据保存入数据库或日志
|
||||
// data->sqlVec.push_back({ "SN", data->SNcode });
|
||||
// data->sqlVec.push_back({ "totalCt", std::to_string(totalCt.count()) + "ms" });
|
||||
|
||||
data->sqlVec.push_back({ "SN", data->SNcode });
|
||||
data->sqlVec.push_back({ "totalCt", std::to_string(data->algoTime) + "ms" });
|
||||
// 异步保存检测图像
|
||||
std::async(std::launch::async, &imgSaveThreadManager::saveOri, _imgSaveThreadManager, data);
|
||||
std::async(std::launch::async, &imgSaveThreadManager::saveRes, _imgSaveThreadManager, data);
|
||||
std::thread([this,data] {_imgSaveThreadManager->saveOri(data); }).detach();
|
||||
std::thread([this,data] {_imgSaveThreadManager->saveRes(data); }).detach();
|
||||
}
|
||||
#pragma region 注册回调函数
|
||||
|
||||
@@ -146,9 +152,11 @@ public:
|
||||
private:
|
||||
imgSaveThreadManager* _imgSaveThreadManager = nullptr;
|
||||
handleAiModelsTemplate* _handleAiModels = nullptr;
|
||||
|
||||
triggerManager* _triggerManager = nullptr;
|
||||
std::vector< resultHandleCallback>resultHandleCallbacks;
|
||||
processAlgoCallback _processAlgoCallback;
|
||||
//std::vector<QFuture<void>> futures; // 用于存储异步处理的结果
|
||||
|
||||
|
||||
ServiceManager* _serviceManager;
|
||||
};
|
||||
#pragma once
|
||||
@@ -1,14 +1,14 @@
|
||||
#include <cameraManager.h>
|
||||
#include <cameraManager.h>
|
||||
#include <triggerManager.h>
|
||||
#include <detData.h>
|
||||
#include <imgSaveThreadManager.h>
|
||||
|
||||
class ServiceManager {
|
||||
public:
|
||||
detDataManager* _detDataManager = nullptr;// 检测数据管理器 需要初始化
|
||||
imgSaveThreadManager* _imgSaveThreadManager = nullptr;// 保存图像线程 需要初始化
|
||||
triggerManager* _triggerManager = nullptr;// 触发管理器
|
||||
handleAiModelManager* _handleAiModelManager = nullptr;// 模型管理器
|
||||
detDataManager* _detDataManager = nullptr;// 检测数据管理器 需要初始化
|
||||
imgSaveThreadManager* _imgSaveThreadManager = nullptr;// 保存图像线程 需要初始化
|
||||
triggerManager* _triggerManager = nullptr;// 触发管理器
|
||||
handleAiModelManager* _handleAiModelManager = nullptr;// 模型管理器
|
||||
detThreadManager* _threadManager = nullptr;
|
||||
cameraManager* _cameraManager = nullptr;
|
||||
};
|
||||
|
||||
Binary file not shown.
@@ -6,12 +6,23 @@
|
||||
#include <QHBoxLayout>
|
||||
#include <QMessageBox>
|
||||
#include <nlohmannJson.hpp>
|
||||
|
||||
class JsonEditorDialog : public QDialog {
|
||||
#include <qtablewidget.h>
|
||||
#include <QHeaderView>
|
||||
#include <qlabel.h>
|
||||
#include <global.h>
|
||||
#include<uiModule/components/fancyButton.h>
|
||||
class JsonEditor : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
JsonEditorDialog(const nlohmann::json& json, QWidget* parent = nullptr)
|
||||
: QDialog(parent), m_json(json), m_originalJson(json)
|
||||
virtual nlohmann::json getJson() { return nlohmann::json(); };
|
||||
};
|
||||
|
||||
class JsonEditorGeneral : public JsonEditor {
|
||||
Q_OBJECT
|
||||
public:
|
||||
JsonEditorGeneral(const nlohmann::json& json, QWidget* parent = nullptr)
|
||||
: //QDialog(parent),
|
||||
m_json(json), m_originalJson(json)
|
||||
{
|
||||
setWindowTitle("JSON 编辑器");
|
||||
resize(600, 400);
|
||||
@@ -31,11 +42,11 @@ public:
|
||||
mainLayout->addWidget(m_textEdit);
|
||||
mainLayout->addLayout(btnLayout);
|
||||
|
||||
connect(m_btnOk, &QPushButton::clicked, this, &JsonEditorDialog::onAccept);
|
||||
connect(m_btnOk, &QPushButton::clicked, this, &JsonEditorGeneral::onAccept);
|
||||
connect(m_btnCancel, &QPushButton::clicked, this, &QDialog::reject);
|
||||
}
|
||||
|
||||
nlohmann::json getJson() const { return m_json; }
|
||||
nlohmann::json getJson() { return m_json; }
|
||||
|
||||
private slots:
|
||||
void onAccept() {
|
||||
@@ -133,3 +144,146 @@ private:
|
||||
QPushButton* m_btnOk;
|
||||
QPushButton* m_btnCancel;
|
||||
};
|
||||
|
||||
class JsonParamTableEditor : public JsonEditor {
|
||||
Q_OBJECT
|
||||
public:
|
||||
JsonParamTableEditor(const nlohmann::json& json, QWidget* parent = nullptr)
|
||||
: m_json(json), m_originalJson(json)
|
||||
{
|
||||
setWindowTitle("JSON 表格编辑器");
|
||||
resize(600, 400);
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
this->setObjectName("JsonParamTableEditor");
|
||||
this->setStyleSheet(QString("QDialog#JsonParamTableEditor {background-color: rgb(%1);border: 2px solid #000000;border-radius: 6px;}").arg(sColor_Blue));
|
||||
// -------------------
|
||||
// 表格
|
||||
m_tableWidget = new QTableWidget(this);
|
||||
m_tableWidget->setColumnCount(2);
|
||||
m_tableWidget->setHorizontalHeaderLabels({ "", "数值" });
|
||||
m_tableWidget->horizontalHeader()->setStretchLastSection(true);
|
||||
m_tableWidget->verticalHeader()->hide(); // 不显示序号
|
||||
|
||||
int row = 0;
|
||||
for (auto& [key, value] : m_json.items()) {
|
||||
m_tableWidget->insertRow(row);
|
||||
|
||||
QTableWidgetItem* keyItem = new QTableWidgetItem(QString::fromStdString(key));
|
||||
keyItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
||||
m_tableWidget->setItem(row, 0, keyItem);
|
||||
|
||||
QTableWidgetItem* valueItem = new QTableWidgetItem(QString::fromStdString(value.dump()));
|
||||
m_tableWidget->setItem(row, 1, valueItem);
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
// -------------------
|
||||
// 底部按钮
|
||||
m_btnOk = new fancyButtonText(70,22,"保存", "");
|
||||
m_btnCancel = new fancyButtonText(70, 22, "取消", "");
|
||||
|
||||
QHBoxLayout* btnLayout = new QHBoxLayout;
|
||||
btnLayout->addStretch();
|
||||
btnLayout->addWidget(m_btnOk);
|
||||
btnLayout->addWidget(m_btnCancel);
|
||||
|
||||
// -------------------
|
||||
// 主布局
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||||
mainLayout->addWidget(m_tableWidget);
|
||||
mainLayout->addLayout(btnLayout);
|
||||
|
||||
// -------------------
|
||||
// 信号槽
|
||||
connect(m_btnOk, &QPushButton::clicked, this, &JsonParamTableEditor::onAccept);
|
||||
connect(m_btnCancel, &QPushButton::clicked, this, &QDialog::reject);
|
||||
|
||||
|
||||
m_tableWidget->setStyleSheet(QString(R"(
|
||||
QTableWidget {
|
||||
background-color: rgb(%1);
|
||||
font-family: "Microsoft YaHei";
|
||||
font-size: 12pt;
|
||||
color: #ffffff;
|
||||
}
|
||||
QHeaderView::section {
|
||||
background-color: #0078d7;
|
||||
padding: 4px;
|
||||
font-weight: bold;
|
||||
}
|
||||
)").arg(sColor_Blue).arg(sColor_GoldWithBlack));
|
||||
}
|
||||
|
||||
nlohmann::json getJson() const { return m_json; }
|
||||
|
||||
private slots:
|
||||
void onAccept() {
|
||||
nlohmann::json newJson = m_originalJson;
|
||||
|
||||
for (int row = 0; row < m_tableWidget->rowCount(); ++row) {
|
||||
QString key = m_tableWidget->item(row, 0)->text();
|
||||
QString valStr = m_tableWidget->item(row, 1)->text();
|
||||
|
||||
try {
|
||||
auto& oldVal = m_originalJson.at(key.toStdString());
|
||||
nlohmann::json parsed = nlohmann::json::parse(valStr.toStdString());
|
||||
|
||||
if (!typeCompatible(oldVal, parsed)) {
|
||||
QMessageBox::warning(this, "类型错误",
|
||||
QString("键 \"%1\" 的类型与原始不符,期望类型: %2")
|
||||
.arg(key)
|
||||
.arg(QString::fromStdString(typeName(oldVal))));
|
||||
return;
|
||||
}
|
||||
|
||||
newJson[key.toStdString()] = parsed;
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
QMessageBox::warning(this, "解析错误",
|
||||
QString("键 \"%1\" 的值无法解析为 JSON: %2")
|
||||
.arg(key)
|
||||
.arg(e.what()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_json = newJson;
|
||||
accept();
|
||||
}
|
||||
|
||||
private:
|
||||
bool typeCompatible(const nlohmann::json& old_val, const nlohmann::json& new_val) {
|
||||
return old_val.type() == new_val.type();
|
||||
}
|
||||
|
||||
std::string typeName(const nlohmann::json& val) {
|
||||
switch (val.type()) {
|
||||
case nlohmann::json::value_t::string: return "string";
|
||||
case nlohmann::json::value_t::number_integer: return "integer";
|
||||
case nlohmann::json::value_t::number_unsigned: return "unsigned integer";
|
||||
case nlohmann::json::value_t::number_float: return "float";
|
||||
case nlohmann::json::value_t::boolean: return "boolean";
|
||||
case nlohmann::json::value_t::array: return "array";
|
||||
case nlohmann::json::value_t::object: return "object";
|
||||
case nlohmann::json::value_t::null: return "null";
|
||||
default: return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
nlohmann::json m_json;
|
||||
nlohmann::json m_originalJson;
|
||||
|
||||
QTableWidget* m_tableWidget;
|
||||
fancyButtonText* m_btnOk;
|
||||
fancyButtonText* m_btnCancel;
|
||||
};
|
||||
|
||||
class JsonEditorSelector {
|
||||
public:
|
||||
static JsonEditor* selector(const nlohmann::json& json, QWidget* parent = nullptr) {
|
||||
return new JsonParamTableEditor(json, parent);
|
||||
}
|
||||
};
|
||||
#pragma once
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <qlistwidget.h>
|
||||
#include <uiModule/uiModule_historyListWidget.h>
|
||||
#include <uiModule/uiModule_952BiaoDingSwitch.h>
|
||||
#include <jsonEditorDialog.h>
|
||||
class displayWidget :public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -22,7 +23,7 @@ public:
|
||||
historyShowListWidget* historyImgs = new historyShowListWidget();
|
||||
//uiModuleLocationMap* _uiModuleLocationMap = new uiModuleLocationMap();
|
||||
LogWindow* log = new LogWindow();
|
||||
displayWidget(appConfig* config)
|
||||
displayWidget(appConfig* config) :m_config(config)
|
||||
{
|
||||
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
this->setMaximumSize(9999, 9999);
|
||||
@@ -68,16 +69,30 @@ public:
|
||||
QPalette palette;
|
||||
palette.setColor(QPalette::WindowText, Qt::white);
|
||||
QFont font("微软雅黑", 24, QFont::Bold);
|
||||
QVBoxLayout* hLayout = new QVBoxLayout(leftWidget);
|
||||
hLayout->setContentsMargins(0, 0, 0, 0);
|
||||
QVBoxLayout* vLayout = new QVBoxLayout(leftWidget);
|
||||
vLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
Title = new QLabel(u8"主界面");
|
||||
Title->setFont(font);
|
||||
Title->setPalette(palette);
|
||||
Title->setAlignment(Qt::AlignLeft);
|
||||
hLayout->addWidget(Title);
|
||||
|
||||
hLayout->addWidget(&_ImageWidgetManager);
|
||||
fancyButtonText* btn = new fancyButtonText(200, 50, u8"修改检测参数", "");
|
||||
connect(btn, &QPushButton::clicked, [=]() {
|
||||
JsonEditor* dlg = JsonEditorSelector::selector(m_config->settingJson["backend"]["missionSettings"], this);
|
||||
dlg->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(dlg, &QDialog::accepted, this, [this, dlg]() {
|
||||
m_config->settingJson["backend"]["missionSettings"] = dlg->getJson();
|
||||
});
|
||||
dlg->show(); });
|
||||
|
||||
QHBoxLayout* titleLayout = new QHBoxLayout(this);
|
||||
|
||||
titleLayout->addWidget(Title);
|
||||
titleLayout->addWidget(btn);
|
||||
vLayout->addLayout(titleLayout);
|
||||
|
||||
vLayout->addWidget(&_ImageWidgetManager);
|
||||
_ImageWidgetManager.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
for (auto& vData : config->viewDatas)
|
||||
{
|
||||
@@ -111,7 +126,8 @@ private slots:
|
||||
emit historyClickSignal(path);
|
||||
emit changeStackWidget(3);
|
||||
}
|
||||
|
||||
private:
|
||||
appConfig* m_config;
|
||||
signals:
|
||||
void historyClickSignal(QString);
|
||||
void changeStackWidget(int);
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
m_plot->xAxis->setLabelColor(Qt::white); // "时间" / "数值" 文字
|
||||
m_plot->yAxis->setLabelColor(Qt::white);
|
||||
|
||||
m_plot->yAxis->setRange(m_limitLow - 2, m_limitHigh + 2);
|
||||
|
||||
|
||||
// 鼠标追踪用的 tracer
|
||||
m_tracer = new QCPItemTracer(m_plot);
|
||||
@@ -89,6 +89,15 @@ public:
|
||||
|
||||
// 绑定鼠标移动事件
|
||||
connect(m_plot, &QCustomPlot::mouseMove, this, &WaveFormWidget::onMouseMoveInPlot);
|
||||
if (title.contains("对齐度")) {
|
||||
auto fixedTicker = QSharedPointer<QCPAxisTickerFixed>(new QCPAxisTickerFixed);
|
||||
fixedTicker->setTickStep(0.1);
|
||||
fixedTicker->setScaleStrategy(QCPAxisTickerFixed::ssNone); // 不自动放大
|
||||
m_plot->yAxis->setTicker(fixedTicker);
|
||||
m_plot->yAxis->setRange(-0.2,0.8);
|
||||
}
|
||||
else
|
||||
m_plot->yAxis->setRange(qMax(0.0, m_limitLow - (m_limitHigh - m_limitLow)), m_limitHigh + 2);
|
||||
|
||||
|
||||
addLimitLines(m_limitHigh, m_limitLow);
|
||||
@@ -103,14 +112,14 @@ public:
|
||||
m_xOverLimit.append(m_timeCounter);
|
||||
m_yOverLimit.append(value);
|
||||
|
||||
auto* textItem = new QCPItemText(m_plot);
|
||||
textItem->setPositionAlignment(Qt::AlignLeft | Qt::AlignBottom);
|
||||
textItem->position->setType(QCPItemPosition::ptPlotCoords);
|
||||
textItem->position->setCoords(m_timeCounter, value);
|
||||
textItem->setText(QString::number(value, 'f', 2));
|
||||
textItem->setColor(Qt::yellow);
|
||||
textItem->setFont(QFont("微软雅黑", 8,QFont::Bold));
|
||||
m_textItems.append(textItem);
|
||||
//auto* textItem = new QCPItemText(m_plot);
|
||||
//textItem->setPositionAlignment(Qt::AlignLeft | Qt::AlignBottom);
|
||||
//textItem->position->setType(QCPItemPosition::ptPlotCoords);
|
||||
//textItem->position->setCoords(m_timeCounter, value);
|
||||
//textItem->setText(QString::number(value, 'f', 2));
|
||||
//textItem->setColor(Qt::yellow);
|
||||
//textItem->setFont(QFont("微软雅黑", 8,QFont::Bold));
|
||||
//m_textItems.append(textItem);
|
||||
}
|
||||
|
||||
++m_timeCounter;
|
||||
@@ -154,7 +163,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
void editJsonParameters() {
|
||||
JsonEditorDialog* dlg = new JsonEditorDialog(m_json, this);
|
||||
JsonEditor* dlg = JsonEditorSelector::selector(m_json, this);
|
||||
dlg->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(dlg, &QDialog::accepted, this, [this, dlg]() {
|
||||
m_json = dlg->getJson();
|
||||
@@ -204,7 +213,7 @@ private:
|
||||
addLimitLines(m_limitHigh, m_limitLow);
|
||||
|
||||
// 更新坐标范围
|
||||
m_plot->yAxis->setRange(m_limitLow - 2, m_limitHigh + 2);
|
||||
//m_plot->yAxis->setRange(m_limitLow - (m_limitHigh - m_limitLow), m_limitHigh + (m_limitHigh - m_limitLow));
|
||||
|
||||
// 清空超限数据
|
||||
m_xOverLimit.clear();
|
||||
@@ -295,16 +304,6 @@ public:
|
||||
|
||||
m_layout->addWidget(m_title);
|
||||
|
||||
fancyButtonText* btn = new fancyButtonText(200, 50, u8"修改检测参数","");
|
||||
connect(btn, &QPushButton::clicked, [=]() {
|
||||
JsonEditorDialog* dlg = new JsonEditorDialog(m_config->settingJson["backend"]["missionSettings"], this);
|
||||
dlg->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(dlg, &QDialog::accepted, this, [this, dlg]() {
|
||||
m_config->settingJson["backend"]["missionSettings"] = dlg->getJson();
|
||||
});
|
||||
dlg->show(); });
|
||||
m_layout->addWidget(btn);
|
||||
|
||||
m_mainWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
m_layout->addWidget(m_mainWidget);
|
||||
parsingJson(json);
|
||||
|
||||
@@ -6,16 +6,16 @@ void appConfig::parsingSettingJson()
|
||||
{
|
||||
fs::path appWorkPath = fs::current_path();
|
||||
originJson = readJsonFromPath(appWorkPath.string() + "/config/setting.json");
|
||||
jsonVersion = originJson["main"]["jsonVersion"];
|
||||
jsonVersion = originJson["jsonVersion"];
|
||||
if(jsonVersion != "1.0.1"){
|
||||
std::cout << "Json version mismatch, please update the config file." << std::endl;
|
||||
std::cout << "Json版本不匹配,请检查json配置文件" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
objectSelect = originJson["main"]["objectSelect"];
|
||||
loginPassWord = originJson["main"]["loginPassWord"];
|
||||
objectSelect = originJson["objectSelect"];
|
||||
loginPassWord = originJson["loginPassWord"];
|
||||
|
||||
settingJson = originJson[objectSelect];
|
||||
settingJson = readJsonFromPath(appWorkPath.string() + "/config/" + objectSelect +".json");
|
||||
softwareTile = settingJson["softwareTile"];
|
||||
imgSavePath = settingJson["backend"]["imgSaveBasePath"];
|
||||
//viewer
|
||||
|
||||
@@ -14,6 +14,7 @@ public:
|
||||
void saveSettingJson() {
|
||||
originJson[objectSelect] = settingJson;
|
||||
saveJsonFromPath("./config/setting.json", originJson);
|
||||
saveJsonFromPath("./config/"+ objectSelect +".json", settingJson);
|
||||
}
|
||||
nlohmann::json settingJson;
|
||||
std::string softwareTile;//软件标题
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
file_name, file_path + "/" + file_name + ".log", 0, 0); // 日志按天保存
|
||||
logger_->set_level(spdlog::level::debug); // 设置日志级别为 Debug
|
||||
spdlog::flush_every(std::chrono::seconds(1));//每秒写入一次
|
||||
logger_->set_pattern("[%Y-%m-%d %H:%M:%S] [Thread %t] [%l] %v");
|
||||
logger_->set_pattern("[%Y-%m-%d %H:%M:%S %e] [Thread %t] [%l] %v");
|
||||
}
|
||||
catch (const std::exception& ex) {
|
||||
std::cout << "Log initialization failed: " << ex.what() << std::endl;
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
#include <detCallbackChain.hpp>
|
||||
|
||||
|
||||
struct M952_15_H_summaryData
|
||||
struct M952_15_H_algoResult
|
||||
{
|
||||
QString LT_Distance = "-1";
|
||||
QString RT_Distance = "-1";
|
||||
QString LD_Distance = "-1";
|
||||
QString RD_Distance = "-1";
|
||||
QString L_Duiqidu = "-1";
|
||||
QString R_Duiqidu = "-1";
|
||||
double LT_Distance = -1;
|
||||
double RT_Distance = -1;
|
||||
double LD_Distance = -1;
|
||||
double RD_Distance = -1;
|
||||
double L_Duiqidu = -1;
|
||||
double R_Duiqidu = -1;
|
||||
|
||||
bool aiResultIsNG = true;
|
||||
bool aiResultIsOK = false;
|
||||
};
|
||||
class handleAIModels {
|
||||
public:
|
||||
@@ -51,7 +51,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr <detData> data,cv::Mat
|
||||
for (int i = 0; i < contours.size(); i++) {
|
||||
cv::Rect rect = cv::boundingRect(contours[i]);
|
||||
if (rect.width < _handleAiModels->handleAI_WIDTH && rect.height < _handleAiModels->handleAI_HEIGHT) continue; // 过滤掉小轮廓
|
||||
auto clsImgs = cutImg2ClsVec(rect, img);
|
||||
auto clsImgs = cutImg2ClsVec(rect, img,cv::Size(256,256));
|
||||
bool clsIsNg = false;
|
||||
for (auto& clsImg : clsImgs) {
|
||||
int clsResult = _handleAiModels->CLS_25D->Evaluate(clsImg);
|
||||
@@ -63,7 +63,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr <detData> data,cv::Mat
|
||||
cv::Scalar color = cv::Scalar(0, 255, 0);
|
||||
if (clsIsNg == true) {
|
||||
color = cv::Scalar(0, 0, 255);
|
||||
isOK = true;
|
||||
isOK = false;
|
||||
cv::Mat imgTmp;
|
||||
cv::cvtColor(img(rect), imgTmp, cv::COLOR_GRAY2BGR);
|
||||
QMutexLocker locker(&paintMutex);
|
||||
@@ -84,7 +84,7 @@ static bool _952_15_H_25D_ALGO_HuaShangAI(std::shared_ptr <detData> data,cv::Mat
|
||||
return isOK;
|
||||
}
|
||||
|
||||
static bool _952_15_H_Algo(std::shared_ptr <detData> data, handleAIModels* _handleAIModels)
|
||||
static M952_15_H_algoResult _952_15_H_Algo(std::shared_ptr <detData> data, handleAIModels* _handleAIModels)
|
||||
{
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
HDevEngineCpp::HDevProcedure proc("Cal_LouBai_Distance");
|
||||
@@ -94,13 +94,13 @@ static bool _952_15_H_Algo(std::shared_ptr <detData> data, handleAIModels* _hand
|
||||
if (data->oriImgs.size() != 3)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
return M952_15_H_algoResult();
|
||||
}
|
||||
if (data->oriImgs[0].rows == 100) {
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2);
|
||||
return true;
|
||||
return M952_15_H_algoResult();
|
||||
}
|
||||
|
||||
cv::Mat Paint;
|
||||
@@ -117,7 +117,7 @@ static bool _952_15_H_Algo(std::shared_ptr <detData> data, handleAIModels* _hand
|
||||
else
|
||||
src2.copyTo(Paint);
|
||||
|
||||
std::future <bool> future = std::async(std::launch::async, _952_15_H_25D_ALGO_HuaShangAI, data, data->oriImgs[2], _handleAIModels, std::ref(Paint), std::ref(paintMutex));
|
||||
//std::future <bool> future = std::async(std::launch::async, _952_15_H_25D_ALGO_HuaShangAI, data, data->oriImgs[2], _handleAIModels, std::ref(Paint), std::ref(paintMutex));
|
||||
HTuple out_Distance, out_ResultRows, out_ResultCols, out_Flag, out_LinePonit;
|
||||
{
|
||||
HObject in_Image1 = MatToHObject(src1);
|
||||
@@ -179,37 +179,37 @@ static bool _952_15_H_Algo(std::shared_ptr <detData> data, handleAIModels* _hand
|
||||
textPainter.putText(Paint, "留白算法NG", cv::Point(0, 200), cv::Scalar(0, 0, 255));
|
||||
data->halconOK = false;
|
||||
}
|
||||
M952_15_H_algoResult resultData;
|
||||
resultData.LT_Distance = LT_Distance;
|
||||
resultData.RT_Distance = RT_Distance;
|
||||
resultData.LD_Distance = LD_Distance;
|
||||
resultData.RD_Distance = RD_Distance;
|
||||
resultData.L_Duiqidu = L_Duiqidu;
|
||||
resultData.R_Duiqidu = R_Duiqidu;
|
||||
|
||||
data->resultData.insert(std::make_pair("LT_Distance", LT_Distance));
|
||||
data->resultData.insert(std::make_pair("RT_Distance", RT_Distance));
|
||||
data->resultData.insert(std::make_pair("LD_Distance", LD_Distance));
|
||||
data->resultData.insert(std::make_pair("RD_Distance", RD_Distance));
|
||||
data->resultData.insert(std::make_pair("L_Duiqidu", L_Duiqidu));
|
||||
data->resultData.insert(std::make_pair("R_Duiqidu", R_Duiqidu));
|
||||
|
||||
bool futureResult = future.get();
|
||||
/*bool futureResult = future.get();
|
||||
if (futureResult) {
|
||||
textPainter.putText(Paint, "模型检测结果: NG", cv::Point(0, 50), cv::Scalar(0, 0, 255));
|
||||
textPainter.putText(Paint, "模型检测结果: OK", cv::Point(0, 50), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
else {
|
||||
textPainter.putText(Paint, "模型检测结果: OK", cv::Point(0, 50), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "模型检测结果: NG", cv::Point(0, 50), cv::Scalar(0, 0, 255));
|
||||
}
|
||||
data->resultData.insert(std::make_pair("aiResultIsNG", futureResult));
|
||||
resultData.aiResultIsOK = futureResult;*/
|
||||
|
||||
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); // 缩小结果图
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG
|
||||
//data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG
|
||||
|
||||
finish = clock();
|
||||
qDebug() << "[Debug]2D useTime:" << finish - start << "ms";
|
||||
return true;
|
||||
return resultData;
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
class M952_15_H : public mission {
|
||||
public:
|
||||
summaryData<M952_15_H_summaryData> _summaryData;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels>> algo_liubai;
|
||||
summaryData<M952_15_H_algoResult> _summaryData;
|
||||
detCallbackChain<handleAIModels, M952_15_H_algoResult>* algo_liubai;
|
||||
handleAIModels _handleAIModels;
|
||||
void parseJson(nlohmann::json& json) {
|
||||
_handleAIModels.liubai_Enforcement_OK = json.value("留白检测结果强制OK", true);
|
||||
@@ -264,7 +264,7 @@ public:
|
||||
_25DCamera_2 = _serviceManager->_cameraManager->getCamera("25D-2");
|
||||
if (_25DCamera_2 == nullptr) {
|
||||
std::cout << "camera ->> 25D-2 not found" << std::endl;
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
#pragma endregion
|
||||
#pragma region 注册触发器回调
|
||||
@@ -275,11 +275,9 @@ public:
|
||||
_serviceManager->_triggerManager->registerCallback(9800, 1, [this](QByteArray& byteArray) {sumRequest2(byteArray); }, "25D-2结果获取触发");
|
||||
#pragma endregion
|
||||
#pragma region 处理算法回调链
|
||||
algo_liubai = std::make_shared<detCallbackChain<handleAIModels>>(_serviceManager->_imgSaveThreadManager, &_handleAIModels);
|
||||
algo_liubai = new detCallbackChain<handleAIModels, M952_15_H_algoResult> (_serviceManager,&_handleAIModels);
|
||||
algo_liubai->registerProcessAlgoCallback(_952_15_H_Algo);
|
||||
algo_liubai->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
|
||||
HouDuan12ResultHandle(data);
|
||||
}));
|
||||
algo_liubai->registerResultHandleCallback(std::bind(&M952_15_H::HouDuan12ResultHandle, this, _1, _2));
|
||||
#pragma endregion
|
||||
|
||||
return true;
|
||||
@@ -288,7 +286,7 @@ public:
|
||||
bool houduan1SecondTime = false;
|
||||
void HouDuan1(QByteArray& byteArray){
|
||||
int snPos = 9300;
|
||||
_serviceManager->_triggerManager->writeShort({ "D9200_0","D9201_1","D9202_1" });
|
||||
_serviceManager->_triggerManager->writeShort({ "D9200_0","D9201_1" });
|
||||
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
|
||||
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
|
||||
"2.5D-H-1",sn, 3, _25DCamera_1->config.oriSaveFormat);//创建数据包
|
||||
@@ -303,7 +301,7 @@ public:
|
||||
else
|
||||
data->resultImgShowSet.push_back(new showImgPack("后段1-2", "结果图"));
|
||||
houduan1SecondTime = !houduan1SecondTime;
|
||||
algo_liubai->ansyncProcess(data);//处理算法
|
||||
algo_liubai->ansyncProcess(data, "D9202_1");//处理算法
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
|
||||
}
|
||||
|
||||
@@ -311,7 +309,7 @@ public:
|
||||
bool houduan2SecondTime = false;
|
||||
void HouDuan2(QByteArray& byteArray){
|
||||
int snPos = 9700;
|
||||
_serviceManager->_triggerManager->writeShort({"D9600_0","D9601_1","D9602_1"});
|
||||
_serviceManager->_triggerManager->writeShort({"D9600_0","D9601_1"});
|
||||
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
|
||||
|
||||
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
|
||||
@@ -324,11 +322,11 @@ public:
|
||||
else
|
||||
data->resultImgShowSet.push_back(new showImgPack("后段2-2", "结果图"));
|
||||
houduan2SecondTime = !houduan2SecondTime;
|
||||
algo_liubai->ansyncProcess(data);//处理算法
|
||||
algo_liubai->ansyncProcess(data, "D9602_1");//处理算法
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
|
||||
}
|
||||
|
||||
void HouDuan12ResultHandle(std::shared_ptr <detData>data){
|
||||
void HouDuan12ResultHandle(std::shared_ptr <detData>data, M952_15_H_algoResult resultData){
|
||||
//发送图片
|
||||
if (data->resultImgs.size() > 0){
|
||||
for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){
|
||||
@@ -340,43 +338,33 @@ public:
|
||||
}
|
||||
}
|
||||
//结果数据保存
|
||||
if (data->resultData.size() > 0){
|
||||
std::string sn = data->SNcode;
|
||||
try {
|
||||
M952_15_H_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();
|
||||
dataPtr->aiResultIsNG = data->resultData["aiResultIsNG"].toBool();
|
||||
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());
|
||||
|
||||
}
|
||||
|
||||
std::string sn = data->SNcode;
|
||||
try {
|
||||
M952_15_H_algoResult* dataPtr = _summaryData.get(sn);
|
||||
*dataPtr = resultData;
|
||||
if (data->cameraKeyName == "2.5D-H-1") {
|
||||
emit bridge->summaryData_addData("后段1-左上留白", resultData.LT_Distance);
|
||||
emit bridge->summaryData_addData("后段1-右上留白", resultData.RT_Distance);
|
||||
emit bridge->summaryData_addData("后段1-左下留白", resultData.LD_Distance);
|
||||
emit bridge->summaryData_addData("后段1-右下留白", resultData.RD_Distance);
|
||||
emit bridge->summaryData_addData("后段1-左对齐度", resultData.L_Duiqidu);
|
||||
emit bridge->summaryData_addData("后段1-右对齐度", resultData.R_Duiqidu);
|
||||
}
|
||||
catch (...) {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
|
||||
}
|
||||
}
|
||||
else {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode);
|
||||
else{
|
||||
emit bridge->summaryData_addData("后段2-左上留白", resultData.LT_Distance);
|
||||
emit bridge->summaryData_addData("后段2-右上留白", resultData.RT_Distance);
|
||||
emit bridge->summaryData_addData("后段2-左下留白", resultData.LD_Distance);
|
||||
emit bridge->summaryData_addData("后段2-右下留白", resultData.RD_Distance);
|
||||
emit bridge->summaryData_addData("后段2-左对齐度", resultData.L_Duiqidu);
|
||||
emit bridge->summaryData_addData("后段2-右对齐度", resultData.R_Duiqidu);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
catch (...) {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
|
||||
}
|
||||
qDebug() << "SN:" << QString::fromStdString(data->SNcode) << "检测结束 结果获取完成" ;
|
||||
}
|
||||
|
||||
@@ -387,39 +375,41 @@ public:
|
||||
|
||||
int snPos = 9500;
|
||||
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
|
||||
M952_15_H_summaryData* dataPtr = _summaryData.get(sn);
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9410_"+ dataPtr->RT_Distance);//右上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9412_" + dataPtr->RD_Distance);//右下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9414_" + dataPtr->R_Duiqidu);//右对其度
|
||||
M952_15_H_algoResult* dataPtr = _summaryData.get(sn);
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9410_"+ QString::number(dataPtr->RT_Distance));//右上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9412_" + QString::number(dataPtr->RD_Distance));//右下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9414_" + QString::number(dataPtr->R_Duiqidu));//右对其度
|
||||
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9436_" + dataPtr->LT_Distance);//左上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9438_" + dataPtr->LD_Distance);//左下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9440_" + dataPtr->L_Duiqidu);//左对其度
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9436_" + QString::number(dataPtr->LT_Distance));//左上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9438_" + QString::number(dataPtr->LD_Distance));//左下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9440_" + QString::number(dataPtr->L_Duiqidu));//左对其度
|
||||
|
||||
int result = 1;
|
||||
//留白检测结果
|
||||
if (_handleAIModels.liubai_Enforcement_OK == false)if (dataPtr->RT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->RD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
if (_handleAIModels.liubai_Enforcement_OK == false)
|
||||
if (dataPtr->RT_Distance> _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->RD_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LT_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LD_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
|
||||
dataPtr->RT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->RD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold) {
|
||||
dataPtr->RT_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->RD_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LT_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LD_Distance < _handleAIModels.liubai_MinThreshold) {
|
||||
result = 2;
|
||||
qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " 留白检测结果NG";
|
||||
}
|
||||
//对齐度检测结果
|
||||
if (_handleAIModels.duiqidu_Enforcement_OK == false)if (dataPtr->R_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->L_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->R_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold ||
|
||||
dataPtr->L_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold) {
|
||||
if (_handleAIModels.duiqidu_Enforcement_OK == false)
|
||||
if (dataPtr->R_Duiqidu > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->L_Duiqidu > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->R_Duiqidu < _handleAIModels.duiqidu_MinThreshold ||
|
||||
dataPtr->L_Duiqidu < _handleAIModels.duiqidu_MinThreshold) {
|
||||
result = 2;
|
||||
qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " 对齐度检测结果NG";
|
||||
}
|
||||
//AI模型检测结果
|
||||
if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsNG == true) {
|
||||
if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsOK == false) {
|
||||
result = 2;
|
||||
qDebug() << "通道1 SN:" << QString::fromStdString(sn) << " AI模型检测结果NG";
|
||||
}
|
||||
@@ -441,39 +431,41 @@ public:
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_short_D9800_0");
|
||||
int snPos = 9900;
|
||||
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
|
||||
M952_15_H_summaryData* dataPtr = _summaryData.get(sn);
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9810_" + dataPtr->RT_Distance);//右上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9812_" + dataPtr->RD_Distance);//右下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9814_" + dataPtr->R_Duiqidu);//右对其度
|
||||
M952_15_H_algoResult* dataPtr = _summaryData.get(sn);
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9810_" + QString::number(dataPtr->RT_Distance));//右上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9812_" + QString::number(dataPtr->RD_Distance));//右下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9814_" + QString::number(dataPtr->R_Duiqidu));//右对其度
|
||||
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9836_" + dataPtr->LT_Distance);//左上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9838_" + dataPtr->LD_Distance);//左下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9840_" + dataPtr->L_Duiqidu);//左对其度
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9836_" + QString::number(dataPtr->LT_Distance));//左上留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9838_" + QString::number(dataPtr->LD_Distance));//左下留白
|
||||
_serviceManager->_triggerManager->sendFinsMsg("write_float_D9840_" + QString::number(dataPtr->L_Duiqidu));//左对其度
|
||||
|
||||
int result = 1;
|
||||
//留白检测结果
|
||||
if(_handleAIModels.liubai_Enforcement_OK == false)if (dataPtr->RT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->RD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LT_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LD_Distance.toDouble() > _handleAIModels.liubai_MaxThreshold ||
|
||||
if(_handleAIModels.liubai_Enforcement_OK == false)
|
||||
if (dataPtr->RT_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->RD_Distance> _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LT_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
dataPtr->LD_Distance > _handleAIModels.liubai_MaxThreshold ||
|
||||
|
||||
dataPtr->RT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->RD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LT_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LD_Distance.toDouble() < _handleAIModels.liubai_MinThreshold ) {
|
||||
dataPtr->RT_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->RD_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LT_Distance < _handleAIModels.liubai_MinThreshold ||
|
||||
dataPtr->LD_Distance < _handleAIModels.liubai_MinThreshold ) {
|
||||
result = 2;
|
||||
qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " 留白检测结果NG";
|
||||
}
|
||||
//对齐度检测结果
|
||||
if (_handleAIModels.duiqidu_Enforcement_OK == false)if( dataPtr->R_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->L_Duiqidu.toDouble() > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->R_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold ||
|
||||
dataPtr->L_Duiqidu.toDouble() < _handleAIModels.duiqidu_MinThreshold) {
|
||||
if (_handleAIModels.duiqidu_Enforcement_OK == false)
|
||||
if( dataPtr->R_Duiqidu > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->L_Duiqidu > _handleAIModels.duiqidu_MaxThreshold ||
|
||||
dataPtr->R_Duiqidu < _handleAIModels.duiqidu_MinThreshold ||
|
||||
dataPtr->L_Duiqidu < _handleAIModels.duiqidu_MinThreshold) {
|
||||
result = 2;
|
||||
qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " 对齐度检测结果NG";
|
||||
}
|
||||
//AI模型检测结果
|
||||
if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsNG == true) {
|
||||
if (_handleAIModels.handleAI_Enforcement_OK == false)if (dataPtr->aiResultIsOK == true) {
|
||||
result = 2;
|
||||
qDebug() << "通道2 SN:" << QString::fromStdString(sn) << " AI模型检测结果NG";
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ static bool _952_15_Q_25D_ALGO_HuaShangAI(cv::Mat& img, handleAIModels* _handleA
|
||||
return isNg;
|
||||
}
|
||||
|
||||
static bool _952_15_Q_25D_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
|
||||
static M952_15_Q_summaryData _952_15_Q_25D_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
|
||||
//获取模型
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
|
||||
@@ -72,7 +72,7 @@ static bool _952_15_Q_25D_ALGO(std::shared_ptr <detData> data, handleAIModels* _
|
||||
if (data->oriImgs.size() != 3)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
return M952_15_Q_summaryData();
|
||||
}
|
||||
|
||||
cv::Mat Paint;
|
||||
@@ -88,7 +88,7 @@ static bool _952_15_Q_25D_ALGO(std::shared_ptr <detData> data, handleAIModels* _
|
||||
}
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->aiDetOK = futureResult; // 如果任一检测结果为NG,则整体结果为NG
|
||||
return true;
|
||||
return M952_15_Q_summaryData();
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
@@ -96,7 +96,7 @@ class M952_15_Q : public mission {
|
||||
public:
|
||||
handleAIModels _handleAIModels;
|
||||
summaryData<M952_15_Q_summaryData> _summaryData;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels>> algo_25D;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels,M952_15_Q_summaryData>> algo_25D;
|
||||
bool init(ServiceManager* _serviceManagerIN,
|
||||
nlohmann::json& _missionJson,
|
||||
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
|
||||
@@ -123,11 +123,9 @@ public:
|
||||
_serviceManager->_triggerManager->registerCallback(8090, 1, [this](QByteArray& byteArray) {sumRequest2(byteArray); }, "25D-2结果获取触发");
|
||||
#pragma endregion
|
||||
#pragma region 处理算法回调链
|
||||
algo_25D = std::make_shared<detCallbackChain<handleAIModels>>(_serviceManager->_imgSaveThreadManager, &_handleAIModels);
|
||||
algo_25D = std::make_shared<detCallbackChain<handleAIModels, M952_15_Q_summaryData>>(_serviceManager, &_handleAIModels);
|
||||
algo_25D->registerProcessAlgoCallback(_952_15_Q_25D_ALGO);
|
||||
algo_25D->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
|
||||
qianduan12ResultHandle(data);
|
||||
}));
|
||||
algo_25D->registerResultHandleCallback(std::bind(&M952_15_Q::qianduan12ResultHandle, this, _1, _2));
|
||||
#pragma endregion
|
||||
|
||||
_handleAIModels.SEG_25D = _serviceManagerIN->_handleAiModelManager->getSegModel("SEG_25D");
|
||||
@@ -175,7 +173,7 @@ public:
|
||||
qianduan2SecondTime = !qianduan2SecondTime;
|
||||
}
|
||||
|
||||
void qianduan12ResultHandle(std::shared_ptr <detData>data){
|
||||
void qianduan12ResultHandle(std::shared_ptr <detData>data, M952_15_Q_summaryData resultData) {
|
||||
//发送图片
|
||||
if (data->resultImgs.size() > 0){
|
||||
for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){
|
||||
@@ -187,43 +185,35 @@ public:
|
||||
}
|
||||
}
|
||||
//结果数据保存
|
||||
if (data->resultData.size() > 0){
|
||||
std::string sn = data->SNcode;
|
||||
try {
|
||||
M952_15_Q_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-Q-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());
|
||||
|
||||
}
|
||||
std::string sn = data->SNcode;
|
||||
try {
|
||||
M952_15_Q_summaryData* dataPtr = _summaryData.get(sn);
|
||||
*dataPtr = resultData;
|
||||
|
||||
if (data->cameraKeyName == "2.5D-Q-1") {
|
||||
emit bridge->summaryData_addData("前段1-左上留白", resultData.LT_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段1-右上留白", resultData.RT_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段1-左下留白", resultData.LD_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段1-右下留白", resultData.RD_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段1-左对齐度", resultData.L_Duiqidu.toDouble());
|
||||
emit bridge->summaryData_addData("前段1-右对齐度", 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);
|
||||
else{
|
||||
emit bridge->summaryData_addData("前段2-左上留白", resultData.LT_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段2-右上留白", resultData.RT_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段2-左下留白", resultData.LD_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段2-右下留白", resultData.RD_Distance.toDouble());
|
||||
emit bridge->summaryData_addData("前段2-左对齐度", resultData.L_Duiqidu.toDouble());
|
||||
emit bridge->summaryData_addData("前段2-右对齐度", resultData.R_Duiqidu.toDouble());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
catch (...) {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("前段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
|
||||
}
|
||||
|
||||
std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ static bool _952_15_Q_2D_P_ALGO_ZangWuAI(cv::Mat& img, handleAIModels* _handleAi
|
||||
return isNg;
|
||||
}
|
||||
|
||||
static bool _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
|
||||
static _952_15_Q_2D3D_1_summaryData _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, handleAIModels* _handleAiModelManager) {
|
||||
//获取模型
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
|
||||
@@ -103,7 +103,7 @@ static bool _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, handleAIModels*
|
||||
if (data->oriImgs.size() != 3)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
return _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
|
||||
cv::Mat Paint;
|
||||
@@ -128,9 +128,38 @@ static bool _952_15_Q_2D_P_ALGO(std::shared_ptr <detData> data, handleAIModels*
|
||||
}
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->aiDetOK = huaShangResult || zangWuResult; // 如果任一检测结果为NG,则整体结果为NG
|
||||
return true;
|
||||
return _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
static _952_15_Q_2D3D_1_summaryData _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 _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
cv::Mat Paint;
|
||||
cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR);
|
||||
putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
|
||||
data->resultImgs.push_back(Paint);
|
||||
return _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
static _952_15_Q_2D3D_1_summaryData _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 _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
cv::Mat Paint;
|
||||
cv::cvtColor(data->oriImgs[2], Paint, cv::COLOR_GRAY2BGR);
|
||||
putTextZH(Paint, "OK", cv::Point(100, 100), 150, cv::Scalar(0, 255, 0));
|
||||
data->resultImgs.push_back(Paint);
|
||||
return _952_15_Q_2D3D_1_summaryData();
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
class _952_15_Q_2D3D_1 : public mission {
|
||||
@@ -158,7 +187,9 @@ public:
|
||||
int summary_triggerPos;
|
||||
#pragma endregion
|
||||
handleAIModels _handleAIModels;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels>> algo_2D_P;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>> algo_2D_P;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>> algo_2D_N;
|
||||
std::shared_ptr< detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>> algo_3D;
|
||||
summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData;
|
||||
bool init(ServiceManager* _serviceManagerIN,
|
||||
nlohmann::json& _missionJson,
|
||||
@@ -194,9 +225,21 @@ public:
|
||||
_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 = std::make_shared<detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>>(_serviceManager, &_handleAIModels);
|
||||
algo_2D_P->registerProcessAlgoCallback(_952_15_Q_2D_P_ALGO);
|
||||
algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr <detData>data) {
|
||||
algo_2D_P->registerResultHandleCallback(([this](std::shared_ptr <detData>data, _952_15_Q_2D3D_1_summaryData sumdata) {
|
||||
Qian_2D_P_ResultHandle(data);
|
||||
}));
|
||||
|
||||
algo_2D_N = std::make_shared<detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>>(_serviceManager, &_handleAIModels);
|
||||
algo_2D_N->registerProcessAlgoCallback(_952_15_Q_2D_N_ALGO);
|
||||
algo_2D_N->registerResultHandleCallback(([this](std::shared_ptr <detData>data, _952_15_Q_2D3D_1_summaryData sumdata) {
|
||||
Qian_2D_P_ResultHandle(data);
|
||||
}));
|
||||
|
||||
algo_3D = std::make_shared<detCallbackChain<handleAIModels, _952_15_Q_2D3D_1_summaryData>>(_serviceManager, &_handleAIModels);
|
||||
algo_3D->registerProcessAlgoCallback(_952_15_Q_3D_ALGO);
|
||||
algo_3D->registerResultHandleCallback(([this](std::shared_ptr <detData>data, _952_15_Q_2D3D_1_summaryData sumdata) {
|
||||
Qian_2D_P_ResultHandle(data);
|
||||
}));
|
||||
#pragma endregion
|
||||
@@ -271,43 +314,40 @@ public:
|
||||
}
|
||||
}
|
||||
//结果数据保存
|
||||
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());
|
||||
//
|
||||
// }
|
||||
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);
|
||||
catch (...) {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
|
||||
}
|
||||
|
||||
std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl;
|
||||
}
|
||||
//8020 1
|
||||
@@ -320,6 +360,7 @@ public:
|
||||
_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), "结果图"));
|
||||
@@ -336,6 +377,7 @@ public:
|
||||
_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), "结果图"));
|
||||
@@ -355,43 +397,41 @@ public:
|
||||
}
|
||||
}
|
||||
//结果数据保存
|
||||
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());
|
||||
//
|
||||
// }
|
||||
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);
|
||||
}
|
||||
catch (...) {
|
||||
qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode);
|
||||
}
|
||||
|
||||
|
||||
std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
BIN
Binary file not shown.
@@ -69,9 +69,9 @@ bool Hd_VirualCamera::run()//
|
||||
n_mutex->lock();
|
||||
if (cameraName == "25D-1" || cameraName == "25D-2") {
|
||||
vector<cv::Mat> mats;
|
||||
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count0.bmp", -1));
|
||||
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count1.bmp", -1));
|
||||
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count2.bmp", -1));
|
||||
mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count0.bmp", -1));
|
||||
mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count1.bmp", -1));
|
||||
mats.push_back(cv::imread("E:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count2.bmp", -1));
|
||||
queuePic.enqueue(mats);
|
||||
}
|
||||
n_mutex->unlock();
|
||||
|
||||
Reference in New Issue
Block a user