From 59b0afb7b9bedb7e88d1797998971372c2a87e29 Mon Sep 17 00:00:00 2001 From: QuShuailong Date: Sun, 24 Sep 2023 00:07:52 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E9=9B=86=E6=88=90=E7=A9=BA=E8=B4=A7?= =?UTF-8?q?=E4=BD=8D=E6=A3=80=E6=B5=8B=E3=80=822=E3=80=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=BB=BA=E7=AB=8B=E6=95=B0=E9=87=8F=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=823=E3=80=81=E5=B0=86?= =?UTF-8?q?=E4=B8=BB=E7=A8=8B=E5=BA=8F=E9=87=8C=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=94=BE=E5=85=A5=E7=9B=B8=E6=9C=BA=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=B1=BBCameraControl=E4=B8=AD=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=B0=86CameraControl=E4=BB=A5=E5=8D=95=E4=BE=8B=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E3=80=824=E3=80=81=E6=94=AF=E6=8C=81=E7=9B=B8?= =?UTF-8?q?=E6=9C=BA=E7=9A=84=E5=9B=BE=E5=83=8F=E4=BB=A590=E5=BA=A6?= =?UTF-8?q?=E7=9A=84=E5=80=8D=E6=95=B0=E6=97=8B=E8=BD=AC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- runner17/Release/config/camera.json | 6 + runner17/Release/config/comSetting.json | 24 + runner17/Release/config/netSetting.json | 3 +- runner17/Release/config/serialSetting.json | 18 - src/ADModule.h | 1 - src/CameraControl.cpp | 290 ++++++++- src/CameraControl.h | 41 +- src/CategoryMatcher.h | 1 - src/CodeScanStation.cpp | 133 +++++ src/CodeScanStation.h | 40 ++ src/NetControl.cpp | 6 +- src/NetControl.h | 1 + src/QNumTemplateBuild.cpp | 50 ++ src/QNumTemplateBuild.h | 33 ++ src/SmokeBoxIdentification.cpp | 555 ++++++++++-------- src/SmokeBoxIdentification.h | 119 ++-- src/common/commonDefine.h | 43 +- src/lpSerialStation.cpp | 212 +++++-- src/lpSerialStation.h | 43 +- src/numStatisticAlgo/dataPreProcessing.cpp | 388 ++++++------ src/numStatisticAlgo/dataPreprocessing.h | 18 +- .../QNumTemplateBuild.ui | 183 ++++++ .../SmokeBoxIdentification.ui | 6 + .../SmokeBoxIdentification.vcxproj | 11 + .../SmokeBoxIdentification.vcxproj.filters | 15 + .../SmokeBoxIdentification.vcxproj.user | 8 +- 26 files changed, 1653 insertions(+), 595 deletions(-) create mode 100644 runner17/Release/config/comSetting.json delete mode 100644 runner17/Release/config/serialSetting.json create mode 100644 src/CodeScanStation.cpp create mode 100644 src/CodeScanStation.h create mode 100644 src/QNumTemplateBuild.cpp create mode 100644 src/QNumTemplateBuild.h create mode 100644 tpvs17/SmokeBoxIdentification/QNumTemplateBuild.ui diff --git a/runner17/Release/config/camera.json b/runner17/Release/config/camera.json index 00fffa6..222db71 100644 --- a/runner17/Release/config/camera.json +++ b/runner17/Release/config/camera.json @@ -25,6 +25,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 90, "save": 0, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, @@ -59,6 +60,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 0, "save": 1, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, @@ -93,6 +95,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 0, "save": 1, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, @@ -127,6 +130,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 0, "save": 1, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, @@ -161,6 +165,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 0, "save": 1, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, @@ -195,6 +200,7 @@ "offset_y": 0, "param_policy": 2, "rely_on_camera": "", + "rotation_angle": 270, "save": 0, "save_img_suffix": ".JPG", "savefile_rgb_swapped": false, diff --git a/runner17/Release/config/comSetting.json b/runner17/Release/config/comSetting.json new file mode 100644 index 0000000..9d5eeaa --- /dev/null +++ b/runner17/Release/config/comSetting.json @@ -0,0 +1,24 @@ +{ + "leaper": [ + { + "baud": 115200, + "port_name": "COM1", + "device_name": "SinglechipCom", + "auto_connect": true + } + ], + "customer": [ + { + "baud": 9600, + "port_name": "COM8", + "device_name": "CodeScan_Left", + "auto_connect": true + }, + { + "baud": 9600, + "port_name": "COM7", + "device_name": "CodeScan_Right", + "auto_connect": true + } + ] +} diff --git a/runner17/Release/config/netSetting.json b/runner17/Release/config/netSetting.json index d42ca9c..d3460ba 100644 --- a/runner17/Release/config/netSetting.json +++ b/runner17/Release/config/netSetting.json @@ -2,7 +2,8 @@ "TcpNetWork": { "Host_IP": "127.0.0.1", "Host_Port": 4000, - "Street_Name": "6" + "Street_Name": "6", + "Heart_Interval": 10 }, "UdpNetWork": { "AD_IP_Top": "20.16.1.6", diff --git a/runner17/Release/config/serialSetting.json b/runner17/Release/config/serialSetting.json deleted file mode 100644 index 01c2319..0000000 --- a/runner17/Release/config/serialSetting.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "CodeCOMLeft": { - "BAUD": 9600, - "name": "COM7" - }, - "CodeCOMRight": { - "BAUD": 9600, - "name": "COM7" - }, - "SinglechipCOM": [ - { - "baud": 115200, - "port_name": "COM1", - "device_name": "SensorsCom", - "auto_connect": true - } - ] -} diff --git a/src/ADModule.h b/src/ADModule.h index 9b61308..d5e2b36 100644 --- a/src/ADModule.h +++ b/src/ADModule.h @@ -12,7 +12,6 @@ #include #include -#include "lp_singleton.h" #include "commonDefine.h" #include "dataPreprocessing.h" const int mimumDataSize = 5; diff --git a/src/CameraControl.cpp b/src/CameraControl.cpp index 02cad00..90a69d4 100644 --- a/src/CameraControl.cpp +++ b/src/CameraControl.cpp @@ -2,13 +2,25 @@ #include "CameraControl.h" #include -CameraControl::CameraControl(QObject *parent) : QObject(parent) +CameraControl::CameraControl() { qRegisterMetaType >("QVector"); + m_pobjThread = new QThread; + moveToThread(m_pobjThread); + connect(m_pobjThread, &QThread::started, this, &CameraControl::onOpen); + connect(m_pobjThread, &QThread::finished, + this, &QObject::deleteLater); + m_pobjThread->start(); } CameraControl::~CameraControl() { + if (m_pobjThread) + { + m_pobjThread->quit(); + m_pobjThread->wait(); + m_pobjThread = nullptr; + } for each (Camera* pCamera in m_vecPCamera) { DELETE_POINTER(pCamera); @@ -16,9 +28,173 @@ CameraControl::~CameraControl() m_vecPCamera.clear(); } +Q_SLOT void CameraControl::onOpen() +{ + + QString filePath = QCoreApplication::applicationDirPath() + CAMERA_CONFIG; + if (readCameraConfig(filePath)) + { + m_bCamerasInit = initCamera(); + } +} + +bool CameraControl::readCameraConfig(QString filePath) +{ + m_mapIdCameraInfoSide.clear(); + m_mapIdCameraInfoTop.clear(); + m_mapSerialNumberIdSide.clear(); + m_mapSerialNumberIdTop.clear(); + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qWarning() << "打开文件失败!"; + return false; + } + QByteArray arr = file.readAll(); + file.close(); + if (arr.isEmpty()) + { + qWarning() << "内容为空"; + return false; + } + + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(arr, &err); + if (doc.isEmpty()) + { + qWarning() << err.errorString(); //打印失败信息 + return false; + } + + QJsonObject jsonObj = doc.object(); + auto getCameraType = [](int type)-> CameraType + { + CameraType cameraType; + switch (type) + { + case 100: + cameraType = CameraType::Virtual; + break; + case 140: + cameraType = CameraType::Hik; + break; + case 190: + cameraType = CameraType::Basler; + break; + default: + break; + } + return cameraType; + }; + QJsonObject topObj = jsonObj.value("top").toObject(); + int topStartId, topEndId; + if (!topObj.isEmpty()) + { + topStartId = topObj.value("startID").toInt(); + topEndId = topObj.value("endID").toInt(); + } + else + { + qWarning() << "top id error"; + return false; + } + QJsonObject sideObj = jsonObj.value("side").toObject(); + int sideStartId, sideEndId; + if (!sideObj.isEmpty()) + { + sideStartId = sideObj.value("startID").toInt(); + sideEndId = sideObj.value("endID").toInt(); + } + else + { + qWarning() << "side id error"; + return false; + } + QJsonObject devicesObj = jsonObj.value("devices").toObject(); + if (!devicesObj.isEmpty()) { + CameraInfo cameraInfo; + QStringList devicesLabelList = devicesObj.keys(); + for each (QString deviceLabel in devicesLabelList) + { + cameraInfo.cameraLabel = deviceLabel; + QStringList strList = deviceLabel.split(' '); + if (strList.length() != 2) + { + qWarning() << "Device label: " << deviceLabel << " syntax error!"; + continue; + } + cameraInfo.modelName = strList.at(0); + cameraInfo.serialNumber = strList.at(1); + QJsonObject deviceObj = devicesObj.value(deviceLabel).toObject(); + if (!deviceObj.isEmpty()) + { + cameraInfo.cameraType = getCameraType(deviceObj.value("type").toInt()); + cameraInfo.exposure = deviceObj.value("exposure").toDouble(); + cameraInfo.imageHeight = deviceObj.value("height").toInt(); + cameraInfo.imageWidth = deviceObj.value("width").toInt(); + cameraInfo.saveImgSuffix = deviceObj.value("save_img_suffix").toString(); + if (deviceObj.contains("rotation_angle")) + { + cameraInfo.rotationAngle = deviceObj.value("rotation_angle").toInt(); + } + int id = deviceObj.value("id").toInt(); + if (id >= topStartId && id <= topEndId) + { + m_mapIdCameraInfoTop[id] = cameraInfo; + m_mapSerialNumberIdTop[cameraInfo.serialNumber] = id; + } + else if (id >= sideStartId && id <= sideEndId) + { + m_mapIdCameraInfoSide[id] = cameraInfo; + m_mapSerialNumberIdSide[cameraInfo.serialNumber] = id; + } + } + } + } + return true; +} + +bool CameraControl::initCamera() +{ + QList cameraInfoList = m_mapIdCameraInfoSide.values(); + cameraInfoList.append(m_mapIdCameraInfoTop.values()); + if (!loadCamera(cameraInfoList)) + { + qWarning() << "Load camera failed"; + return false; + } + else { + QStringList serialNumberList = m_mapSerialNumberIdSide.keys(); + serialNumberList.append(m_mapSerialNumberIdTop.keys()); + if (!openCamera(serialNumberList)) + { + qWarning() << "Open camera failed"; + return false; + } + else { + if (!startCamera(serialNumberList)) + { + qWarning() << "Start camera failed"; + return false; + } + else { + if (!setSoftwareTrigger(serialNumberList)) + { + qWarning() << "Set software trigger failed"; + } + } + } + } + return true; +} + bool CameraControl::loadCamera(const QList& cameraInfoList) { bool flag = true; + for each (Camera* pCamera in m_vecPCamera) + { + DELETE_POINTER(pCamera); + } m_vecPCamera.clear(); m_mapSNIndex.clear(); for each(CameraInfo cameraInfo in cameraInfoList) @@ -130,20 +306,6 @@ bool CameraControl::setSoftwareTrigger(const QStringList& serialNumberList) return flag; } -Q_SLOT void CameraControl::onCapture(const QStringList& serialNumberList) -{ - int len = serialNumberList.length(); - qDebug() << "start capture, length: " << len; - QVector vecImageInfo(len); - for (int i = 0; i < len; ++i) - { - QString serialNumber = serialNumberList.at(i); - vecImageInfo[i].image = capture(serialNumber); - vecImageInfo[i].cameraSn = serialNumber; - } - emit sgCapturedImage(vecImageInfo); -} - bool CameraControl::openCamera(const QString& serialNumber) { QMap::iterator iter = m_mapSNIndex.find(serialNumber); @@ -221,3 +383,101 @@ cv::Mat CameraControl::capture(const QString& serialNumber) } return imgMat; } + +bool CameraControl::getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo) +{ + QString imgSaveBaseName; + auto iter = m_mapSerialNumberIdSide.find(serialNumber); + if (iter == m_mapSerialNumberIdSide.end()) + { + iter = m_mapSerialNumberIdTop.find(serialNumber); + if (iter != m_mapSerialNumberIdTop.end()) + { + int id = iter.value(); + QString suffix = m_mapIdCameraInfoTop.value(id).saveImgSuffix; + fileInfo.suffix = suffix; + fileInfo.strId = QString::number(id); + fileInfo.name = fileInfo.strId + suffix; + } + else + { + qWarning() << "Can not find " << serialNumber; + return false; + } + } + else + { + int id = iter.value(); + QString suffix = m_mapIdCameraInfoSide.value(id).saveImgSuffix; + fileInfo.suffix = suffix; + fileInfo.strId = QString::number(id); + fileInfo.name = fileInfo.strId + suffix; + } + return true; +} + +Q_SLOT void CameraControl::onCapture(int cameraLocation) +{ + QStringList serialNumList; + switch (cameraLocation) + { + case eCameraLocation::emTop: + m_eCameraLocation = emTop; + serialNumList = m_mapSerialNumberIdTop.keys(); + break; + case eCameraLocation::emSide: + m_eCameraLocation = emSide; + serialNumList = m_mapSerialNumberIdSide.keys(); + break; + default: + break; + } + capture(serialNumList); +} + +void CameraControl::capture(const QStringList& serialNumberList) +{ + int len = serialNumberList.length(); + qDebug() << "start capture, length: " << len; + QVector vecImageInfo(len); + for (int i = 0; i < len; ++i) + { + QString serialNumber = serialNumberList.at(i); + getSaveImgNameInfo(serialNumber, vecImageInfo[i].saveImgInfo); + int id = vecImageInfo.at(i).saveImgInfo.strId.toInt(); + int rotationAngle; + if (m_mapIdCameraInfoTop.contains(id)) + { + rotationAngle = m_mapIdCameraInfoTop.value(id).rotationAngle; + } + else if (m_mapIdCameraInfoSide.contains(id)) + { + rotationAngle = m_mapIdCameraInfoSide.value(id).rotationAngle; + } + flipImg(capture(serialNumber), vecImageInfo[i].image, rotationAngle); + //vecImageInfo[i].image = capture(serialNumber); + vecImageInfo[i].cameraSn = serialNumber; + } + emit sgCapturedImage(vecImageInfo, m_eCameraLocation); +} + +void CameraControl::flipImg(const cv::Mat& imgSrc, cv::Mat& imgDst, int rotationAngle) +{ + switch (rotationAngle) + { + case 90: + cv::transpose(imgSrc, imgDst); + cv::flip(imgDst, imgDst, 1); + break; + case 180: + cv::flip(imgSrc, imgDst, 0); + break; + case 270: + cv::transpose(imgSrc, imgDst); + cv::flip(imgDst, imgDst, 0); + break; + default: + imgDst = imgSrc; + break; + } +} diff --git a/src/CameraControl.h b/src/CameraControl.h index b6123b1..9d32fbc 100644 --- a/src/CameraControl.h +++ b/src/CameraControl.h @@ -3,6 +3,8 @@ #include #include "HikCamera.h" +#include "commonDefine.h" + struct CameraInfo { CameraType cameraType; //相机类型 @@ -13,42 +15,71 @@ struct CameraInfo double exposure; //曝光时间 int imageWidth; //宽度 int imageHeight; //高度 + int rotationAngle{ 0 }; //旋轉角度 QString saveImgSuffix = ".bmp" ; //保存的图像格式 }; + +struct FileInfo +{ + QString strId; + QString suffix; + QString name; +}; + struct ImageInfo { cv::Mat image; QString cameraSn; + FileInfo saveImgInfo; }; -class CameraControl : public QObject + +class CameraControl : public QObject, public lp_singleton { Q_OBJECT public: - explicit CameraControl(QObject *parent = nullptr); + explicit CameraControl(); ~CameraControl(); //static void EnumCameras(QList& cameraInfoList); + bool readCameraConfig(QString filePath); + bool initCamera(); bool loadCamera(const QList& cameraInfoList); bool openCamera(const QStringList& serialNumberList); bool closeCamera(const QStringList& serialNumberList); bool startCamera(const QStringList& serialNumberList); bool stopCamera(const QStringList& serialNumberList); bool setSoftwareTrigger(const QStringList& serialNumberList); - Q_SLOT void onCapture(const QStringList& serialNumberList); bool openCamera(const QString& serialNumber); bool closeCamera(const QString& serialNumber); bool startCamera(const QString& serialNumber); bool stopCamera(const QString& serialNumber); bool setSoftwareTrigger(const QString& serialNumber); - cv::Mat capture(const QString& serialNumber); + + + Q_SLOT void onCapture(int cameraLocation); signals: - void sgCapturedImage(const QVector& vecImageInfo); + void sgCapturedImage(const QVector& vecImageInfo, int cameraLocation); private: + Q_SLOT void onOpen(); + + bool getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo); + void capture(const QStringList& serialNumberList); + cv::Mat capture(const QString& serialNumber); + void flipImg(const cv::Mat& imgSrc, cv::Mat& imgDst, int rotationAngle); + + QMap m_mapIdCameraInfoTop; + QMap m_mapIdCameraInfoSide; + QMap m_mapSerialNumberIdTop; + QMap m_mapSerialNumberIdSide; QVector m_vecPCamera; QMap m_mapSNIndex; + bool m_bCamerasInit{ false }; + eCameraLocation m_eCameraLocation; + + QThread* m_pobjThread; QMutex m_mutex; }; #endif // !CAMERA_CONTROL_H diff --git a/src/CategoryMatcher.h b/src/CategoryMatcher.h index 94cddb0..f93b9ef 100644 --- a/src/CategoryMatcher.h +++ b/src/CategoryMatcher.h @@ -1,7 +1,6 @@ #ifndef CATEGORY_MATCHER_H #define CATEGORY_MATCHER_H -#include #include #include #include diff --git a/src/CodeScanStation.cpp b/src/CodeScanStation.cpp new file mode 100644 index 0000000..39e42f1 --- /dev/null +++ b/src/CodeScanStation.cpp @@ -0,0 +1,133 @@ +#include "CodeScanStation.h" +#include "QZkJsonParser.h" + +CodeScanStation::CodeScanStation() +{ + m_pobjThread = new QThread; + moveToThread(m_pobjThread); + + connect(m_pobjThread, &QThread::started, this, &CodeScanStation::onOpen); + connect(m_pobjThread, &QThread::finished, + this, &QObject::deleteLater); + m_bStartEmptyCheck = false; +} + +CodeScanStation::~CodeScanStation() +{ + closeComs(); + if (m_pobjThread) + { + m_pobjThread->quit(); + m_pobjThread->wait(); + m_pobjThread = nullptr; + } +} + +bool CodeScanStation::loadParameters(const QString& filePath) +{ + int error; + QJsonObject objJson = QZkJsonParser::ReadJsonObject(filePath, &error); + if (!objJson.empty()) + { + QJsonArray jArray = objJson["customer"].toArray(); + for (int i = 0; i < jArray.size(); ++i) + { + QJsonObject COMObj = jArray[i].toObject(); + SerialParam sp; + sp.port_name_ = COMObj["port_name"].toString(); + sp.baud_ = COMObj["BAUD"].toInt(); + sp.auto_connect_ = COMObj["auto_connect"].toBool(); + sp.modbus_type_ = SERIAL_CUSTOM; + QString deviceName = COMObj["device_name"].toString(); + if (deviceName == CODESCAN_COM_LEFT) + { + m_ComSensorIDMap.insert(sp.port_name_, em_LEFT); + m_DeviceParaMap.insert(em_LEFT, sp); + } + else if (deviceName == CODESCAN_COM_RIGHT) + { + m_ComSensorIDMap.insert(sp.port_name_, em_RIGHT); + m_DeviceParaMap.insert(em_RIGHT, sp); + } + } + } + else + { + qDebug() << "please check the comSetting file, err: " << error; + return false; + } + qDebug() << "Code scan load param successed"; + return true; +} + +void CodeScanStation::openComs() +{ + m_pobjThread->start(); +} + +void CodeScanStation::closeComs() +{ + for (auto iter = m_DeviceParaMap.begin(); iter != m_DeviceParaMap.end(); iter++) + { + lp_serial_manager::instance()->close(iter.value().port_name_); + } +} + +Q_SLOT void CodeScanStation::onOpen() +{ + for (auto iter = m_DeviceParaMap.begin(); iter != m_DeviceParaMap.end(); iter++) + { + if (lp_serial_manager::instance()->open(iter.value()) == -1) + { + qDebug() << "open " << iter.value().port_name_ << " fail."; + continue; + } + } + + connect(lp_serial_manager::instance(), SIGNAL(signal_data_recv(const QString&, QSharedPointer)), + this, SLOT(onSerialDataRecv(const QString&, QSharedPointer))); + //connect(lp_serial_manager::instance(), SIGNAL(signal_state_changed(const QString&, SerialErrorType)), + // this, SLOT(onStateChanged(const QString&, SerialErrorType)));//串口打开状态 +} + +Q_SLOT void CodeScanStation::onSerialDataRecv(const QString& sn, QSharedPointer data_ptr_) +{ + qDebug() << "code scan com receive data"; + if (m_ComSensorIDMap.contains(sn)) + { + emit sgNewCodeScanData((int)m_ComSensorIDMap.value(sn), data_ptr_); + } +} + +//Q_SLOT void CodeScanStation::onStateChanged(const QString& sn, SerialErrorType err) +//{ +// /* +// 显示串口状态 +// */ +// QString strMsg; +// if (err == OpenSuccess) +// { +// strMsg = QString("%1 open success!").arg(sn); +// qDebug() << strMsg; +// } +// else if (err == DeviceNotFoundError) +// { +// strMsg = QString("%1 not found! open failed.").arg(sn); +// qDebug() << strMsg; +// } +// else if (err == OpenError) +// { +// strMsg = QString("%1 open failed.").arg(sn); +// qDebug() << strMsg; +// } +// else if (err == CloseSuccess) +// { +// strMsg = QString("%1 close success.").arg(sn); +// qDebug() << strMsg; +// } +// else if (err == CloseError) +// { +// strMsg = QString("%1 Not found! close failed.").arg(sn); +// qDebug() << strMsg; +// } +//} \ No newline at end of file diff --git a/src/CodeScanStation.h b/src/CodeScanStation.h new file mode 100644 index 0000000..91bddc6 --- /dev/null +++ b/src/CodeScanStation.h @@ -0,0 +1,40 @@ +#ifndef CODE_SCAN_STATION_H +#define CODE_SCAN_STATION_H + +#include "lp_serial_manager.h" +#include "commonDefine.h" + +#define CODESCAN_COM_LEFT "CodeScan_Left" +#define CODESCAN_COM_RIGHT "CodeScan_Right" + +class CodeScanStation : public QObject, public lp_singleton +{ + Q_OBJECT + +public: + CodeScanStation(); + ~CodeScanStation(); + + bool loadParameters(const QString& filePath); + void openComs(); + void closeComs(); + +signals: + void sgNewCodeScanData(int, QSharedPointer); + +private: + Q_SLOT void onOpen(); + Q_SLOT void onSerialDataRecv(const QString& sn, QSharedPointer data_ptr_); + //Q_SLOT void onStateChanged(const QString&, SerialErrorType); +private: + bool m_bStartEmptyCheck; + + QThread* m_pobjThread; + QMap m_DeviceParaMap; + QMap m_ComSensorIDMap; +}; +#endif // !CODE_SCAN_STATION_H + + + + diff --git a/src/NetControl.cpp b/src/NetControl.cpp index 9a86f29..d0d4aff 100644 --- a/src/NetControl.cpp +++ b/src/NetControl.cpp @@ -65,6 +65,10 @@ bool NetControl::initIpAddress(const QString& path) m_szHostIp = TcpNetObj.value("Host_IP").toString(); m_port = TcpNetObj.value("Host_Port").toInt(); m_streetName = TcpNetObj.value("Street_Name").toString(); + if (TcpNetObj.contains("Heart_Interval")) + { + m_heartInterval = TcpNetObj.value("Heart_Interval").toInt(); + } } return true; } @@ -123,7 +127,7 @@ void NetControl::onConnected() { m_pTimerHeartbeat = new QTimer(this); } - m_pTimerHeartbeat->start(10 * 1000); + m_pTimerHeartbeat->start(m_heartInterval * 1000); qDebug() << "网络连接成功!!!"; } diff --git a/src/NetControl.h b/src/NetControl.h index 113a9f8..fea49ec 100644 --- a/src/NetControl.h +++ b/src/NetControl.h @@ -45,6 +45,7 @@ private: QString m_streetName; bool m_bAutoReconnect; QString m_configPath; + int m_heartInterval{ 5 }; QTimer* m_pTimerHeartbeat; signals: diff --git a/src/QNumTemplateBuild.cpp b/src/QNumTemplateBuild.cpp new file mode 100644 index 0000000..42d659d --- /dev/null +++ b/src/QNumTemplateBuild.cpp @@ -0,0 +1,50 @@ +#pragma execution_character_set("utf-8") +#include "QNumTemplateBuild.h" + +QNumTemplateBuild::QNumTemplateBuild(QWidget *parent) + : QWidget(parent) +{ + ui.setupUi(this); + connect(ui.pushButton_generate, SIGNAL(clicked()), this, SLOT(onButtonClick())); + //connect(ui.comboBox_modelNum, SIGNAL(currentIndexChanged(const QString& modelName)), + // this, SLOT(onComboxCurrentIndexChanged(const QString& modelName))); + ui.lineEdit_winSize->setText("200"); + ui.lineEdit_startRow->setText("30"); +} + +Q_SLOT void QNumTemplateBuild::onButtonClick() +{ + QString strObj = sender()->objectName(); + if (strObj == "pushButton_generate") + { + int modelIndex = ui.comboBox_modelNum->currentIndex() + 1; + QString typeChnName = ui.lineEdit_chineseName->text(); + double length = ui.lineEdit_length->text().toDouble(); + double width = ui.lineEdit_width->text().toDouble(); + double height = ui.lineEdit_height->text().toDouble(); + QString localModelName = QString("%1_").arg(modelIndex); + QString localModelPath = QCoreApplication::applicationDirPath() + QString("%1\\%2").arg(LOCAL_MODEL_PATH).arg(localModelName); + QString tarTemplateName = QString("%1_%2").arg(modelIndex).arg(typeChnName); + QString targetTypePath = QCoreApplication::applicationDirPath() + QString("%1\\%2").arg(NUM_TEMPLATE_PATH).arg(tarTemplateName); + if (m_pDataProcess->loadLocalSampleForCreatingSamples(localModelPath, tarTemplateName, + length, width, height)) + { + int winSize = ui.lineEdit_winSize->text().toInt(); + int startRow = ui.lineEdit_startRow->text().toInt(); + if (m_pDataProcess->markSample(targetTypePath, startRow, winSize)) + { + m_pDataProcess->addFileDir(targetTypePath); + } + QMessageBox::about(this, "提示信息", "生成模板成功"); + } + else + { + QMessageBox::critical(this, "提示信息", "生成模板失败"); + } + } +} + +//Q_SLOT void QNumTemplateBuild::onComboxCurrentIndexChanged(const QString& modelName) +//{ +// +//} \ No newline at end of file diff --git a/src/QNumTemplateBuild.h b/src/QNumTemplateBuild.h new file mode 100644 index 0000000..e884059 --- /dev/null +++ b/src/QNumTemplateBuild.h @@ -0,0 +1,33 @@ +#ifndef NUM_TEMPLATE_BUILD_H +#define NUM_TEMPLATE_BUILD_H + +#include +#include + +#include + +#include "dataPreprocessing.h" +#include "commonDefine.h" + +#include "ui_QNumTemplateBuild.h" +class QNumTemplateBuild : public QWidget +{ + Q_OBJECT +public: + QNumTemplateBuild(QWidget *parent = Q_NULLPTR); + //~QNumTemplateBuild(); + void setDataProcessObj(std::shared_ptr dp_ptr) + { + m_pDataProcess = dp_ptr; + } + +//signals: + +private: + Q_SLOT void onButtonClick(); + //Q_SLOT void onComboxCurrentIndexChanged(const QString& modelName); + std::shared_ptr m_pDataProcess; + + Ui::QNumTemplateBuildClass ui; +}; +#endif // !NUM_TEMPLATE_BUILD_H diff --git a/src/SmokeBoxIdentification.cpp b/src/SmokeBoxIdentification.cpp index b88e974..727b80c 100644 --- a/src/SmokeBoxIdentification.cpp +++ b/src/SmokeBoxIdentification.cpp @@ -5,32 +5,37 @@ SmokeBoxIdentification::SmokeBoxIdentification(QWidget *parent) : QMainWindow(parent) { qRegisterMetaType >("QVector"); + qRegisterMetaType >("QMap"); + qRegisterMetaType("lightCtrl"); ui.setupUi(this); + this->setWindowTitle(tr("烟箱检测系统")); //m_pShowRltImgLabel = ui.label_showImg; - m_pCameraControl = new CameraControl(); - m_pCaptureThread = new QThread(); - m_pCameraControl->moveToThread(m_pCaptureThread); - - connect(this, &SmokeBoxIdentification::sgCapture, m_pCameraControl, &CameraControl::onCapture); - connect(m_pCameraControl, &CameraControl::sgCapturedImage, this, &SmokeBoxIdentification::onCapturedImage); - connect(m_pCaptureThread, &QThread::finished, m_pCameraControl, &QObject::deleteLater); - m_pCaptureThread->start(); + //m_pCameraControl = new CameraControl(); + //m_pCaptureThread = new QThread(); + //m_pCameraControl->moveToThread(m_pCaptureThread); + + connect(this, &SmokeBoxIdentification::sgCapture, CameraControl::instance(), &CameraControl::onCapture); + connect(CameraControl::instance(), &CameraControl::sgCapturedImage, this, &SmokeBoxIdentification::onCapturedImage); + //connect(m_pCaptureThread, &QThread::finished, m_pCameraControl, &QObject::deleteLater); + //m_pCaptureThread->start(); QString applicationDirPath = QCoreApplication::applicationDirPath(); QtConcurrent::run([=]() { - readCameraConfig(); - m_bCamerasInit = initCamera(); + //readCameraConfig(); + //m_bCamerasInit = initCamera(); if (decodeSmokeInfoCsv(applicationDirPath + SMOKEINFO_XLSX_CONFIG)) matchSmokeNameAndTemplateFolderName(applicationDirPath + NUM_TEMPLATE_PATH); + m_pNumTemplateBuild = new QNumTemplateBuild(); m_pDataProcess = std::make_shared(); if (m_pDataProcess) { - dataPreProcessing * t = (dataPreProcessing*)m_pDataProcess.get(); + //dataPreProcessing * t = (dataPreProcessing*)m_pDataProcess.get(); m_pDataProcess->getFileDir(applicationDirPath + NUM_TEMPLATE_PATH); m_pDataProcess->transmitFilePathForSampleWithItsCorresLabel(); - ADModule::instance()->setDataProcessObj(m_pDataProcess); m_pDataProcess->setWinSize(170); + ADModule::instance()->setDataProcessObj(m_pDataProcess); + m_pNumTemplateBuild->setDataProcessObj(m_pDataProcess); } }); @@ -38,222 +43,251 @@ SmokeBoxIdentification::SmokeBoxIdentification(QWidget *parent) m_pNetControl = new NetControl(filePath, true); connect(m_pNetControl, &NetControl::sgReceiveData, this, &SmokeBoxIdentification::onDecodeMsg); ADModule::instance()->loadParameters(filePath); - filePath = applicationDirPath + SERIAL_CONFIG; + filePath = applicationDirPath + COM_CONFIG; lpSerialStation::instance()->loadParameters(filePath); + CodeScanStation::instance()->loadParameters(filePath); lpSerialStation::instance()->openComs(); + CodeScanStation::instance()->openComs(); m_pCategoryMatcher = new CategoryMatcher(); + connect(CodeScanStation::instance(), &CodeScanStation::sgNewCodeScanData, lpSerialStation::instance() + , &lpSerialStation::onNewCodeScanResults); connect(this, &SmokeBoxIdentification::sgCategoryMatchFinished, this, &SmokeBoxIdentification::onNumStatistic); connect(lpSerialStation::instance(), &lpSerialStation::sgMonitorSensorTriggerStart, this , &SmokeBoxIdentification::onMonitorSensorTriggerStart); connect(lpSerialStation::instance(), &lpSerialStation::sgMonitorSensorTriggerStop, this , &SmokeBoxIdentification::onMonitorSensorTriggerStop); + connect(lpSerialStation::instance(), &lpSerialStation::sgNewEmptyCheckResults, this + , &SmokeBoxIdentification::onSendEmptyCheckResults); + connect(this, &SmokeBoxIdentification::sgControlSideLight, lpSerialStation::instance() + , &lpSerialStation::onControlSideLight); + connect(this, &SmokeBoxIdentification::sgStartEmptyPlaceCheck, lpSerialStation::instance() + , &lpSerialStation::onStartEmptyPlaceCheck); + connect(this, &SmokeBoxIdentification::sgStopEmptyPlaceCheck, lpSerialStation::instance() + , &lpSerialStation::onStopEmptyPlaceCheck); connect(this, &SmokeBoxIdentification::sgMonitorSensorTriggerStart, ADModule::instance() , &ADModule::onDataRequestStart); connect(this, &SmokeBoxIdentification::sgMonitorSensorTriggerStop, ADModule::instance() , &ADModule::onDataRequestStop); connect(this, &SmokeBoxIdentification::sgSendData2AndAlgo, ADModule::instance(), &ADModule::onSendData2Algo); connect(this, &SmokeBoxIdentification::sgSaveSensorData2Local, ADModule::instance(), &ADModule::onSaveData2File); - connect(this, &SmokeBoxIdentification::sgSendStockCheckMsg, this, &SmokeBoxIdentification::onSendStockCheckMsg, Qt::QueuedConnection); + connect(this, &SmokeBoxIdentification::sgSendStockCheckMsg, this, &SmokeBoxIdentification::onSendStockCheckResults, Qt::QueuedConnection); + connect(ui.action_templateNum, SIGNAL(triggered()), this, SLOT(onActionClicked())); + emit sgControlSideLight(lightCtrl::emTurnOnLight); } SmokeBoxIdentification::~SmokeBoxIdentification() { + emit sgControlSideLight(lightCtrl::emTurnOffLight); DELETE_POINTER(m_pNetControl); - m_pCaptureThread->quit(); - m_pCaptureThread->wait(); - DELETE_POINTER(m_pCaptureThread); - DELETE_POINTER(m_pCameraControl); + //m_pCaptureThread->quit(); + //m_pCaptureThread->wait(); + //DELETE_POINTER(m_pCaptureThread); + //DELETE_POINTER(m_pCameraControl); DELETE_POINTER(m_pCategoryMatcher); } -bool SmokeBoxIdentification::readCameraConfig() -{ - m_mapIdCameraInfoSide.clear(); - m_mapIdCameraInfoTop.clear(); - m_mapSerialNumberIdSide.clear(); - m_mapSerialNumberIdTop.clear(); - QString filePath = QCoreApplication::applicationDirPath() + CAMERA_CONFIG; - QFile file(filePath); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - qWarning() << "打开文件失败!"; - return false; - } - QByteArray arr = file.readAll(); - file.close(); - if (arr.isEmpty()) - { - qWarning() << "内容为空"; - return false; - } +//bool SmokeBoxIdentification::readCameraConfig() +//{ +// m_mapIdCameraInfoSide.clear(); +// m_mapIdCameraInfoTop.clear(); +// m_mapSerialNumberIdSide.clear(); +// m_mapSerialNumberIdTop.clear(); +// QString filePath = QCoreApplication::applicationDirPath() + CAMERA_CONFIG; +// QFile file(filePath); +// if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) +// { +// qWarning() << "打开文件失败!"; +// return false; +// } +// QByteArray arr = file.readAll(); +// file.close(); +// if (arr.isEmpty()) +// { +// qWarning() << "内容为空"; +// return false; +// } +// +// QJsonParseError err; +// QJsonDocument doc = QJsonDocument::fromJson(arr, &err); +// if (doc.isEmpty()) +// { +// qWarning() << err.errorString(); //打印失败信息 +// return false; +// } +// +// QJsonObject jsonObj = doc.object(); +// auto getCameraType = [](int type)-> CameraType +// { +// CameraType cameraType; +// switch (type) +// { +// case 100: +// cameraType = CameraType::Virtual; +// break; +// case 140: +// cameraType = CameraType::Hik; +// break; +// case 190: +// cameraType = CameraType::Basler; +// break; +// default: +// break; +// } +// return cameraType; +// }; +// QJsonObject topObj = jsonObj.value("top").toObject(); +// int topStartId, topEndId; +// if (!topObj.isEmpty()) +// { +// topStartId = topObj.value("startID").toInt(); +// topEndId = topObj.value("endID").toInt(); +// } +// else +// { +// qWarning() << "top id error"; +// return false; +// } +// QJsonObject sideObj = jsonObj.value("side").toObject(); +// int sideStartId, sideEndId; +// if (!sideObj.isEmpty()) +// { +// sideStartId = sideObj.value("startID").toInt(); +// sideEndId = sideObj.value("endID").toInt(); +// } +// else +// { +// qWarning() << "side id error"; +// return false; +// } +// QJsonObject devicesObj = jsonObj.value("devices").toObject(); +// if (!devicesObj.isEmpty()) { +// CameraInfo cameraInfo; +// QStringList devicesLabelList = devicesObj.keys(); +// for each (QString deviceLabel in devicesLabelList) +// { +// cameraInfo.cameraLabel = deviceLabel; +// QStringList strList = deviceLabel.split(' '); +// if (strList.length() != 2) +// { +// qWarning() << "Device label: " << deviceLabel << " syntax error!"; +// continue; +// } +// cameraInfo.modelName = strList.at(0); +// cameraInfo.serialNumber = strList.at(1); +// QJsonObject deviceObj = devicesObj.value(deviceLabel).toObject(); +// if (!deviceObj.isEmpty()) +// { +// cameraInfo.cameraType = getCameraType(deviceObj.value("type").toInt()); +// cameraInfo.exposure = deviceObj.value("exposure").toDouble(); +// cameraInfo.imageHeight = deviceObj.value("height").toInt(); +// cameraInfo.imageWidth = deviceObj.value("width").toInt(); +// cameraInfo.saveImgSuffix = deviceObj.value("save_img_suffix").toString(); +// int id = deviceObj.value("id").toInt(); +// if (id >= topStartId && id <= topEndId) +// { +// m_mapIdCameraInfoTop[id] = cameraInfo; +// m_mapSerialNumberIdTop[cameraInfo.serialNumber] = id; +// } +// else if (id >= sideStartId && id <= sideEndId) +// { +// m_mapIdCameraInfoSide[id] = cameraInfo; +// m_mapSerialNumberIdSide[cameraInfo.serialNumber] = id; +// } +// } +// } +// } +// return true; +//} - QJsonParseError err; - QJsonDocument doc = QJsonDocument::fromJson(arr, &err); - if (doc.isEmpty()) - { - qWarning() << err.errorString(); //打印失败信息 - return false; - } - - QJsonObject jsonObj = doc.object(); - auto getCameraType = [](int type)-> CameraType - { - CameraType cameraType; - switch (type) - { - case 100: - cameraType = CameraType::Virtual; - break; - case 140: - cameraType = CameraType::Hik; - break; - case 190: - cameraType = CameraType::Basler; - break; - default: - break; - } - return cameraType; - }; - QJsonObject topObj = jsonObj.value("top").toObject(); - int topStartId, topEndId; - if (!topObj.isEmpty()) - { - topStartId = topObj.value("startID").toInt(); - topEndId = topObj.value("endID").toInt(); - } - else - { - qWarning() << "top id error"; - return false; - } - QJsonObject sideObj = jsonObj.value("side").toObject(); - int sideStartId, sideEndId; - if (!sideObj.isEmpty()) - { - sideStartId = sideObj.value("startID").toInt(); - sideEndId = sideObj.value("endID").toInt(); - } - else - { - qWarning() << "side id error"; - return false; - } - QJsonObject devicesObj = jsonObj.value("devices").toObject(); - if (!devicesObj.isEmpty()) { - CameraInfo cameraInfo; - QStringList devicesLabelList = devicesObj.keys(); - for each (QString deviceLabel in devicesLabelList) - { - cameraInfo.cameraLabel = deviceLabel; - QStringList strList = deviceLabel.split(' '); - if (strList.length() != 2) - { - qWarning() << "Device label: " << deviceLabel << " syntax error!"; - continue; - } - cameraInfo.modelName = strList.at(0); - cameraInfo.serialNumber = strList.at(1); - QJsonObject deviceObj = devicesObj.value(deviceLabel).toObject(); - if (!deviceObj.isEmpty()) - { - cameraInfo.cameraType = getCameraType(deviceObj.value("type").toInt()); - cameraInfo.exposure = deviceObj.value("exposure").toDouble(); - cameraInfo.imageHeight = deviceObj.value("height").toInt(); - cameraInfo.imageWidth = deviceObj.value("width").toInt(); - cameraInfo.saveImgSuffix = deviceObj.value("save_img_suffix").toString(); - int id = deviceObj.value("id").toInt(); - if (id >= topStartId && id <= topEndId) - { - m_mapIdCameraInfoTop[id] = cameraInfo; - m_mapSerialNumberIdTop[cameraInfo.serialNumber] = id; - } - else if (id >= sideStartId && id <= sideEndId) - { - m_mapIdCameraInfoSide[id] = cameraInfo; - m_mapSerialNumberIdSide[cameraInfo.serialNumber] = id; - } - } - } - } - return true; -} +//bool SmokeBoxIdentification::initCamera() +//{ +// QList cameraInfoList = m_mapIdCameraInfoSide.values(); +// cameraInfoList.append(m_mapIdCameraInfoTop.values()); +// if (!m_pCameraControl->loadCamera(cameraInfoList)) +// { +// qWarning() << "Load camera failed"; +// return false; +// } +// else { +// QStringList serialNumberList = m_mapSerialNumberIdSide.keys(); +// serialNumberList.append(m_mapSerialNumberIdTop.keys()); +// if (!m_pCameraControl->openCamera(serialNumberList)) +// { +// qWarning() << "Open camera failed"; +// return false; +// } +// else { +// if (!m_pCameraControl->startCamera(serialNumberList)) +// { +// qWarning() << "Start camera failed"; +// return false; +// } +// else { +// if (!m_pCameraControl->setSoftwareTrigger(serialNumberList)) +// { +// qWarning() << "Set software trigger failed"; +// } +// } +// } +// } +// return true; +//} -bool SmokeBoxIdentification::initCamera() +Q_SLOT void SmokeBoxIdentification::onActionClicked() { - QList cameraInfoList = m_mapIdCameraInfoSide.values(); - cameraInfoList.append(m_mapIdCameraInfoTop.values()); - if (!m_pCameraControl->loadCamera(cameraInfoList)) + QString strObj = sender()->objectName(); + if (strObj == "action_templateNum") { - qWarning() << "Load camera failed"; - return false; - } - else { - QStringList serialNumberList = m_mapSerialNumberIdSide.keys(); - serialNumberList.append(m_mapSerialNumberIdTop.keys()); - if (!m_pCameraControl->openCamera(serialNumberList)) - { - qWarning() << "Open camera failed"; - return false; - } - else { - if (!m_pCameraControl->startCamera(serialNumberList)) - { - qWarning() << "Start camera failed"; - return false; - } - else { - if (!m_pCameraControl->setSoftwareTrigger(serialNumberList)) - { - qWarning() << "Set software trigger failed"; - } - } - } + m_pNumTemplateBuild->setParent(this); + m_pNumTemplateBuild->setWindowTitle(tr("建立数量模板")); + m_pNumTemplateBuild->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); + m_pNumTemplateBuild->setWindowModality(Qt::ApplicationModal); + m_pNumTemplateBuild->setAttribute(Qt::WA_ShowModal, true); + m_pNumTemplateBuild->show(); } - return true; } void SmokeBoxIdentification::captureTop() { - emit sgCapture(m_mapSerialNumberIdTop.keys()); + emit sgCapture(eCameraLocation::emTop); } void SmokeBoxIdentification::captureSide() { - emit sgCapture(m_mapSerialNumberIdSide.keys()); + emit sgCapture(eCameraLocation::emSide); } -bool SmokeBoxIdentification::getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo) -{ - QString imgSaveBaseName; - auto iter = m_mapSerialNumberIdSide.find(serialNumber); - if (iter == m_mapSerialNumberIdSide.end()) - { - iter = m_mapSerialNumberIdTop.find(serialNumber); - if (iter != m_mapSerialNumberIdTop.end()) - { - int id = iter.value(); - QString suffix = m_mapIdCameraInfoTop.value(id).saveImgSuffix; - fileInfo.suffix = suffix; - fileInfo.baseName = QString::number(id); - fileInfo.name = fileInfo.baseName + suffix; - } - else - { - qWarning() << "Can not find " << serialNumber; - return false; - } - } - else - { - int id = iter.value(); - QString suffix = m_mapIdCameraInfoSide.value(id).saveImgSuffix; - fileInfo.suffix = suffix; - fileInfo.baseName = QString::number(id); - fileInfo.name = fileInfo.baseName + suffix; - } - return true; -} +//bool SmokeBoxIdentification::getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo) +//{ +// QString imgSaveBaseName; +// auto iter = m_mapSerialNumberIdSide.find(serialNumber); +// if (iter == m_mapSerialNumberIdSide.end()) +// { +// iter = m_mapSerialNumberIdTop.find(serialNumber); +// if (iter != m_mapSerialNumberIdTop.end()) +// { +// int id = iter.value(); +// QString suffix = m_mapIdCameraInfoTop.value(id).saveImgSuffix; +// fileInfo.suffix = suffix; +// fileInfo.baseName = QString::number(id); +// fileInfo.name = fileInfo.baseName + suffix; +// } +// else +// { +// qWarning() << "Can not find " << serialNumber; +// return false; +// } +// } +// else +// { +// int id = iter.value(); +// QString suffix = m_mapIdCameraInfoSide.value(id).saveImgSuffix; +// fileInfo.suffix = suffix; +// fileInfo.baseName = QString::number(id); +// fileInfo.name = fileInfo.baseName + suffix; +// } +// return true; +//} void SmokeBoxIdentification::saveImage(const cv::Mat& imgMat, const QString& filePath) { @@ -299,8 +333,7 @@ void SmokeBoxIdentification::saveImage(const QVector& vecImageInfo, i } for (int i = 0; i < vecImageInfo.size(); ++i) { - FileInfo fileInfo; - getSaveImgNameInfo(vecImageInfo.at(i).cameraSn, fileInfo); + FileInfo fileInfo = vecImageInfo.at(i).saveImgInfo; QString filePath = QString("%1\\%2").arg(dataSaveFolderPath).arg(fileInfo.name); if (workMode == WorkMode::IntoStock) { @@ -312,10 +345,10 @@ void SmokeBoxIdentification::saveImage(const QVector& vecImageInfo, i } } -Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector& vecImageInfo) +Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector& vecImageInfo, int cameraLocation) { QString serialNumber = vecImageInfo.last().cameraSn; - if (m_mapSerialNumberIdTop.contains(serialNumber)) + if (cameraLocation == eCameraLocation::emTop) { qDebug() << "top captured"; QtConcurrent::run([=] { @@ -331,7 +364,7 @@ Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector& ve m_workMode = WorkMode::Idle; }); } - else if (m_mapSerialNumberIdSide.contains(serialNumber)) + else if (cameraLocation == eCameraLocation::emSide) { qDebug() << "side captured"; QtConcurrent::run([=] { @@ -346,9 +379,8 @@ Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector& ve if (m_pCategoryMatcher->smokeMatch(typeNum, imgInfo.image, imgRltMat)) { bRlt = true; - FileInfo fileInfo; - getSaveImgNameInfo(imgInfo.cameraSn, fileInfo); - QString fileName = QString("%1_%2_rlt%3").arg(fileInfo.baseName) + FileInfo fileInfo = imgInfo.saveImgInfo; + QString fileName = QString("%1_%2_rlt%3").arg(fileInfo.strId) .arg(m_currtStockCheckInfo.smokeTypeNum).arg(fileInfo.suffix); QString filePath = QString("%1\\%2").arg(dataSaveFolder).arg(fileName); saveImage(imgRltMat, filePath); @@ -386,39 +418,83 @@ Q_SLOT void SmokeBoxIdentification::onDecodeMsg(const QString& msg) qDebug() << "msg: " << msg << " content: " << msgContent; QStringList strList = msgContent.split(SPLIT_RULE); qDebug() << "strlist length: " << strList.length() << " head: " << strList.at(0); - if (strList.length() == 7 && strList.at(0) == STOCK_CHECK_HEAD) + if (strList[0] == EMPTY_CHECK_HEAD) { - qDebug() << "开始货位盘点"; - m_workMode = WorkMode::StockCheck; - StockCheckInfo stockCheckInfo; - stockCheckInfo.streetName = strList.at(1); - stockCheckInfo.stockNum = strList.at(2); - stockCheckInfo.taskNum = strList.at(3); - stockCheckInfo.smokeTypeNum = strList.at(4); - stockCheckInfo.smokeQuantity = strList.at(5); - m_currtStockCheckInfo = stockCheckInfo; + if (strList.length() == 4) + { + EmptyCheckInfo emptyCheckInfo; + emptyCheckInfo.streetName = strList[1]; + emptyCheckInfo.taskNum = strList[2]; + m_currtEmptyCheckInfo = emptyCheckInfo; + if (strList[3] == "START") + { + m_workMode = WorkMode::EmptyCheck; + emit sgStartEmptyPlaceCheck(m_currtEmptyCheckInfo.streetName); + } + else if (strList[3] == "END") + { + if (m_workMode == WorkMode::EmptyCheck) + { + emit sgStopEmptyPlaceCheck(); + m_workMode = WorkMode::Idle; + } + } + } } - else if (strList.length() == 3 && strList.at(0) == STOCK_CHECK_HEAD) + if (strList.at(0) == STOCK_CHECK_HEAD) { - qDebug() << "取货到位"; - QString taskNum = strList.at(2); - QString currentTaskNum = m_currtStockCheckInfo.taskNum; - if (m_workMode == WorkMode::StockCheck) + if (strList.length() == 7) + { + qDebug() << "开始货位盘点"; + m_workMode = WorkMode::StockCheck; + StockCheckInfo stockCheckInfo; + stockCheckInfo.streetName = strList.at(1); + stockCheckInfo.stockNum = strList.at(2); + stockCheckInfo.taskNum = strList.at(3); + stockCheckInfo.smokeTypeNum = strList.at(4); + stockCheckInfo.smokeQuantity = strList.at(5); + m_currtStockCheckInfo = stockCheckInfo; + } + else if (strList.length() == 3) { - captureSide(); + qDebug() << "取货到位"; + QString taskNum = strList.at(2); + QString currentTaskNum = m_currtStockCheckInfo.taskNum; + if (m_workMode == WorkMode::StockCheck) + { + captureSide(); + captureTop(); + } + } + } + else if (strList.at(0) == INTO_STOCK_HEAD) + { + if (strList.length() == 4) + { + qDebug() << "入库顶部拍照"; + m_workMode = WorkMode::IntoStock; + IntoStockInfo intoStockInfo; + intoStockInfo.streetName = strList.at(1); + intoStockInfo.taskNum = strList.at(2); + intoStockInfo.stockNum = strList.at(3); + m_currtIntoStockInfo = intoStockInfo; captureTop(); } } - else if (strList.length() == 4 && strList.at(0) == INTO_STOCK_HEAD) + else if (strList.at(0) == LIGHT_CONTROL_HEAD) { - qDebug() << "入库顶部拍照"; - m_workMode = WorkMode::IntoStock; - IntoStockInfo intoStockInfo; - intoStockInfo.streetName = strList.at(1); - intoStockInfo.taskNum = strList.at(2); - intoStockInfo.stockNum = strList.at(3); - m_currtIntoStockInfo = intoStockInfo; - captureTop(); + if (strList.length() == 3) + { + qDebug() << "开关灯"; + if (strList.at(2) == "0") + { + emit sgControlSideLight(lightCtrl::emTurnOffLight); + } + else if (strList.at(2) == "1") + { + emit sgControlSideLight(lightCtrl::emTurnOnLight); + } + } } } @@ -428,11 +504,6 @@ Q_SLOT void SmokeBoxIdentification::onNumStatistic(QString typeNum) if (!m_bDataCollection) { qDebug() << "typeNum: " << typeNum; - QString dataSaveFolder = QString("%1\\%2\\%3\\%4").arg(FILE_STORAGE_PATH) - .arg(m_currtStockCheckInfo.stockNum).arg(m_currtStockCheckInfo.taskNum) - .arg(m_currtStockCheckInfo.smokeQuantity); - dataPreProcessing::mkDir(dataSaveFolder); - emit sgSaveSensorData2Local(dataSaveFolder); if (typeNum == "0") { m_currtStockCheckInfo.smokeQuantityRlt = "0"; @@ -487,7 +558,7 @@ Q_SLOT void SmokeBoxIdentification::onNumStatistic(QString typeNum) } } -void SmokeBoxIdentification::onSendStockCheckMsg(int mode) +void SmokeBoxIdentification::onSendStockCheckResults(int mode) { QString resultInfoMsg; switch (mode) @@ -561,6 +632,11 @@ Q_SLOT void SmokeBoxIdentification::onMonitorSensorTriggerStop(eSideID) emit sgMonitorSensorTriggerStop(); m_bDataCollection = false; emit sgSendData2AndAlgo(); + QString dataSaveFolder = QString("%1\\%2\\%3\\%4").arg(FILE_STORAGE_PATH) + .arg(m_currtStockCheckInfo.stockNum).arg(m_currtStockCheckInfo.taskNum) + .arg(m_currtStockCheckInfo.smokeQuantity); + dataPreProcessing::mkDir(dataSaveFolder); + emit sgSaveSensorData2Local(dataSaveFolder); } } @@ -596,7 +672,7 @@ bool SmokeBoxIdentification::decodeSmokeInfoCsv(const QString& filePath) int rowEnd = cellRange.lastRow(); int colEnd = cellRange.lastColumn(); - for (int i = rowStart + 2; i <= rowEnd; ++i) + for (int i = rowStart + 1; i <= rowEnd; ++i) { QString smokeCode = wsheet->read(i, colStart).toString(); QString smokeName = wsheet->read(i, colStart + 1).toString(); @@ -649,4 +725,21 @@ bool SmokeBoxIdentification::matchSmokeNameAndTemplateFolderName(const QString& } qDebug() << "match smokeName and templateFolderName successed"; return true; +} + +Q_SLOT void SmokeBoxIdentification::onSendEmptyCheckResults(const QMap& mapEmptyCheckResults) +{ + QString emptyAll; + for each (QString code in mapEmptyCheckResults.keys()) + { + int emptyStatus = mapEmptyCheckResults[code]; + emptyAll.append(code).append(CODE_CONTENT_SPLIT).append(QString::number(emptyStatus)) + .append(CONTENT_SPLIT); + } + QString emptyResult; + emptyResult.append(EMPTY_CHECK_HEAD).append(SPLIT_RULE).append(m_currtEmptyCheckInfo.streetName) + .append(SPLIT_RULE).append(m_currtEmptyCheckInfo.taskNum).append(SPLIT_RULE).append(emptyAll) + .append(END_SYMBOL); + m_pNetControl->sendMsg(emptyResult); + qDebug() << "send msg: " << emptyResult; } \ No newline at end of file diff --git a/src/SmokeBoxIdentification.h b/src/SmokeBoxIdentification.h index a602bf9..e1db6b8 100644 --- a/src/SmokeBoxIdentification.h +++ b/src/SmokeBoxIdentification.h @@ -16,7 +16,9 @@ #include "ADModule.h" #include "CategoryMatcher.h" #include "lpSerialStation.h" +#include "CodeScanStation.h" #include "dataPreprocessing.h" +#include "QNumTemplateBuild.h" #include "ui_SmokeBoxIdentification.h" enum MsgType @@ -42,6 +44,13 @@ struct IntoStockInfo QString stockNum; QStringList imagesPathList; }; + +struct EmptyCheckInfo +{ + QString streetName; + QString taskNum; +}; + struct StockCheckInfo { QString streetName; @@ -52,36 +61,29 @@ struct StockCheckInfo QString smokeTypeNumRlt; //盘点识别的品规号 QString smokeQuantityRlt; //盘点识别的数量 bool correctness; //盘点结果是否与上位机一致 - void clear() - { - streetName.clear(); - taskNum.clear(); - stockNum.clear(); - smokeTypeNum.clear(); - smokeQuantity.clear(); - smokeTypeNumRlt.clear(); - smokeQuantityRlt.clear(); - correctness = false; - } - StockCheckInfo &operator = (const StockCheckInfo& obj) - { - this->streetName = obj.streetName; - this->taskNum = obj.taskNum; - this->stockNum = obj.stockNum; - this->smokeTypeNum = obj.smokeTypeNum; - this->smokeQuantity = obj.smokeQuantity; - this->smokeTypeNumRlt = obj.smokeTypeNumRlt; - this->smokeQuantityRlt = obj.smokeQuantityRlt; - this->correctness = obj.correctness; - return *this; - } -}; - -struct FileInfo -{ - QString baseName; - QString suffix; - QString name; + //void clear() + //{ + // streetName.clear(); + // taskNum.clear(); + // stockNum.clear(); + // smokeTypeNum.clear(); + // smokeQuantity.clear(); + // smokeTypeNumRlt.clear(); + // smokeQuantityRlt.clear(); + // correctness = false; + //} + //StockCheckInfo &operator = (const StockCheckInfo& obj) + //{ + // this->streetName = obj.streetName; + // this->taskNum = obj.taskNum; + // this->stockNum = obj.stockNum; + // this->smokeTypeNum = obj.smokeTypeNum; + // this->smokeQuantity = obj.smokeQuantity; + // this->smokeTypeNumRlt = obj.smokeTypeNumRlt; + // this->smokeQuantityRlt = obj.smokeQuantityRlt; + // this->correctness = obj.correctness; + // return *this; + //} }; class SmokeBoxIdentification : public QMainWindow @@ -92,9 +94,10 @@ public: SmokeBoxIdentification(QWidget *parent = Q_NULLPTR); ~SmokeBoxIdentification(); - bool readCameraConfig(); + //bool readCameraConfig(); signals: - void sgCapture(const QStringList serialNumberList); + //void sgCapture(const QStringList serialNumberList); + void sgCapture(int cameraLocation); void sgCategoryMatchFinished(QString smokeNum); void sgShowImage(QLabel* labelPtr, const QImage& qImage); void sgSendData2AndAlgo(); @@ -102,47 +105,57 @@ signals: void sgMonitorSensorTriggerStart(eSideID); void sgMonitorSensorTriggerStop(); void sgSendStockCheckMsg(int mode); + void sgStartEmptyPlaceCheck(QString streetName); + void sgStopEmptyPlaceCheck(); + void sgControlSideLight(lightCtrl); private: - bool initCamera(); - void captureTop(); - void captureSide(); - void saveImage(const QVector& vecImageInfo, int workMode); - void saveImage(const cv::Mat& imgMat, const QString& filePath); - bool getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo); - Q_SLOT void onSendStockCheckMsg(int mode); + Q_SLOT void onSendStockCheckResults(int mode); Q_SLOT void onDecodeMsg(const QString& msg); - Q_SLOT void onCapturedImage(const QVector& vecImageInfo); + Q_SLOT void onCapturedImage(const QVector& vecImageInfo, int camearLocation); Q_SLOT void onNumStatistic(QString typeNum); - bool decodeSmokeInfoCsv(const QString& filePath); - bool matchSmokeNameAndTemplateFolderName(const QString& folderPath); Q_SLOT void onShowImage(QLabel* labelPtr, const QImage& qImage); Q_SLOT void onMonitorSensorTriggerStart(eSideID); Q_SLOT void onMonitorSensorTriggerStop(eSideID); + Q_SLOT void onActionClicked(); + Q_SLOT void onSendEmptyCheckResults(const QMap&); + + //bool initCamera(); + void captureTop(); + void captureSide(); + void saveImage(const QVector& vecImageInfo, int workMode); + void saveImage(const cv::Mat& imgMat, const QString& filePath); + //bool getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo); + bool decodeSmokeInfoCsv(const QString& filePath); + bool matchSmokeNameAndTemplateFolderName(const QString& folderPath); + bool m_bEmptyCheckStart{ false }; //bool m_bStockCheckStart{ false }; bool m_bCaptureFinish{ false }; bool m_bDataCollection{ false }; - bool m_bCamerasInit{ false }; - QMap m_mapIdCameraInfoTop; - QMap m_mapIdCameraInfoSide; - QMap m_mapSerialNumberIdTop; - QMap m_mapSerialNumberIdSide; + //bool m_bCamerasInit{ false }; + //QMap m_mapIdCameraInfoTop; + //QMap m_mapIdCameraInfoSide; + //QMap m_mapSerialNumberIdTop; + //QMap m_mapSerialNumberIdSide; QMap m_mapSmokeCode2Name; QMap m_mapSmokeName2TemplateFolderName; + //QThread* m_pCaptureThread; + QString m_currLeftRightJudge; + QVector m_vecStrHeightLeft; + QVector m_vecStrHeightRight; - WorkMode m_workMode; std::shared_ptr m_pDataProcess; - CameraControl* m_pCameraControl; + WorkMode m_workMode; + //CameraControl* m_pCameraControl; NetControl* m_pNetControl; CategoryMatcher* m_pCategoryMatcher; IntoStockInfo m_currtIntoStockInfo; StockCheckInfo m_currtStockCheckInfo; - QThread* m_pCaptureThread; - QString m_currLeftRightJudge; - QVector m_vecStrHeightLeft; - QVector m_vecStrHeightRight; + EmptyCheckInfo m_currtEmptyCheckInfo; + QNumTemplateBuild* m_pNumTemplateBuild{ nullptr }; + //QLabel* m_pShowRltImgLabel; Ui::SmokeBoxIdentificationClass ui; }; diff --git a/src/common/commonDefine.h b/src/common/commonDefine.h index d67fe09..5ced40b 100644 --- a/src/common/commonDefine.h +++ b/src/common/commonDefine.h @@ -1,24 +1,30 @@ #ifndef COMMON_DEFINE_H #define COMMON_DEFINE_H +#include #include #include #include #include #include #include +#include + +#include "QZkJsonParser.h" +#include "lp_singleton.h" #define DELETE_POINTER(p) if (p) {delete p; p = NULL;} #define CAMERA_CONFIG "\\config\\camera.json" #define NET_CONFIG "\\config\\netSetting.json" -#define SERIAL_CONFIG "\\config\\serialSetting.json" +#define COM_CONFIG "\\config\\comSetting.json" #define MATCHER_CONFIG "\\config\\match.json" #define SMOKEINFO_XLSX_CONFIG "\\user\\smokeInfo.xlsx" #define FILE_STORAGE_PATH ".\\fileData" #define INTOSTOCK_IMAGE_FOLDER "intoStock" #define TYPE_TEMPLATE_PATH ".\\templateImg" -#define NUM_TEMPLATE_PATH ".\\templateNum" +//#define NUM_TEMPLATE_PATH ".\\templateNum" +#define LOCAL_MODEL_PATH "\\localModel" #define HEARTBEAT_HEAD "HB" #define CREATE_CONNECT_HEAD "CE" @@ -35,7 +41,7 @@ #define LP_COLOR_CONTROL 0x88 #define LP_D1TOD80 0x86 #define LP_D81TOD140 0x87 -#define LP_SIDELIGHT_TURN_ON 0x85 +#define LP_SIDELIGHT_SWITCH 0x85 #define LP_SIDELIGHT_CONFIGURATION 0x88 #define LP_RESTART_LIGHT 0xFE #define LP_DATA_FULL_BITS 16 @@ -109,16 +115,23 @@ struct debugMsg QString msAD_2; }; -enum loopDataLogicRef +enum eCameraLocation { - emDatalogic1 = 0, - emDatalogic2 + emSide=0, + emTop }; -enum CBOX +enum eSideID { + em_LEFT = 0, + em_RIGHT, + + MAX_SIDES +}; + +enum loopDataLogicRef { - emExist = 1, - emEmpty + emDatalogic1 = 0, + emDatalogic2 }; enum lightCtrl @@ -133,7 +146,11 @@ enum emEptyPlateMonitorSelection emEmptyMonitorTrigger_2 }; - +enum StockCheckTrigger +{ + emMonitorTriggerStart = 1, + emMonitorTriggerStop +}; namespace myBody { enum stationRef @@ -148,12 +165,6 @@ namespace myBody { }; } -enum StockCheckTrigger -{ - emMonitorTriggerStart = 1, - emMonitorTriggerStop -}; - using matGroup = struct dataGroup { public: diff --git a/src/lpSerialStation.cpp b/src/lpSerialStation.cpp index d4a57ac..18fe28a 100644 --- a/src/lpSerialStation.cpp +++ b/src/lpSerialStation.cpp @@ -1,16 +1,15 @@ #include "lpSerialStation.h" -#include "QZkJsonParser.h" lpSerialStation::lpSerialStation() { qRegisterMetaType("eSideID"); + qRegisterMetaType("SerialErrorType"); m_pobjThread = new QThread; moveToThread(m_pobjThread); - connect(m_pobjThread, &QThread::started, this, &lpSerialStation::on_open); + connect(m_pobjThread, &QThread::started, this, &lpSerialStation::onOpen); connect(m_pobjThread, &QThread::finished, this, &QObject::deleteLater); - m_bStartEmptyCheck = false; } lpSerialStation::~lpSerialStation() @@ -30,21 +29,21 @@ bool lpSerialStation::loadParameters(const QString& filePath) QJsonObject objJson = QZkJsonParser::ReadJsonObject(filePath, &error); if (!objJson.empty()) { - QJsonArray jArray = objJson["SinglechipCOM"].toArray(); + QJsonArray jArray = objJson.value("leaper").toArray(); for (int i = 0; i < jArray.size(); ++i) { QJsonObject COMObj = jArray[i].toObject(); SerialParam sp; - sp.port_name_ = COMObj["port_name"].toString(); - sp.baud_ = COMObj["baud"].toInt(); - sp.auto_connect_ = COMObj["auto_connect"].toBool(); + sp.port_name_ = COMObj.value("port_name").toString(); + sp.baud_ = COMObj.value("BAUD").toInt(); + sp.auto_connect_ = COMObj.value("auto_connect").toBool(); sp.modbus_type_ = SERIAL_LEAPER; - m_commDeviceMap.insert(COMObj["device_name"].toString(), sp); + m_commDeviceMap.insert(COMObj.value("device_name").toString(), sp); } } else { - qDebug() << "please check the com self-define file, err: " << error; + qDebug() << "please check the comSetting file, err: " << error; return false; } qDebug() << "SensorsCom load param successed"; @@ -64,69 +63,124 @@ void lpSerialStation::closeComs() } } -void lpSerialStation::onControlSideLight(lightCtrl mCmdData) +void lpSerialStation::onControlSideLight(lightCtrl cmdData) { QSharedPointer byteArr_ptr = QSharedPointer(new LpSerialFrame); - byteArr_ptr->cmd = LP_SIDELIGHT_TURN_ON; - byteArr_ptr->data2 = mCmdData; + byteArr_ptr->cmd = LP_SIDELIGHT_SWITCH; + byteArr_ptr->data2 = cmdData; - lp_serial_manager::instance()->on_data_send(m_commDeviceMap[DIAGACROSSSENSOR].port_name_, byteArr_ptr); + lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, byteArr_ptr); } -Q_SLOT void lpSerialStation::onStartEmptyPlaceCheck(QString szClient) +Q_SLOT void lpSerialStation::onStartEmptyPlaceCheck(QString streetName) { m_bStartEmptyCheck = true; + m_strStreetName = streetName; + m_queueCodeLeft.clear(); + m_queueCodeRight.clear(); + m_mapEmptyLeft.clear(); + m_mapEmptyRight.clear(); } Q_SLOT void lpSerialStation::onStopEmptyPlaceCheck() { m_bStartEmptyCheck = false; - - m_CodeScanResQ.clear(); + emit sgNewEmptyCheckResults(m_mapEmptyLeft); + QThread::msleep(5); + emit sgNewEmptyCheckResults(m_mapEmptyRight); } -Q_SLOT void lpSerialStation::onNewCodeScanResults(eSideID sdID, QSharedPointer data_ptr_) +Q_SLOT void lpSerialStation::onNewCodeScanResults(int sdID, QSharedPointer data_ptr_) { if (!m_bStartEmptyCheck) { return; } - CodeScanResults csr; - csr.sdID = sdID; - csr.ResData = *data_ptr_; - m_CodeScanResQ.enqueue(csr); - - QSharedPointer byteArr_ptr = QSharedPointer(new LpSerialFrame); - byteArr_ptr->cmd = 0x84; - if (sdID == 0) + //CodeScanResults csr; + //csr.sdID = sdID; + //csr.ResData = *data_ptr_; + //m_CodeScanResQ.enqueue(csr); + QString codeStr = QString(*data_ptr_).trimmed().mid(1); + QString codeStrNew = codeStr; + if (codeStrNew.length() == 10) { - byteArr_ptr->data1 = 1; - } - else - { - byteArr_ptr->data2 = 1; + QString strCol = codeStrNew.mid(1, 3); //col 1~62 + QString strRow = codeStrNew.mid(4, 2);// row 1~9 + int nCol = strCol.toInt(0); + int nRow = strRow.toInt(0); + if (nCol < 1 || nCol > 62 || nRow < 1 || nRow > 9) + { + qWarning() << "col or row overrun!"; + return; + } + if (m_strStreetName == "6") + { + if (nRow == 1 || nRow == 2) + { + QString strColNew = QString("%1").arg(nCol + 1, 3, 10, QLatin1Char('0')); + codeStrNew.replace(1, 3, strColNew); + } + } + int streetSn = m_strStreetName.toInt(); + QString streetNameTemp = QString("%1").arg(streetSn, 2, 10, QLatin1Char('0')); + if (sdID == eSideID::em_RIGHT) + { + QString strCodeRightOut = "UL" + streetNameTemp + codeStrNew; + m_queueCodeRight.enqueue(strCodeRightOut); + QSharedPointer data_ptr = QSharedPointer(new LpSerialFrame); + int streetNum = m_strStreetName.toInt(); + data_ptr->cmd = 0x84; + if (streetNum <= 6 && streetNum >= 1 || streetNum == 10) + { + data_ptr->data1 = 1; + } + else + { + data_ptr->data1 = 1; + data_ptr->data3 = 1; + } + lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, data_ptr);//leaper协议数据发送 发送方式1 + } + else if (sdID == eSideID::em_LEFT) + { + QString strCodeLeftOut = "UL" + streetNameTemp + codeStrNew; + m_queueCodeLeft.enqueue(strCodeLeftOut); + QSharedPointer data_ptr = QSharedPointer(new LpSerialFrame); + int streetNum = m_strStreetName.toInt(); + data_ptr->cmd = 0x84; + if (streetNum <= 7 && streetNum >= 1) + { + data_ptr->data2 = 1; + } + else + { + data_ptr->data2 = 1; + data_ptr->data4 = 1; + } + lp_serial_manager::instance()->on_data_send(m_commDeviceMap[SINGLECHIP_COM].port_name_, data_ptr);//leaper协议数据发送 发送方式1 + } } - - lp_serial_manager::instance()->on_data_send(m_commDeviceMap[DIAGACROSSSENSOR].port_name_, byteArr_ptr); } -Q_SLOT void lpSerialStation::on_open() +Q_SLOT void lpSerialStation::onOpen() { for (auto iter = m_commDeviceMap.begin(); iter != m_commDeviceMap.end(); iter++) { if (lp_serial_manager::instance()->open(iter.value()) == -1) { - qDebug() << "open " << iter.value().port_name_ << "fail."; + qDebug() << "open " << iter.value().port_name_ << " fail."; continue; } } connect(lp_serial_manager::instance(), SIGNAL(signal_data_recv(const QString&, QSharedPointer)), - this, SLOT(on_data_receive(const QString&, QSharedPointer))); + this, SLOT(onDataReceive(const QString&, QSharedPointer))); + connect(lp_serial_manager::instance(), SIGNAL(signal_state_changed(const QString&, SerialErrorType)), + this, SLOT(onStateChanged(const QString&, SerialErrorType)));//串口打开状态 } -Q_SLOT void lpSerialStation::on_data_receive(const QString& sn, QSharedPointer data_ptr_) +Q_SLOT void lpSerialStation::onDataReceive(const QString& sn, QSharedPointer data_ptr_) { qDebug() << "monitor receive data"; @@ -144,7 +198,7 @@ Q_SLOT void lpSerialStation::on_data_receive(const QString& sn, QSharedPointerdata1 == StockCheckTrigger::emMonitorTriggerStop) { emit sgMonitorSensorTriggerStop(em_RIGHT); - qDebug() << "i stop left trigger"; + qDebug() << "i stop right trigger"; } if (data_ptr_->data2 == StockCheckTrigger::emMonitorTriggerStart) @@ -161,6 +215,88 @@ Q_SLOT void lpSerialStation::on_data_receive(const QString& sn, QSharedPointercmd == 0x84) { - + quint16 data1 = data_ptr_->data1; + quint16 data2 = data_ptr_->data2; + quint16 data3 = data_ptr_->data3; + quint16 data4 = data_ptr_->data4; + if (data1 != 0) //右侧浅货位 + { + int empty; + empty = data1 == EmptyResult::emExist ? 1 : 0; + if (m_queueCodeRight.size() <= 0) + { + return; + } + QString strCodeRightOut = m_queueCodeRight.dequeue(); + qDebug() << "right out code: " << strCodeRightOut << " empty: " << empty; + m_mapEmptyRight.insert(strCodeRightOut, empty); + if (data3 != 0) //右侧深货位 + { + if (m_strStreetName.toInt() != 10) + { + empty = data3 == EmptyResult::emExist ? 1 : 0; + QString strCodeRightIn = strCodeRightOut; + strCodeRightIn.replace(11, 1, "2"); + qDebug() << "right in code: " << strCodeRightIn << " empty: " << empty; + m_mapEmptyRight.insert(strCodeRightIn, empty); + } + } + } + else if (data2 != 0) //左侧浅货位 + { + int empty; + empty = data2 == EmptyResult::emExist ? 1 : 0; + if (m_queueCodeLeft.size() <= 0) + { + return; + } + QString strCodeLeftOut = m_queueCodeLeft.dequeue(); + qDebug() << "left out code: " << strCodeLeftOut << " empty: " << empty; + m_mapEmptyLeft.insert(strCodeLeftOut, empty); + if (data4 != 0) //左侧深货位 + { + if (m_strStreetName.toInt() != 7) + { + empty = data4 == EmptyResult::emExist ? 1 : 0; + QString strCodeLeftIn = strCodeLeftOut; + strCodeLeftIn.replace(11, 1, "2"); + qDebug() << "left in code: " << strCodeLeftIn << " empty: " << empty; + m_mapEmptyLeft.insert(strCodeLeftIn, empty); + } + } + } + } +} + +Q_SLOT void lpSerialStation::onStateChanged(const QString& sn, SerialErrorType err) +{ + /* + 显示串口状态 + */ + QString strMsg; + if (err == OpenSuccess) + { + strMsg = QString("%1 open success!").arg(sn); + qDebug() << strMsg; + } + else if (err == DeviceNotFoundError) + { + strMsg = QString("%1 not found! open failed.").arg(sn); + qDebug() << strMsg; + } + else if (err == OpenError) + { + strMsg = QString("%1 open failed.").arg(sn); + qDebug() << strMsg; + } + else if (err == CloseSuccess) + { + strMsg = QString("%1 close success.").arg(sn); + qDebug() << strMsg; + } + else if (err == CloseError) + { + strMsg = QString("%1 Not found! close failed.").arg(sn); + qDebug() << strMsg; } } \ No newline at end of file diff --git a/src/lpSerialStation.h b/src/lpSerialStation.h index 548e2fc..ced6ced 100644 --- a/src/lpSerialStation.h +++ b/src/lpSerialStation.h @@ -4,14 +4,9 @@ #include "lp_serial_manager.h" #include "commonDefine.h" -#define DIAGACROSSSENSOR "SensorsCom" - -enum eSideID { - em_LEFT = 0, - em_RIGHT, - - MAX_SIDES -}; +#define SINGLECHIP_COM "SinglechipCom" +#define CODESCAN_COM_LEFT "CodeScan_Left" +#define CODESCAN_COM_RIGHT "CodeScan_Right" struct CodeScanResults { @@ -19,6 +14,12 @@ struct CodeScanResults QByteArray ResData; }; +enum EmptyResult +{ + emExist = 1, + emEmpty +}; + class lpSerialStation : public QObject, public lp_singleton { Q_OBJECT @@ -31,28 +32,30 @@ public: void openComs(); void closeComs(); - void onControlSideLight(lightCtrl mCmdData); + Q_SLOT void onControlSideLight(lightCtrl cmdData); - Q_SLOT void onStartEmptyPlaceCheck(QString szClient); + Q_SLOT void onStartEmptyPlaceCheck(QString streetName); Q_SLOT void onStopEmptyPlaceCheck(); - Q_SLOT void onNewCodeScanResults(eSideID, QSharedPointer); + Q_SLOT void onNewCodeScanResults(int, QSharedPointer); signals: - void sgNewEmptyCheckResults(QSharedPointer); + void sgNewEmptyCheckResults(const QMap&); void sgMonitorSensorTriggerStart(eSideID); void sgMonitorSensorTriggerStop(eSideID); private: - Q_SLOT void on_open(); - Q_SLOT void on_data_receive(const QString& sn, QSharedPointer data_ptr_); - + Q_SLOT void onOpen(); + Q_SLOT void onDataReceive(const QString& sn, QSharedPointer data_ptr_); + Q_SLOT void onStateChanged(const QString&, SerialErrorType); private: - QQueue m_CodeScanResQ; - QString m_szClientName; - QString m_szPlaneNoLeft; - QString m_szPlaneNoRight; - bool m_bStartEmptyCheck; + //QQueue m_CodeScanResQ; + QQueue m_queueCodeLeft; + QQueue m_queueCodeRight; + bool m_bStartEmptyCheck{ false }; + QMap m_mapEmptyLeft; + QMap m_mapEmptyRight; + QString m_strStreetName; QThread* m_pobjThread; QMap m_commDeviceMap; diff --git a/src/numStatisticAlgo/dataPreProcessing.cpp b/src/numStatisticAlgo/dataPreProcessing.cpp index 44d938a..085abac 100644 --- a/src/numStatisticAlgo/dataPreProcessing.cpp +++ b/src/numStatisticAlgo/dataPreProcessing.cpp @@ -13,7 +13,7 @@ using namespace std; dataPreProcessing::dataPreProcessing() { - mkDir(NUM_TEMPLATE_PATH); + mkDir(QCoreApplication::applicationDirPath() + NUM_TEMPLATE_PATH); //mkDir(NUM_TEMPLATE_PATH_NORMAL); //mkDir(NUM_TEMPLATE_PATH_ABNORMAL); @@ -136,6 +136,52 @@ void dataPreProcessing::tranmitFilePathForSampleMark(int startTimeIndex) markSample(dirPath, startTimeIndex); }); } +bool dataPreProcessing::markSample(const QString& _filePath, int startTimeIndex, int winSize) +{ + QDir dir(_filePath); + if (!dir.exists()) + return false; + dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); + QFileInfoList infoList = dir.entryInfoList(); + int fileCount = infoList.count(); + if (fileCount <= 0) return false; + for (int i = 0; i < fileCount; i++) + { + QFileInfo fileInfo = infoList.at(i); + QString absPath = fileInfo.absoluteFilePath(); + QDir fileDir(absPath); + if (!fileDir.exists()) + return false; + QString mLabel = fileInfo.baseName(); + QStringList filter; + filter << "*.txt"; + fileDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + fileDir.setNameFilters(filter); + QFileInfoList imageInfoList = fileDir.entryInfoList(); + + int imageCount = imageInfoList.count(); + if (imageCount <= 0) continue; + for (int j = 0; j < imageCount; j++) + { + QFileInfo imageInfo = imageInfoList.at(j); + QString absImagePath = imageInfo.absoluteFilePath(); + QString strFileName = imageInfo.baseName(); + QVector> datavalVec;; + loadLocalDataFromFile(datavalVec, absImagePath); + if (datavalVec.size() <= 0) continue; + int endIndex = (startTimeIndex + winSize) >= datavalVec[0].size() ? datavalVec[0].size() - 1 : startTimeIndex + winSize; + QString xmlFilePath = absPath + "\\" + strFileName + ".xml"; + std::string stdName; + bool ok = qstring2stdString(xmlFilePath, stdName); + if (!ok) continue; + cv::FileStorage fs(stdName, cv::FileStorage::WRITE); + fs << "start" << startTimeIndex; + fs << "end" << endIndex; + fs << "label" << mLabel.toInt(); + } + } + return true; +} bool dataPreProcessing::markSample(const QString& _filePath, int startTimeIndex) { @@ -170,7 +216,7 @@ bool dataPreProcessing::markSample(const QString& _filePath, int startTimeIndex) QVector> datavalVec;; loadLocalDataFromFile(datavalVec, absImagePath); if (datavalVec.size() <= 0) continue; - int endIndex = (startTimeIndex + winSize) >= datavalVec[0].size() ? datavalVec[0].size() - 1 : startTimeIndex + winSize; + int endIndex = (startTimeIndex + m_winSize) >= datavalVec[0].size() ? datavalVec[0].size() - 1 : startTimeIndex + m_winSize; QString xmlFilePath = absPath + "\\" + strFileName + ".xml"; std::string stdName; bool ok = qstring2stdString(xmlFilePath, stdName); @@ -272,9 +318,9 @@ QVector dataPreProcessing::modelPrediction() const QString& preFilePath = strNames[fileIndex]; QVector> mVec; loadLocalDataFromFile(mVec, preFilePath); - if (winSize >= mVec[0].size()) return QVector(); + if (m_winSize >= mVec[0].size()) return QVector(); - int label = dataRepeatMatch(winSize, mVec, "1_苏烟硬七星", "right");// need to change + int label = dataRepeatMatch(m_winSize, mVec, "1_苏烟硬七星", "right");// need to change finalLabelVec.push_back(label); /*QVector a; a.resize(40);*/ @@ -362,14 +408,14 @@ int dataPreProcessing::modelPrediction(const QVector> vec, QStri //loopVec.push_back(it.value()); //labelLoopVec.push_back(it.key()); const int label = it.key(); - qDebug() << "num folder: " << label; + //qDebug() << "num folder: " << label; QMultiMap>> rightLeftMapValueVec = it.value(); QMultiMap>>::iterator iterRighLeftMap = rightLeftMapValueVec.begin(); for (iterRighLeftMap; iterRighLeftMap != rightLeftMapValueVec.end(); iterRighLeftMap++) { const QString& leftOrRight = iterRighLeftMap.key(); - qDebug() << "leftOrRight: " << leftOrRight; + //qDebug() << "leftOrRight: " << leftOrRight; if (leftOrRight == leftRightJudge) { QVector reshapedSampleVec; @@ -391,30 +437,30 @@ int dataPreProcessing::modelPrediction(const QVector> vec, QStri convertToVector(dstSampleTarShapeMat, sampleVec); std::vector sampleNewVec(sampleVec); std::vector dstTarShapeNewVec(dstTarShapeVec); - qDebug() << "sampleVec size: " << sampleVec.size() << ", dstTarShapeVec size: " - << dstTarShapeVec.size(); - qDebug() << "reshapedSampleVec size: " << reshapedSampleVec.size() << ", reshapedTarVec size: " - << reshapedTarVec.size(); + //qDebug() << "sampleVec size: " << sampleVec.size() << ", dstTarShapeVec size: " + // << dstTarShapeVec.size(); + //qDebug() << "reshapedSampleVec size: " << reshapedSampleVec.size() << ", reshapedTarVec size: " + // << reshapedTarVec.size(); if (reshapedSampleVec.size() != reshapedTarVec.size()) { //qDebug() << "something wrong with sample vec size"; if (sampleVec.size() > dstTarShapeVec.size()) { sampleNewVec.resize(dstTarShapeVec.size()); - qDebug() << "sampleNewVec size:" << sampleNewVec.size(); + //qDebug() << "sampleNewVec size:" << sampleNewVec.size(); } else if (dstTarShapeVec.size() > sampleVec.size()) { dstTarShapeNewVec.resize(sampleVec.size()); - qDebug() << "dstTarShapeNewVec size: " << dstTarShapeNewVec.size(); + //qDebug() << "dstTarShapeNewVec size: " << dstTarShapeNewVec.size(); LB_Improved filterNew(dstTarShapeNewVec, dstTarShapeNewVec.size() / 50.0); double dis = filterNew.test(sampleNewVec); if (disMin > dis) { disMin = dis; bestLabel = label; } - qDebug() << "new filter v size: " << filterNew.getVSize(); - qDebug() << "disMin: " << disMin; + //qDebug() << "new filter v size: " << filterNew.getVSize(); + //qDebug() << "disMin: " << disMin; } } @@ -425,7 +471,7 @@ int dataPreProcessing::modelPrediction(const QVector> vec, QStri disMin = dis; bestLabel = label; } - qDebug() << "disMin: " << disMin; + //qDebug() << "disMin: " << disMin; } // test @@ -442,6 +488,7 @@ int dataPreProcessing::modelPrediction(const QVector> vec, QStri //mComparedValMapLabel[val] = label; } mComparedValMapLabel[disMin] = bestLabel; + qDebug() << "disMin: " << disMin << " bestLabel: " << bestLabel; //cv::parallel_for_(cv::Range(0, loopVec.size()), parallelInvoker(this, loopVec, labelLoopVec, reshapedTarVec)); return 1; } @@ -499,7 +546,7 @@ int dataPreProcessing::dataRepeatMatch(QString typeSerial, QString leftRightJudg // qDebug() << " winSize"; // return -1; //} - return dataRepeatMatch(winSize, m_comDecData, typeSerial, leftRightJudge); + return dataRepeatMatch(m_winSize, m_comDecData, typeSerial, leftRightJudge); } void dataPreProcessing::loadedDataReshapeForComparison(const QVector> & loadedData, QVector& reshapedData) @@ -569,26 +616,39 @@ bool dataPreProcessing::createSample(const QString& filePath, QFile localDataFile(filePath); if (!localDataFile.open(QFile::ReadOnly)) return false; int suffix = label.toInt(); - // a group - const double localBoxRealHeight = 575; - const double localBoxRealWidth = 253; - const double localBoxRealLength = 457; - - const double localBoxRealType2Height = 293; - const double localBoxRealType3Height = 305; - const double localBoxRealType4Height = 306; - // a group - const double localBoxRealType5Height = 556; - const double localBoxRealType5Width = 243;// - - const double localBoxRealType6Height = 241; - const double localBoxRealType7Height = 241; - // a group - const double localBoxRealType8Height = 582; - const double localBoxRealType8Width = 147; - // a group - const double localBoxRealType9Height = 493; - const double localBoxRealType9Width = 213; + + //垛型1 32016001 南京(硬精品)L:455 W:258 H:578 + const double localBoxRealLength = 455; + const double localBoxRealWidth = 258; + const double localBoxRealHeight = 578; + //垛型2 32016056 南京(硬炫赫门) L:526 W:283 H:287 + const double localBoxRealType2Length = 526; + const double localBoxRealType2Width = 283; + const double localBoxRealType2Height = 287; + //垛型3 34030073 黄山(硬大红方印) L:490 W:290 H:330 + const double localBoxRealType3Length = 490; + const double localBoxRealType3Width = 290; + const double localBoxRealType3Height = 330; + //垛型4 35260201 七匹狼(硬纯净)L:486 W:321 H:343 + const double localBoxRealType4Length = 486; + const double localBoxRealType4Width = 321; + const double localBoxRealType4Height = 343; + //垛型5 41010002 黄金叶(硬天香中支) L:522 W:356 H:207 + const double localBoxRealType5Length = 532; + const double localBoxRealType5Width = 356; + const double localBoxRealType5Height = 207; + //垛型6 11010021 中南海(硬冰耀中支) L:510 W:228 H:535 + const double localBoxRealType6Length = 510; + const double localBoxRealType6Width = 228; + const double localBoxRealType6Height = 535; + + //const double localBoxRealType7Height = 241; + //// a group + //const double localBoxRealType8Height = 582; + //const double localBoxRealType8Width = 147; + //// a group + //const double localBoxRealType9Height = 493; + //const double localBoxRealType9Width = 213; double localHeightCmp; double realHeightCmp; @@ -605,72 +665,61 @@ bool dataPreProcessing::createSample(const QString& filePath, double localSensorHeight = ls[i].toDouble(); if (typeJusge <= 1) { - if (suffix > 0 && suffix <= 8) - { - localHeightCmp = localBoxRealWidth; - realHeightCmp = rWidth; - if (suffix == 5) - { - localHeightCmp = localBoxRealLength; - realHeightCmp = rLength; - } - } - else if (suffix <= 10 && suffix > 8) + if (suffix > 0 && suffix <= 10) { localHeightCmp = localBoxRealHeight; realHeightCmp = rHeight; } - else if (suffix > 10 && suffix <=14) + else if (suffix > 10 && suffix <= 18) { - if (localSensorHeight <= 700) + if (localSensorHeight <= 610) { localHeightCmp = localBoxRealHeight; realHeightCmp = rHeight; } - else + else if (localSensorHeight > 610 && localSensorHeight <= 870) { localHeightCmp = localBoxRealHeight + localBoxRealWidth; realHeightCmp = rHeight + rWidth; } + else + { + localHeightCmp = localBoxRealHeight + 2 * localBoxRealWidth; + realHeightCmp = rHeight + 2 * rWidth; + } } - else if (suffix > 14 && suffix <= 18) + else if (suffix > 18 && suffix <=20) { - if (localSensorHeight <= 700) + if (localSensorHeight <= 610) { localHeightCmp = localBoxRealHeight; realHeightCmp = rHeight; } - else if (localSensorHeight > 700 && localSensorHeight <= 900) - { - localHeightCmp = localBoxRealHeight + localBoxRealWidth; - realHeightCmp = rHeight + rWidth; - } else { - localHeightCmp = localBoxRealHeight + 2 * localBoxRealWidth; - realHeightCmp = rHeight + 2 * rWidth; + localHeightCmp = 2 * localBoxRealHeight; + realHeightCmp = 2 * rHeight; } } - else if (suffix > 18 && suffix <=20) + else if (suffix > 20 && suffix <= 28) { - localHeightCmp = 2 * localBoxRealHeight; - realHeightCmp = 2 * rHeight; - } - else if (suffix > 20 && suffix <=24 ) - { - if (localSensorHeight <=1200) + if (localSensorHeight <= 1190) { localHeightCmp = 2 * localBoxRealHeight; realHeightCmp = 2 * rHeight; } - else + else if (localSensorHeight > 1190 && localSensorHeight <= 1450) { localHeightCmp = 2 * localBoxRealHeight + localBoxRealWidth; realHeightCmp = 2 * rHeight + rWidth; } - + else + { + localHeightCmp = 2 * localBoxRealHeight + 2 * localBoxRealWidth; + realHeightCmp = 2 * rHeight + 2 * rWidth; + } } - else if (suffix > 24 && suffix <=28) + else if (suffix > 20 && suffix <=28) { if (localSensorHeight <= 1200) { @@ -691,152 +740,105 @@ bool dataPreProcessing::createSample(const QString& filePath, } else if (suffix > 28) { - localHeightCmp = 3 * localBoxRealHeight; - realHeightCmp = 3 * rHeight; + if (localSensorHeight <= 1190) + { + localHeightCmp = 2 * localBoxRealHeight; + realHeightCmp = 2 * rHeight; + } + else + { + localHeightCmp = 3 * localBoxRealHeight; + realHeightCmp = 3 * rHeight; + } } } else if(typeJusge == 2) { - localHeightCmp = localBoxRealType2Height; + localHeightCmp = localBoxRealType2Width; realHeightCmp = rHeight; } else if (typeJusge == 3) { - localHeightCmp = localBoxRealType3Height; + localHeightCmp = localBoxRealType3Width; realHeightCmp = rHeight; } else if (typeJusge == 4) { - localHeightCmp = localBoxRealType4Height; + localHeightCmp = localBoxRealType4Width; realHeightCmp = rHeight; } else if (typeJusge == 5) { - if (suffix <= 5) - { - localHeightCmp = localBoxRealType5Width; - realHeightCmp = rWidth; - } - else if (suffix == 6) + localHeightCmp = localBoxRealType5Height; + realHeightCmp = rHeight; + } + else if (typeJusge == 6) + { + if (suffix > 0 && suffix <= 8) { - localHeightCmp = localBoxRealType5Height; + localHeightCmp = localBoxRealType6Height; realHeightCmp = rHeight; } - else if (suffix > 6 && suffix <= 10) + else if (suffix > 8 && suffix <= 10) { - if (localSensorHeight <= 600) + if (localSensorHeight <= 565) { - localHeightCmp = localBoxRealType5Height; + localHeightCmp = localBoxRealType6Height; realHeightCmp = rHeight; } - else + else if (localSensorHeight > 565 && localSensorHeight <= 795) { - localHeightCmp = localBoxRealType5Height + localBoxRealType5Width; + localHeightCmp = localBoxRealType6Height + localBoxRealType6Width; realHeightCmp = rHeight + rWidth; } - } - else if (suffix == 11) - { - if (localSensorHeight <= 600) - { - localHeightCmp = localBoxRealType5Height; - realHeightCmp = rHeight; - }else if (localSensorHeight > 600 && localSensorHeight <=1100) + else { - localHeightCmp = localBoxRealType5Height + localBoxRealType5Width; - realHeightCmp = rHeight + rWidth; - } - else { - localHeightCmp = localBoxRealType5Height + 2*localBoxRealType5Width; - realHeightCmp = rHeight + 2*rWidth; + localHeightCmp = localBoxRealType6Height + 2 * localBoxRealType6Width; + realHeightCmp = rHeight + 2 * rWidth; } } - else if (suffix == 12) - { - localHeightCmp = localBoxRealType5Height; - realHeightCmp = rHeight; - } - else if(suffix > 12 && suffix <=14) + else if (suffix > 10 && suffix <= 16) { - if (localSensorHeight <=1200) + if (localSensorHeight <= 565) { - localHeightCmp = localBoxRealType5Height; + localHeightCmp = localBoxRealType6Height; realHeightCmp = rHeight; } else { - localHeightCmp = localBoxRealType5Height + localBoxRealType5Width; - realHeightCmp = rHeight + rWidth; + localHeightCmp = 2 * localBoxRealType6Height; + realHeightCmp = 2 * rHeight; } } - } - else if (typeJusge == 6) - { - localHeightCmp = localBoxRealType6Height; - realHeightCmp = rHeight; - } - else if (typeJusge == 7) - { - localHeightCmp = localBoxRealType7Height; - realHeightCmp - rHeight; - } - else if (typeJusge == 8) - { - if (suffix == 5 || suffix == 10) - { - localHeightCmp = localBoxRealType8Width; - realHeightCmp = rWidth; - } - else if (suffix == 15 || suffix == 20) + else if (suffix > 16 && suffix <= 18) { - if (localSensorHeight <= 620) - { - localHeightCmp = localBoxRealType8Height; - realHeightCmp = rHeight; - } - else + if (localSensorHeight <= 1100) { - localHeightCmp = localBoxRealType8Height + localBoxRealType8Width; - realHeightCmp = rHeight + rWidth; + localHeightCmp = 2 * localBoxRealType6Height; + realHeightCmp = 2 * rHeight; } - } - else if (suffix == 25) - { - if (localSensorHeight <= 950) + else if (localSensorHeight > 1100 && localSensorHeight <= 1330) { - localHeightCmp = localBoxRealType8Height + 2 * localBoxRealType8Width; - realHeightCmp = rHeight + 2 * rWidth; + localHeightCmp = 2 * localBoxRealType6Height + localBoxRealType6Width; + realHeightCmp = 2 * rHeight + rWidth; } else { - localHeightCmp = localBoxRealType8Height + 3 * localBoxRealType8Width; - realHeightCmp = rHeight + 3 * rWidth; + localHeightCmp = 2 * localBoxRealType6Height + 2 * localBoxRealType6Width; + realHeightCmp = 2 * rHeight + 2 * rWidth; } } - else if (suffix == 30) - { - localHeightCmp = localBoxRealType8Height; - realHeightCmp = rHeight; - } - } - else if (typeJusge == 9) - { - if (suffix <= 18) - { - localHeightCmp = localBoxRealType9Height; - realHeightCmp = rHeight; - } else if (suffix > 18) { - if (localSensorHeight <= 1050 ) + if (localSensorHeight <= 1100) { - localHeightCmp = localBoxRealType9Height; - realHeightCmp = rHeight; + localHeightCmp = 2 * localBoxRealType6Height; + realHeightCmp = 2 * rHeight; } else { - localHeightCmp = 2 * localBoxRealType9Height + localBoxRealType9Width; - realHeightCmp = 2 * rHeight + rWidth; + localHeightCmp = 3 * localBoxRealType6Height; + realHeightCmp = 3 * rHeight; } } } @@ -855,41 +857,44 @@ bool dataPreProcessing::createSample(const QString& filePath, } bool dataPreProcessing::loadLocalSampleForCreatingSamples(const QString& localSamplePath, - const QString& tyName, - int height, + const QString& fileTypeName, + int length, int width, - int length) + int height) { QDir dir(localSamplePath); if (!dir.exists()) + { + qDebug() << localSamplePath << " not exist"; return false; + } dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList infoList = dir.entryInfoList(); - int fileCount = infoList.count(); - if (fileCount <= 0) return false; - for (int i = 0; i < fileCount; i++) + int folderCount = infoList.count(); + if (folderCount <= 0) return false; + for (int i = 0; i < folderCount; i++) { - QFileInfo fileInfo = infoList.at(i); - QString absPath = fileInfo.absoluteFilePath(); + QFileInfo subFolderInfo = infoList.at(i); + QString absPath = subFolderInfo.absoluteFilePath(); QDir fileDir(absPath); if (!fileDir.exists()) return false; - QString mLabel = fileInfo.baseName(); + QString mLabel = subFolderInfo.baseName(); QStringList filter; filter << "*.txt"; fileDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); fileDir.setNameFilters(filter); - QFileInfoList imageInfoList = fileDir.entryInfoList(); + QFileInfoList numDataFileInfoList = fileDir.entryInfoList(); - int imageCount = imageInfoList.count(); - if (imageCount <= 0) continue; - for (int j = 0; j < imageCount; j++) + int dataFileCount = numDataFileInfoList.count(); + if (dataFileCount <= 0) continue; + for (int j = 0; j < dataFileCount; j++) { - QFileInfo imageInfo = imageInfoList.at(j); - QString str = imageInfo.baseName(); - QString absImagePath = imageInfo.absoluteFilePath(); + QFileInfo numDataFileInfo = numDataFileInfoList.at(j); + QString str = numDataFileInfo.baseName(); + QString absFilePath = numDataFileInfo.absoluteFilePath(); QVector transDataVec; - createSample(absImagePath, tyName, mLabel, 0, width, height, transDataVec, str); + createSample(absFilePath, fileTypeName, mLabel, length, width, height, transDataVec); auto savefile = [&](const QString& path, QVector& vec)->bool { ofstream mfile; @@ -907,11 +912,26 @@ bool dataPreProcessing::loadLocalSampleForCreatingSamples(const QString& localSa mfile.flush(); mfile.close(); }; - QString mPath = QString("%1\\%2\\%3").arg(NUM_TEMPLATE_PATH).arg(tyName).arg(mLabel); - QString _filePath = mPath + "\\" + str + ".txt"; + QString tarTemplateFolder = QCoreApplication::applicationDirPath() + QString("%1\\%2\\%3").arg(NUM_TEMPLATE_PATH).arg(fileTypeName).arg(mLabel); + QDir folder(tarTemplateFolder); + if (!folder.exists()) + { + QDir dir; + if (dir.mkpath(tarTemplateFolder)) + { + qDebug() << "Create folder: " << tarTemplateFolder << " successfully."; + } + else + { + qDebug() << "Create folder:" << tarTemplateFolder << " failed."; + return false; + } + } + QString _filePath = tarTemplateFolder + "\\" + str + ".txt"; savefile(_filePath, transDataVec); } } + return true; } void dataPreProcessing::getDirForHist(const QString& _rootDir, QVector& vec) @@ -969,7 +989,7 @@ bool dataPreProcessing::qstring2stdString(const QString& str, std::string &stdSt bool dataPreProcessing::creatNumFolder(const QString& typeStr) { if (typeStr.isEmpty()) return false; - QString mstr = QString("%1\\%2").arg(NUM_TEMPLATE_PATH).arg(typeStr); + QString mstr = QCoreApplication::applicationDirPath() + QString("%1\\%2").arg(NUM_TEMPLATE_PATH).arg(typeStr); mkDir(mstr); //QString typeRoot = NUM_TEMPLATE_PATH + "\\" + typeStr; for (int i = 1; i <= folderNum; ++i) @@ -1253,4 +1273,4 @@ void dataPreProcessing::sensorValTransformationTemp( } decVec[i] = sVal; } -} \ No newline at end of file +} diff --git a/src/numStatisticAlgo/dataPreprocessing.h b/src/numStatisticAlgo/dataPreprocessing.h index 2d92451..7ff9e68 100644 --- a/src/numStatisticAlgo/dataPreprocessing.h +++ b/src/numStatisticAlgo/dataPreprocessing.h @@ -9,6 +9,8 @@ #include "cvplot.h" #include "qdebug.h" #include "sensorCali.h" + +#include #define XML_IMAGE_NAME "image" #define NUM_TEMPLATE_PATH "\\templateNum" #define HIST_TEMPL_PATH ".\\histTempl" @@ -49,7 +51,7 @@ public: if (filePath.isEmpty()) return false; QDir dir; - return dir.mkdir(filePath); + return dir.mkpath(filePath); }; void dataVisualTest(); @@ -66,8 +68,8 @@ public: bool qstring2stdString(const QString& str, std::string &stdStr); bool creatNumFolder(const QString& typeStr); bool creatHistNumFolder(const QString& typeStr); - void setWinSize(int _size) { winSize = _size; } - int getWinSize() { return winSize; } + void setWinSize(int _size) { m_winSize = _size; } + int getWinSize() { return m_winSize; } bool getFileDir(const QString& _rootDir); bool loadLocalDataFromFile(QVector> &val, const QString& _txtPath); void loaWordFromFile(const QString& filPath, QVector>& val, QString str = " "); @@ -79,6 +81,8 @@ public: void singleMonitorVecScale(const QVector& constVec, QVector& vec); void tranmitFilePathForSampleMark(int startTimeIndex); bool markSample(const QString& _filePath, int startTimeIndex); + bool markSample(const QString& _filePath, int startTimeIndex, int winSize); + void transmitFilePathForSampleWithItsCorresLabel(); bool loadSampleWithItsCorresLabel(const QString& samplePath); QVector modelPrediction(); @@ -118,12 +122,12 @@ public: int rWidth, int rHeight, QVector& vec, - QString txtFileName); + QString txtFileName = QString()); bool loadLocalSampleForCreatingSamples(const QString& localSamplePath, const QString& tyName, - int height, + int length, int width, - int length); + int height); // for hist void getDirForHist(const QString& _rootDir, QVector& vec); @@ -148,7 +152,7 @@ public: }; private: cv::Mat rawMat; - int winSize; + int m_winSize; QVector> m_comDecData; QString m_szSide; QVector m_normAndabnormDir; diff --git a/tpvs17/SmokeBoxIdentification/QNumTemplateBuild.ui b/tpvs17/SmokeBoxIdentification/QNumTemplateBuild.ui new file mode 100644 index 0000000..b684658 --- /dev/null +++ b/tpvs17/SmokeBoxIdentification/QNumTemplateBuild.ui @@ -0,0 +1,183 @@ + + + QNumTemplateBuildClass + + + + 0 + 0 + 887 + 601 + + + + Form + + + + + + Qt::Vertical + + + + + + + + + + 瀹藉害锛 + + + + + + + + + + 鍫嗗灈鏂瑰紡缂栧彿锛 + + + + + + + 鍗风儫缂栧彿锛 + + + + + + + + 1-浜旇姳鍨 + + + + + 2-绔4妯2 + + + + + 3-妯3绔2+2 + + + + + 4-绔2+2妯2 + + + + + 5-绔3妯2 + + + + + 6-绔2妯2+绔2妯2 + + + + + + + + 鍗风儫鍚嶇О锛 + + + + + + + + + + + + + 楂樺害锛 + + + + + + + 闀垮害锛 + + + + + + + + + + 璧峰鏍囧織浣嶏細 + + + + + + + + + + 绐楀彛澶у皬锛 + + + + + + + + lineEdit_startRow + lineEdit_length + label_5 + lineEdit_width + label + lineEdit_typeNum + label_2 + comboBox_modelNum + label_3 + lineEdit_chineseName + label_4 + label_6 + lineEdit_height + label_7 + lineEdit_winSize + label_8 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 鐢熸垚妯℃澘 + + + + + + + + + + + + diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.ui b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.ui index aa6eab5..f8e1fd8 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.ui +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.ui @@ -31,8 +31,14 @@ false + + + + 鏁伴噺妯℃澘 + + diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj index 607f846..dbb7ae1 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj @@ -113,6 +113,7 @@ + @@ -122,11 +123,13 @@ + + @@ -142,6 +145,10 @@ + + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + @@ -157,6 +164,10 @@ + + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters index c0accdf..2948583 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters @@ -45,6 +45,9 @@ Form Files + + Form Files + @@ -79,6 +82,12 @@ Source Files\common + + Source Files + + + Source Files + @@ -105,6 +114,12 @@ Header Files + + Header Files + + + Header Files + diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.user b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.user index 56767df..7a20d55 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.user +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.user @@ -3,14 +3,14 @@ C:\Qt\Qt5.9.4\5.9.4\msvc2017_64 - PATH=$(QTDIR)\bin%3b$(PATH) - $(OutDir)\$(ProjectName)d.exe + $(OutDir)smokeBoxd.exe WindowsLocalDebugger + PATH=$(QTDIR)\bin%3b$(PATH) C:\Qt\Qt5.9.4\5.9.4\msvc2017_64 - PATH=$(QTDIR)\bin%3b$(PATH) - $(OutDir)\$(ProjectName).exe + $(OutDir)smokeBox.exe WindowsLocalDebugger + PATH=$(QTDIR)\bin%3b$(PATH) \ No newline at end of file