稳定版本 备份

This commit is contained in:
2025-07-16 16:43:20 +08:00
parent 0279c11f32
commit c971fe971e
20 changed files with 542 additions and 331 deletions
View File
+4 -3
View File
@@ -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
-1
View File
@@ -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 存图相关
+34 -26
View File
@@ -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 = "";
};
+3
View File
@@ -36,6 +36,9 @@ void handleAiModelManager::handleAiModelManager::run()
init = true;
status = InitOK;
}
else {
status = InitOK;
}
+1 -1
View File
@@ -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:
+34 -26
View File
@@ -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
+5 -5
View File
@@ -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;
};
BIN
View File
Binary file not shown.
+160 -6
View File
@@ -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);
+4 -4
View File
@@ -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
+1
View File
@@ -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;//软件标题
+1 -1
View File
@@ -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;
+105 -113
View File
@@ -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";
}
+32 -42
View File
@@ -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;
}
+113 -73
View File
@@ -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
View File
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();