1、集成空货位检测。2、添加建立数量模板的功能。3、将主程序里的一些操作放入相机管理类CameraControl中,并将CameraControl以单例实现。4、支持相机的图像以90度的倍数旋转。

LanXin3D
QuShuailong 3 years ago
parent 563df116b1
commit 59b0afb7b9

@ -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,

@ -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
}
]
}

@ -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",

@ -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
}
]
}

@ -12,7 +12,6 @@
#include <QThread>
#include <QDateTime>
#include "lp_singleton.h"
#include "commonDefine.h"
#include "dataPreprocessing.h"
const int mimumDataSize = 5;

@ -2,13 +2,25 @@
#include "CameraControl.h"
#include <QDebug>
CameraControl::CameraControl(QObject *parent) : QObject(parent)
CameraControl::CameraControl()
{
qRegisterMetaType<QVector<ImageInfo> >("QVector<ImageInfo>");
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<CameraInfo> 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<CameraInfo>& 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<ImageInfo> 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<QString, int>::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<ImageInfo> 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;
}
}

@ -3,6 +3,8 @@
#include <QMap>
#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 }; //ÐýÞD½Ç¶È
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<CameraControl>
{
Q_OBJECT
public:
explicit CameraControl(QObject *parent = nullptr);
explicit CameraControl();
~CameraControl();
//static void EnumCameras(QList<CameraInfo>& cameraInfoList);
bool readCameraConfig(QString filePath);
bool initCamera();
bool loadCamera(const QList<CameraInfo>& 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<ImageInfo>& vecImageInfo);
void sgCapturedImage(const QVector<ImageInfo>& 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<int, CameraInfo> m_mapIdCameraInfoTop;
QMap<int, CameraInfo> m_mapIdCameraInfoSide;
QMap<QString, int> m_mapSerialNumberIdTop;
QMap<QString, int> m_mapSerialNumberIdSide;
QVector<Camera*> m_vecPCamera;
QMap<QString, int> m_mapSNIndex;
bool m_bCamerasInit{ false };
eCameraLocation m_eCameraLocation;
QThread* m_pobjThread;
QMutex m_mutex;
};
#endif // !CAMERA_CONTROL_H

@ -1,7 +1,6 @@
#ifndef CATEGORY_MATCHER_H
#define CATEGORY_MATCHER_H
#include <QtWidgets/QApplication>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>

@ -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<QByteArray>)),
this, SLOT(onSerialDataRecv(const QString&, QSharedPointer<QByteArray>)));
//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<QByteArray> 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;
// }
//}

@ -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<CodeScanStation>
{
Q_OBJECT
public:
CodeScanStation();
~CodeScanStation();
bool loadParameters(const QString& filePath);
void openComs();
void closeComs();
signals:
void sgNewCodeScanData(int, QSharedPointer<QByteArray>);
private:
Q_SLOT void onOpen();
Q_SLOT void onSerialDataRecv(const QString& sn, QSharedPointer<QByteArray> data_ptr_);
//Q_SLOT void onStateChanged(const QString&, SerialErrorType);
private:
bool m_bStartEmptyCheck;
QThread* m_pobjThread;
QMap<eSideID, SerialParam> m_DeviceParaMap;
QMap<QString, eSideID> m_ComSensorIDMap;
};
#endif // !CODE_SCAN_STATION_H

@ -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() << "网络连接成功!!!";
}

@ -45,6 +45,7 @@ private:
QString m_streetName;
bool m_bAutoReconnect;
QString m_configPath;
int m_heartInterval{ 5 };
QTimer* m_pTimerHeartbeat;
signals:

@ -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)
//{
//
//}

@ -0,0 +1,33 @@
#ifndef NUM_TEMPLATE_BUILD_H
#define NUM_TEMPLATE_BUILD_H
#include <QWidget>
#include <QMessageBox>
#include <opencv2/core.hpp>
#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<dataPreProcessing> dp_ptr)
{
m_pDataProcess = dp_ptr;
}
//signals:
private:
Q_SLOT void onButtonClick();
//Q_SLOT void onComboxCurrentIndexChanged(const QString& modelName);
std::shared_ptr<dataPreProcessing> m_pDataProcess;
Ui::QNumTemplateBuildClass ui;
};
#endif // !NUM_TEMPLATE_BUILD_H

@ -5,32 +5,37 @@ SmokeBoxIdentification::SmokeBoxIdentification(QWidget *parent)
: QMainWindow(parent)
{
qRegisterMetaType<QVector<ImageInfo> >("QVector<ImageInfo>");
qRegisterMetaType<QMap<QString, int> >("QMap<QString,int>");
qRegisterMetaType<lightCtrl>("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);
//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();
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<dataPreProcessing>();
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;
}
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(arr, &err);
if (doc.isEmpty())
{
qWarning() << err.errorString(); //打印失败信息
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;
//}
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<CameraInfo> 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<CameraInfo> 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;
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();
}
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;
}
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<ImageInfo>& 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<ImageInfo>& vecImageInfo, i
}
}
Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector<ImageInfo>& vecImageInfo)
Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector<ImageInfo>& 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<ImageInfo>& 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<ImageInfo>& 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,7 +418,32 @@ 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)
{
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;
}
}
}
}
if (strList.at(0) == STOCK_CHECK_HEAD)
{
if (strList.length() == 7)
{
qDebug() << "开始货位盘点";
m_workMode = WorkMode::StockCheck;
@ -398,7 +455,7 @@ Q_SLOT void SmokeBoxIdentification::onDecodeMsg(const QString& msg)
stockCheckInfo.smokeQuantity = strList.at(5);
m_currtStockCheckInfo = stockCheckInfo;
}
else if (strList.length() == 3 && strList.at(0) == STOCK_CHECK_HEAD)
else if (strList.length() == 3)
{
qDebug() << "取货到位";
QString taskNum = strList.at(2);
@ -409,7 +466,10 @@ Q_SLOT void SmokeBoxIdentification::onDecodeMsg(const QString& msg)
captureTop();
}
}
else if (strList.length() == 4 && strList.at(0) == INTO_STOCK_HEAD)
}
else if (strList.at(0) == INTO_STOCK_HEAD)
{
if (strList.length() == 4)
{
qDebug() << "入库顶部拍照";
m_workMode = WorkMode::IntoStock;
@ -421,6 +481,22 @@ Q_SLOT void SmokeBoxIdentification::onDecodeMsg(const QString& msg)
captureTop();
}
}
else if (strList.at(0) == LIGHT_CONTROL_HEAD)
{
if (strList.length() == 3)
{
qDebug() << "开关灯";
if (strList.at(2) == "0")
{
emit sgControlSideLight(lightCtrl::emTurnOffLight);
}
else if (strList.at(2) == "1")
{
emit sgControlSideLight(lightCtrl::emTurnOnLight);
}
}
}
}
Q_SLOT void SmokeBoxIdentification::onNumStatistic(QString typeNum)
{
@ -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();
@ -650,3 +726,20 @@ bool SmokeBoxIdentification::matchSmokeNameAndTemplateFolderName(const QString&
qDebug() << "match smokeName and templateFolderName successed";
return true;
}
Q_SLOT void SmokeBoxIdentification::onSendEmptyCheckResults(const QMap<QString, int>& 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;
}

@ -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<ImageInfo>& 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<ImageInfo>& vecImageInfo);
Q_SLOT void onCapturedImage(const QVector<ImageInfo>& 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<QString, int>&);
//bool initCamera();
void captureTop();
void captureSide();
void saveImage(const QVector<ImageInfo>& 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<int, CameraInfo> m_mapIdCameraInfoTop;
QMap<int, CameraInfo> m_mapIdCameraInfoSide;
QMap<QString, int> m_mapSerialNumberIdTop;
QMap<QString, int> m_mapSerialNumberIdSide;
//bool m_bCamerasInit{ false };
//QMap<int, CameraInfo> m_mapIdCameraInfoTop;
//QMap<int, CameraInfo> m_mapIdCameraInfoSide;
//QMap<QString, int> m_mapSerialNumberIdTop;
//QMap<QString, int> m_mapSerialNumberIdSide;
QMap<QString, QString> m_mapSmokeCode2Name;
QMap<QString, QString> m_mapSmokeName2TemplateFolderName;
//QThread* m_pCaptureThread;
QString m_currLeftRightJudge;
QVector<QString> m_vecStrHeightLeft;
QVector<QString> m_vecStrHeightRight;
WorkMode m_workMode;
std::shared_ptr<dataPreProcessing> 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<QString> m_vecStrHeightLeft;
QVector<QString> m_vecStrHeightRight;
EmptyCheckInfo m_currtEmptyCheckInfo;
QNumTemplateBuild* m_pNumTemplateBuild{ nullptr };
//QLabel* m_pShowRltImgLabel;
Ui::SmokeBoxIdentificationClass ui;
};

@ -1,24 +1,30 @@
#ifndef COMMON_DEFINE_H
#define COMMON_DEFINE_H
#include <QtCore\qthread.h>
#include <QtCore\qmap.h>
#include <QtCore\qstring.h>
#include <QtWidgets\qtablewidget.h>
#include <QtWidgets\qdialog.h>
#include <QtGui\qevent.h>
#include <QtCore\qtimer.h>
#include <QtWidgets/QApplication>
#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:

@ -1,16 +1,15 @@
#include "lpSerialStation.h"
#include "QZkJsonParser.h"
lpSerialStation::lpSerialStation()
{
qRegisterMetaType<eSideID>("eSideID");
qRegisterMetaType<SerialErrorType>("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,54 +63,107 @@ void lpSerialStation::closeComs()
}
}
void lpSerialStation::onControlSideLight(lightCtrl mCmdData)
void lpSerialStation::onControlSideLight(lightCtrl cmdData)
{
QSharedPointer<LpSerialFrame> byteArr_ptr = QSharedPointer<LpSerialFrame>(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<QByteArray> data_ptr_)
Q_SLOT void lpSerialStation::onNewCodeScanResults(int sdID, QSharedPointer<QByteArray> data_ptr_)
{
if (!m_bStartEmptyCheck)
{
return;
}
CodeScanResults csr;
csr.sdID = sdID;
csr.ResData = *data_ptr_;
m_CodeScanResQ.enqueue(csr);
QSharedPointer<LpSerialFrame> byteArr_ptr = QSharedPointer<LpSerialFrame>(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)
{
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)
{
byteArr_ptr->data1 = 1;
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<LpSerialFrame> data_ptr = QSharedPointer<LpSerialFrame>(new LpSerialFrame);
int streetNum = m_strStreetName.toInt();
data_ptr->cmd = 0x84;
if (streetNum <= 6 && streetNum >= 1 || streetNum == 10)
{
data_ptr->data1 = 1;
}
else
{
byteArr_ptr->data2 = 1;
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<LpSerialFrame> data_ptr = QSharedPointer<LpSerialFrame>(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++)
{
@ -123,10 +175,12 @@ Q_SLOT void lpSerialStation::on_open()
}
connect(lp_serial_manager::instance(), SIGNAL(signal_data_recv(const QString&, QSharedPointer<LpSerialFrame>)),
this, SLOT(on_data_receive(const QString&, QSharedPointer<LpSerialFrame>)));
this, SLOT(onDataReceive(const QString&, QSharedPointer<LpSerialFrame>)));
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<LpSerialFrame> data_ptr_)
Q_SLOT void lpSerialStation::onDataReceive(const QString& sn, QSharedPointer<LpSerialFrame> data_ptr_)
{
qDebug() << "monitor receive data";
@ -144,7 +198,7 @@ Q_SLOT void lpSerialStation::on_data_receive(const QString& sn, QSharedPointer<L
else if (data_ptr_->data1 == 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, QSharedPointer<L
}
else if (data_ptr_->cmd == 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;
}
}

@ -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<lpSerialStation>
{
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<QByteArray>);
Q_SLOT void onNewCodeScanResults(int, QSharedPointer<QByteArray>);
signals:
void sgNewEmptyCheckResults(QSharedPointer<QByteArray>);
void sgNewEmptyCheckResults(const QMap<QString, int>&);
void sgMonitorSensorTriggerStart(eSideID);
void sgMonitorSensorTriggerStop(eSideID);
private:
Q_SLOT void on_open();
Q_SLOT void on_data_receive(const QString& sn, QSharedPointer<LpSerialFrame> data_ptr_);
Q_SLOT void onOpen();
Q_SLOT void onDataReceive(const QString& sn, QSharedPointer<LpSerialFrame> data_ptr_);
Q_SLOT void onStateChanged(const QString&, SerialErrorType);
private:
QQueue<CodeScanResults> m_CodeScanResQ;
QString m_szClientName;
QString m_szPlaneNoLeft;
QString m_szPlaneNoRight;
bool m_bStartEmptyCheck;
//QQueue<CodeScanResults> m_CodeScanResQ;
QQueue<QString> m_queueCodeLeft;
QQueue<QString> m_queueCodeRight;
bool m_bStartEmptyCheck{ false };
QMap<QString, int> m_mapEmptyLeft;
QMap<QString, int> m_mapEmptyRight;
QString m_strStreetName;
QThread* m_pobjThread;
QMap<QString, SerialParam> m_commDeviceMap;

@ -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<QVector<double>> 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<QVector<double>> 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<int> dataPreProcessing::modelPrediction()
const QString& preFilePath = strNames[fileIndex];
QVector<QVector<double>> mVec;
loadLocalDataFromFile(mVec, preFilePath);
if (winSize >= mVec[0].size()) return QVector<int>();
if (m_winSize >= mVec[0].size()) return QVector<int>();
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<int> a;
a.resize(40);*/
@ -362,14 +408,14 @@ int dataPreProcessing::modelPrediction(const QVector<QVector<double>> 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<QString, QVector<QVector<double>>> rightLeftMapValueVec = it.value();
QMultiMap<QString, QVector<QVector<double>>>::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<double> reshapedSampleVec;
@ -391,30 +437,30 @@ int dataPreProcessing::modelPrediction(const QVector<QVector<double>> vec, QStri
convertToVector(dstSampleTarShapeMat, sampleVec);
std::vector<double> sampleNewVec(sampleVec);
std::vector<double> 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<QVector<double>> vec, QStri
disMin = dis;
bestLabel = label;
}
qDebug() << "disMin: " << disMin;
//qDebug() << "disMin: " << disMin;
}
// test
@ -442,6 +488,7 @@ int dataPreProcessing::modelPrediction(const QVector<QVector<double>> 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<QVector<double>> & loadedData, QVector<double>& 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,42 +665,19 @@ 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
{
localHeightCmp = localBoxRealHeight + localBoxRealWidth;
realHeightCmp = rHeight + rWidth;
}
}
else if (suffix > 14 && suffix <= 18)
{
if (localSensorHeight <= 700)
{
localHeightCmp = localBoxRealHeight;
realHeightCmp = rHeight;
}
else if (localSensorHeight > 700 && localSensorHeight <= 900)
else if (localSensorHeight > 610 && localSensorHeight <= 870)
{
localHeightCmp = localBoxRealHeight + localBoxRealWidth;
realHeightCmp = rHeight + rWidth;
@ -652,25 +689,37 @@ bool dataPreProcessing::createSample(const QString& filePath,
}
}
else if (suffix > 18 && suffix <=20)
{
if (localSensorHeight <= 610)
{
localHeightCmp = localBoxRealHeight;
realHeightCmp = rHeight;
}
else
{
localHeightCmp = 2 * localBoxRealHeight;
realHeightCmp = 2 * rHeight;
}
else if (suffix > 20 && suffix <=24 )
}
else if (suffix > 20 && suffix <= 28)
{
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)
{
@ -690,153 +739,106 @@ bool dataPreProcessing::createSample(const QString& filePath,
}
else if (suffix > 28)
{
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 (suffix > 6 && suffix <= 10)
{
if (localSensorHeight <= 600)
{
localHeightCmp = localBoxRealType5Height;
realHeightCmp = rHeight;
}
else
{
localHeightCmp = localBoxRealType5Height + localBoxRealType5Width;
realHeightCmp = rHeight + rWidth;
}
}
else if (suffix == 11)
{
if (localSensorHeight <= 600)
{
localHeightCmp = localBoxRealType5Height;
realHeightCmp = rHeight;
}else if (localSensorHeight > 600 && localSensorHeight <=1100)
else if (typeJusge == 6)
{
localHeightCmp = localBoxRealType5Height + localBoxRealType5Width;
realHeightCmp = rHeight + rWidth;
}
else {
localHeightCmp = localBoxRealType5Height + 2*localBoxRealType5Width;
realHeightCmp = rHeight + 2*rWidth;
}
}
else if (suffix == 12)
if (suffix > 0 && suffix <= 8)
{
localHeightCmp = localBoxRealType5Height;
localHeightCmp = localBoxRealType6Height;
realHeightCmp = rHeight;
}
else if(suffix > 12 && suffix <=14)
else if (suffix > 8 && suffix <= 10)
{
if (localSensorHeight <=1200)
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 (typeJusge == 6)
{
localHeightCmp = localBoxRealType6Height;
realHeightCmp = rHeight;
}
else if (typeJusge == 7)
else
{
localHeightCmp = localBoxRealType7Height;
realHeightCmp - rHeight;
localHeightCmp = localBoxRealType6Height + 2 * localBoxRealType6Width;
realHeightCmp = rHeight + 2 * rWidth;
}
else if (typeJusge == 8)
{
if (suffix == 5 || suffix == 10)
{
localHeightCmp = localBoxRealType8Width;
realHeightCmp = rWidth;
}
else if (suffix == 15 || suffix == 20)
else if (suffix > 10 && suffix <= 16)
{
if (localSensorHeight <= 620)
if (localSensorHeight <= 565)
{
localHeightCmp = localBoxRealType8Height;
localHeightCmp = localBoxRealType6Height;
realHeightCmp = rHeight;
}
else
{
localHeightCmp = localBoxRealType8Height + localBoxRealType8Width;
realHeightCmp = rHeight + rWidth;
localHeightCmp = 2 * localBoxRealType6Height;
realHeightCmp = 2 * rHeight;
}
}
else if (suffix == 25)
else if (suffix > 16 && suffix <= 18)
{
if (localSensorHeight <= 950)
if (localSensorHeight <= 1100)
{
localHeightCmp = localBoxRealType8Height + 2 * localBoxRealType8Width;
realHeightCmp = rHeight + 2 * rWidth;
localHeightCmp = 2 * localBoxRealType6Height;
realHeightCmp = 2 * rHeight;
}
else
else if (localSensorHeight > 1100 && localSensorHeight <= 1330)
{
localHeightCmp = localBoxRealType8Height + 3 * localBoxRealType8Width;
realHeightCmp = rHeight + 3 * rWidth;
}
localHeightCmp = 2 * localBoxRealType6Height + localBoxRealType6Width;
realHeightCmp = 2 * rHeight + rWidth;
}
else if (suffix == 30)
else
{
localHeightCmp = localBoxRealType8Height;
realHeightCmp = rHeight;
localHeightCmp = 2 * localBoxRealType6Height + 2 * localBoxRealType6Width;
realHeightCmp = 2 * rHeight + 2 * rWidth;
}
}
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<QString> transDataVec;
createSample(absImagePath, tyName, mLabel, 0, width, height, transDataVec, str);
createSample(absFilePath, fileTypeName, mLabel, length, width, height, transDataVec);
auto savefile = [&](const QString& path, QVector<QString>& 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<QString>& 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)

@ -9,6 +9,8 @@
#include "cvplot.h"
#include "qdebug.h"
#include "sensorCali.h"
#include <QtWidgets/QApplication>
#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<QVector<double>> &val, const QString& _txtPath);
void loaWordFromFile(const QString& filPath, QVector<QVector<double>>& val, QString str = " ");
@ -79,6 +81,8 @@ public:
void singleMonitorVecScale(const QVector<double>& constVec, QVector<double>& 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<int> modelPrediction();
@ -118,12 +122,12 @@ public:
int rWidth,
int rHeight,
QVector<QString>& 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<QString>& vec);
@ -148,7 +152,7 @@ public:
};
private:
cv::Mat rawMat;
int winSize;
int m_winSize;
QVector<QVector<double>> m_comDecData;
QString m_szSide;
QVector<QString> m_normAndabnormDir;

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QNumTemplateBuildClass</class>
<widget class="QWidget" name="QNumTemplateBuildClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>887</width>
<height>601</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="gridLayoutWidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_length"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>宽度:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_typeNum"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>堆垛方式编号:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>卷烟编号:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBox_modelNum">
<item>
<property name="text">
<string>1-五花垛</string>
</property>
</item>
<item>
<property name="text">
<string>2-竖4横2</string>
</property>
</item>
<item>
<property name="text">
<string>3-横3竖2+2</string>
</property>
</item>
<item>
<property name="text">
<string>4-竖2+2横2</string>
</property>
</item>
<item>
<property name="text">
<string>5-竖3横2</string>
</property>
</item>
<item>
<property name="text">
<string>6-竖2横2+竖2横2</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>卷烟名称:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_width"/>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="lineEdit_height"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>高度:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>长度:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_chineseName"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>起始标志位:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="lineEdit_winSize"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>窗口大小:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="lineEdit_startRow"/>
</item>
</layout>
<zorder>lineEdit_startRow</zorder>
<zorder>lineEdit_length</zorder>
<zorder>label_5</zorder>
<zorder>lineEdit_width</zorder>
<zorder>label</zorder>
<zorder>lineEdit_typeNum</zorder>
<zorder>label_2</zorder>
<zorder>comboBox_modelNum</zorder>
<zorder>label_3</zorder>
<zorder>lineEdit_chineseName</zorder>
<zorder>label_4</zorder>
<zorder>label_6</zorder>
<zorder>lineEdit_height</zorder>
<zorder>label_7</zorder>
<zorder>lineEdit_winSize</zorder>
<zorder>label_8</zorder>
</widget>
<widget class="QWidget" name="horizontalLayoutWidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_generate">
<property name="text">
<string>生成模板</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -31,8 +31,14 @@
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="action_templateNum"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="action_templateNum">
<property name="text">
<string>数量模板</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

@ -113,6 +113,7 @@
</QtRcc>
</ItemDefinitionGroup>
<ItemGroup>
<QtUic Include="QNumTemplateBuild.ui" />
<QtUic Include="SmokeBoxIdentification.ui" />
</ItemGroup>
<ItemGroup>
@ -122,11 +123,13 @@
<ClCompile Include="..\..\src\ADModule.cpp" />
<ClCompile Include="..\..\src\CameraControl.cpp" />
<ClCompile Include="..\..\src\CategoryMatcher.cpp" />
<ClCompile Include="..\..\src\CodeScanStation.cpp" />
<ClCompile Include="..\..\src\common\log.cpp" />
<ClCompile Include="..\..\src\HikCamera.cpp" />
<ClCompile Include="..\..\src\lpSerialStation.cpp" />
<ClCompile Include="..\..\src\main.cpp" />
<ClCompile Include="..\..\src\NetControl.cpp" />
<ClCompile Include="..\..\src\QNumTemplateBuild.cpp" />
<ClCompile Include="..\..\src\SmokeBoxIdentification.cpp" />
</ItemGroup>
<ItemGroup>
@ -142,6 +145,10 @@
<QtMoc Include="..\..\src\CategoryMatcher.h" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="..\..\src\CodeScanStation.h">
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\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</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\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</IncludePath>
</QtMoc>
<ClInclude Include="..\..\src\common\commonDefine.h" />
<ClInclude Include="..\..\src\common\log.h" />
<ClInclude Include="..\..\src\common\QZkJsonParser.h" />
@ -157,6 +164,10 @@
<ClInclude Include="..\..\src\MVCameraDriver\MvSdkExport.h" />
<ClInclude Include="..\..\src\MVCameraDriver\ObsoleteCamParams.h" />
<ClInclude Include="..\..\src\MVCameraDriver\PixelType.h" />
<QtMoc Include="..\..\src\QNumTemplateBuild.h">
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\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</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\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</IncludePath>
</QtMoc>
<QtMoc Include="..\..\src\SmokeBoxIdentification.h" />
<QtMoc Include="..\..\src\NetControl.h" />
<QtMoc Include="..\..\src\lpSerialStation.h" />

@ -45,6 +45,9 @@
<QtUic Include="SmokeBoxIdentification.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="QNumTemplateBuild.ui">
<Filter>Form Files</Filter>
</QtUic>
</ItemGroup>
<ItemGroup>
<QtRcc Include="SmokeBoxIdentification.qrc">
@ -79,6 +82,12 @@
<ClCompile Include="..\..\src\common\log.cpp">
<Filter>Source Files\common</Filter>
</ClCompile>
<ClCompile Include="..\..\src\QNumTemplateBuild.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\CodeScanStation.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtMoc Include="..\..\src\ADModule.h">
@ -105,6 +114,12 @@
<QtMoc Include="..\..\src\SmokeBoxIdentification.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="..\..\src\QNumTemplateBuild.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="..\..\src\CodeScanStation.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\common\log.h">

@ -3,14 +3,14 @@
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QTDIR>C:\Qt\Qt5.9.4\5.9.4\msvc2017_64</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
<LocalDebuggerCommand>$(OutDir)\$(ProjectName)d.exe</LocalDebuggerCommand>
<LocalDebuggerCommand>$(OutDir)smokeBoxd.exe</LocalDebuggerCommand>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QTDIR>C:\Qt\Qt5.9.4\5.9.4\msvc2017_64</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
<LocalDebuggerCommand>$(OutDir)\$(ProjectName).exe</LocalDebuggerCommand>
<LocalDebuggerCommand>$(OutDir)smokeBox.exe</LocalDebuggerCommand>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
</PropertyGroup>
</Project>
Loading…
Cancel
Save