diff --git a/HanddleAI/HandleAiUi-new/CMakeLists.txt b/HanddleAI/HandleAiUi-new/CMakeLists.txt index ee908f43..21971343 100644 --- a/HanddleAI/HandleAiUi-new/CMakeLists.txt +++ b/HanddleAI/HandleAiUi-new/CMakeLists.txt @@ -41,6 +41,8 @@ endforeach() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp") +FILE(GLOB HANDLEAI_HEAD_FILES "./handleAi/*.h" ) +FILE(GLOB HANDLEAI_SRC_FILES "./handleAi/*.cpp") FILE(GLOB UIMODULE_HEAD_FILES "./uiModule/*.h" ) FILE(GLOB UIMODULE_SRC_FILES "./uiModule/*.cpp") FILE(GLOB BACK_HEAD_FILES "./back/*.h" ) @@ -73,6 +75,8 @@ if(ANDROID) ${TCP_SRC_FILES} ${UIMODULE_HEAD_FILES} ${UIMODULE_SRC_FILES} + ${HANDLEAI_HEAD_FILES} + ${HANDLEAI_SRC_FILES} ${UI_FILES} ) else() @@ -90,7 +94,9 @@ else() ${TCP_SRC_FILES} ${UIMODULE_HEAD_FILES} ${UIMODULE_SRC_FILES} - ${UI_FILES} "back/handleAiModel.h" "ff.rc" "back/fileManager.h""icon.qrc" ) + ${HANDLEAI_HEAD_FILES} + ${HANDLEAI_SRC_FILES} + ${UI_FILES} "ff.rc" "icon.qrc" ) else() add_executable( ${CURRENT_FOLDER} WIN32 ${HEAD_FILES} @@ -105,6 +111,8 @@ else() ${TCP_SRC_FILES} ${UIMODULE_HEAD_FILES} ${UIMODULE_SRC_FILES} + ${HANDLEAI_HEAD_FILES} + ${HANDLEAI_SRC_FILES} ${UI_FILES}) endif() diff --git a/HanddleAI/HandleAiUi-new/back/algorithmThread.cpp b/HanddleAI/HandleAiUi-new/back/algorithmThread.cpp index 1a0afbe1..b98fb639 100644 --- a/HanddleAI/HandleAiUi-new/back/algorithmThread.cpp +++ b/HanddleAI/HandleAiUi-new/back/algorithmThread.cpp @@ -290,10 +290,6 @@ void algoThread::getAllFiles(string path, vector& files, string format) } } -inline string getFileName(string path) -{ - return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1); -} void drawContoursOverlap(cv::Mat& image, const std::vector>& contours) { cv::Mat mask = cv::Mat::zeros(image.size(), CV_8U); diff --git a/HanddleAI/HandleAiUi-new/back/algorithmThread.h b/HanddleAI/HandleAiUi-new/back/algorithmThread.h index 25f07cb7..4501e233 100644 --- a/HanddleAI/HandleAiUi-new/back/algorithmThread.h +++ b/HanddleAI/HandleAiUi-new/back/algorithmThread.h @@ -716,7 +716,7 @@ public: { this->terminate(); } - handleAiModel* modelPtr; + //handleAiModel* modelPtr; sqlManager* sql; threadManager* tManager; sncodeCls* snDatas; @@ -736,7 +736,7 @@ public: void getAllFiles(std::string path, std::vector& files, std::string format); void Init(threadManager* threadManager) { tManager = threadManager; - modelPtr = &threadManager->models; + //modelPtr = &threadManager->models; sql = threadManager->sql; snDatas = &threadManager->snDatas; } diff --git a/HanddleAI/HandleAiUi-new/back/backEndManager.cpp b/HanddleAI/HandleAiUi-new/back/backEndManager.cpp index f6ecb96c..9cda4994 100644 --- a/HanddleAI/HandleAiUi-new/back/backEndManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/backEndManager.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include backEndManager::backEndManager() { @@ -11,6 +12,7 @@ backEndManager::backEndManager() _triggerManager = new triggerManager(); _cameraManager = new cameraManager(); _threadManager = new threadManager(); + _handleAiModelManager = new handleAiModelManager(); } void backEndManager::run() { @@ -31,6 +33,7 @@ void backEndManager::run() std::vector> futures;//异步初始化 futures.push_back(std::async(std::launch::async, &triggerManager::init, _triggerManager, this)); futures.push_back(std::async(std::launch::async, &cameraManager::init, _cameraManager, this)); + futures.push_back(std::async(std::launch::async, &handleAiModelManager::init, _handleAiModelManager,this)); for (auto& future : futures) { future.wait(); } diff --git a/HanddleAI/HandleAiUi-new/back/backEndManager.h b/HanddleAI/HandleAiUi-new/back/backEndManager.h index c9256542..f615e570 100644 --- a/HanddleAI/HandleAiUi-new/back/backEndManager.h +++ b/HanddleAI/HandleAiUi-new/back/backEndManager.h @@ -4,6 +4,7 @@ #include #include #include +class handleAiModelManager; class triggerManager; class cameraManager; class jsonConfiguration; @@ -22,6 +23,7 @@ public: triggerManager* _triggerManager = nullptr;//触发器 cameraManager* _cameraManager = nullptr;// threadManager* _threadManager = nullptr; + handleAiModelManager* _handleAiModelManager; backEndManager(); ~backEndManager(); diff --git a/HanddleAI/HandleAiUi-new/back/handleAiModel.h b/HanddleAI/HandleAiUi-new/back/handleAiModel.h deleted file mode 100644 index a298bfa2..00000000 --- a/HanddleAI/HandleAiUi-new/back/handleAiModel.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include -#include -/// -/// 模型 -/// -class handleAiModel -{ -public: - ////////模型放这里/////// - - ////////模型初始化放这里/////// - handleAiModel() - { - system("cls"); - } - ~handleAiModel() - { - } -}; \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h index 4c42b88f..4798e813 100644 --- a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h +++ b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -230,7 +230,7 @@ public: QMutex queueMutex; QQueue> detDataQueue; sqlManager* sql; - handleAiModel models;//初始化模型 + //handleAiModel models;//初始化模型 autoDelete* autoDeleteThread; QMutex insertQueueMutex; diff --git a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp b/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp new file mode 100644 index 00000000..5599066a --- /dev/null +++ b/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp @@ -0,0 +1,226 @@ +#include "sqliteReader.h" +#include +#include +#include +#include +#include + + +sqliteReader::sqliteReader(QWidget *parent) + : QMainWindow(parent) +{ + ui.setupUi(this); + readIniFile(".//config//sqliteReader.ini"); + sqlManager.initPara(); + std::vector res=sqlManager.GetTables(); + widgetInit(res); +} + +sqliteReader::~sqliteReader() +{ + sqlManager.uninitlize(); +} +void sqliteReader::widgetInit(std::vectortables) +{ + //1 + layout1 = new QVBoxLayout(); + ui.centralWidget->setLayout(layout1); + + //1-1 + QWidget* vLayout2Widget = new QWidget(); + QHBoxLayout * vLayoutt2 = new QHBoxLayout(); + vLayout2Widget->setLayout(vLayoutt2); + layout1->addWidget(vLayout2Widget); + + //1-1-1 + QLabel* vLayout2Label = new QLabel(u8"请选择日期"); + vLayoutt2->addWidget(vLayout2Label); + + QComboBox * Layou2MBox = new QComboBox(); + for (auto &data : tables) + { + Layou2MBox->addItem(QString::fromStdString(data)); + } + vLayoutt2->addWidget(Layou2MBox); + connect(Layou2MBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=]() {switchWidget(Layou2MBox->currentText().toStdString()); }); + + QLabel* vLayout2Label2 = new QLabel(u8"根据SN查询"); + vLayoutt2->addWidget(vLayout2Label2); + + QLineEdit *Layout2LEdit = new QLineEdit(); + vLayoutt2->addWidget(Layout2LEdit); + + QPushButton* layout2QPBtn = new QPushButton(u8"查询"); + vLayoutt2->addWidget(layout2QPBtn); + connect(layout2QPBtn,& QPushButton::clicked, this, [=]() {searchSN(Layou2MBox->currentText().toStdString(), Layout2LEdit->text().toStdString()); }); + //1-2 + tableWidget = new QTableWidget(); + layout1->addWidget(tableWidget); + switchWidget(Layou2MBox->currentText().toStdString()); + +} +void sqliteReader::switchWidget(std::string tableName) +{ + std::vector res = sqlManager.getAllData(tableName); + tableWidget->clear(); + delete tableWidget; + tableWidget = new QTableWidget(); + layout1->addWidget(tableWidget); + if (res.size() > 0) + { + int colsNum = res.at(0).dataVec.size() + 1 - avoidMap.size(); + tableWidget->setColumnCount(colsNum); + tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); + //for (int i = 0; i < res.at(0).dataVec.size(); i++) + { + int index = 1; + std::unordered_map::iterator it; + std::unordered_map::iterator it2; + + for (auto&data : res.at(0).dataVec) + { + it = avoidMap.find(QString::fromStdString(data.dataName)); + if (it == avoidMap.end()) + { + QString Name = QString::fromStdString(data.dataName); + it2 = cuttomName.find(Name); + if (it2 != cuttomName.end()) + Name = it2->second; + tableWidget->setHorizontalHeaderItem(index, new QTableWidgetItem(Name)); + index++; + } + } + } + //tableWidget->setColumnCount(res.size()); + for (int i = 0; i < res.size(); i++) + { + int row = tableWidget->rowCount(); + tableWidget->insertRow(row); + tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(res[i].SN))); + { + int index = 1; + std::unordered_map::iterator it; + for (auto&data : res.at(i).dataVec) + { + it = avoidMap.find(QString::fromStdString(data.dataName)); + if (it == avoidMap.end()) + { + tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText))); + index ++; + } + } + } + } + } + + //tableWidget->horizontalHeader +} +void sqliteReader::searchSN(std::string tableName, std::string SN) +{ + sqlDataStruct res = sqlManager.selectData(SN,tableName); + tableWidget->clear(); + delete tableWidget; + tableWidget = new QTableWidget(); + layout1->addWidget(tableWidget); + if (res.SN.compare(""))//非空 + { + tableWidget->setColumnCount(res.dataVec.size() - avoidMap.size()); + //tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); + { + int index = 0; + std::unordered_map::iterator it; + std::unordered_map::iterator it2; + for (auto&data : res.dataVec) + { + it = avoidMap.find(QString::fromStdString(data.dataName)); + if (it == avoidMap.end()) + { + QString Name = QString::fromStdString(data.dataName); + it2 = cuttomName.find(Name); + if (it2 != cuttomName.end()) + Name = it2->second; + tableWidget->setHorizontalHeaderItem(index, new QTableWidgetItem()); + index++; + } + } + } + + //tableWidget->setColumnCount(res.dataVec.size()); + + int row = tableWidget->rowCount(); + tableWidget->insertRow(row); + { + int index = 0; + std::unordered_map::iterator it; + for (auto&data : res.dataVec) + { + it = avoidMap.find(QString::fromStdString(data.dataName)); + if (it == avoidMap.end()) + { + tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText))); + index++; + } + } + } + } + else + { + tableWidget->setColumnCount(res.dataVec.size() + 1); + tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); + tableWidget->setColumnCount(1); + + int row = tableWidget->rowCount(); + tableWidget->insertRow(row); + tableWidget->setItem(row, 0, new QTableWidgetItem(u8"找不到该数据!")); + } + + + //tableWidget->horizontalHeader +} + +bool sqliteReader::readIniFile(const QString &filePath) { + //std::unordered_map avoiData; + //std::unordered_map cutomName; + QFile file(filePath); + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + QString currentSection; + + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); + if (line.startsWith('[') && line.endsWith(']')) { + // This line is a section header + currentSection = line.mid(1, line.length() - 2); + } + else if (!line.isEmpty() && !line.startsWith(';') && !currentSection.isEmpty()) { + // This line is a key-value pair within a section + int separatorIndex = line.indexOf('='); + if (separatorIndex != -1) { + if (!currentSection.compare("avoid")) + { + QString key = line.left(separatorIndex).trimmed(); + QString value = line.mid(separatorIndex + 1).trimmed(); + if (!value.compare("true")) + avoidMap.insert({ key, value }); + } + else if (!currentSection.compare("customName")) + { + QString key = line.left(separatorIndex).trimmed(); + QString value = line.mid(separatorIndex + 1).trimmed().toUtf8(); + cuttomName.insert({ key, value }); + } + } + } + } + + file.close(); + } + else + { + file.close(); + return false; + } + + return true; +} \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h b/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h new file mode 100644 index 00000000..e8df16aa --- /dev/null +++ b/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include "ui_sqliteReader.h" +#include "sqlControler.h" +#include +#include +#include +class sqliteReader : public QMainWindow +{ + Q_OBJECT + +public: + sqliteReader(QWidget *parent = nullptr); + ~sqliteReader(); + QVBoxLayout * layout1; + QTableWidget* tableWidget; + sqlManager sqlManager; + std::unordered_mapavoidMap;//不显示该数据 + std::unordered_mapcuttomName;//自定义列名 + void widgetInit(std::vectortables); + void switchWidget(std::string tableNam); + void searchSN(std::string tableNam,std::string SN); + bool readIniFile(const QString &filePath); +private: + Ui::sqliteReaderClass ui; +}; diff --git a/HanddleAI/HandleAiUi-new/globalStruct.h b/HanddleAI/HandleAiUi-new/globalStruct.h index 39e0d776..06c4ea49 100644 --- a/HanddleAI/HandleAiUi-new/globalStruct.h +++ b/HanddleAI/HandleAiUi-new/globalStruct.h @@ -93,5 +93,9 @@ static void cvMatToQPixMap(cv::Mat& src,QPixmap& pixmap) { pixmap = QPixmap::fromImage(cvMatToQImage(src)); } +static std::string getFileName(std::string path) +{ + return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1); +} Q_DECLARE_METATYPE(imgWidgetShowType) #pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/handleAi/handleAiModel.h b/HanddleAI/HandleAiUi-new/handleAi/handleAiModel.h new file mode 100644 index 00000000..473823ae --- /dev/null +++ b/HanddleAI/HandleAiUi-new/handleAi/handleAiModel.h @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include +#include +class handleAiModelBase +{ +public: + std::string path; + int gpuIndex =0; + std::mutex* gpuMutex; + virtual void init() {}; + virtual bool destroy() { return true; }; + virtual cv::Mat evalute() { return cv::Mat(); }; +}; +class handleAiModelSeg :public handleAiModelBase +{ +public: + handleAiModelSeg(std::string pathIn, int gpuIndexIn) + { + path = pathIn; + gpuIndex = gpuIndexIn; + }; + void init() override + { + segPtr = handdleAI::CreateSegObj((char*)path.c_str(),gpuIndex); + } + bool destroy() override + { + if (segPtr == nullptr) + return false; + handdleAI::DestroySegObj(segPtr); + return true; + } +private: + handdleAI::pSegmentation* segPtr = nullptr; +}; +class handleAiModelCls :public handleAiModelBase +{ +public: + handleAiModelCls(std::string pathIn, int gpuIndexIn) + { + path = pathIn; + gpuIndex = gpuIndexIn; + }; + void init() override + { + clsPtr = handdleAI::CreateClsObjVT((char*)path.c_str(), gpuIndex); + } + bool destroy() override + { + if (clsPtr == nullptr) + return false; + handdleAI::DestroyClsObj(clsPtr); + return true; + } +private: + handdleAI::pClassification* clsPtr; +}; + +class handleAiModelManager :public QObject +{ +public: + handleAiModelSeg* largeSeg; + handleAiModelCls* largeCls; + + handleAiModelSeg* midSeg; + handleAiModelCls* midCls; + + handleAiModelSeg* smallSeg; + handleAiModelCls* smallCls; + + ////////模型放这里/////// + handleAiModelManager() + { + gpuMutex = std::vector(gpuCnt, new std::mutex); + + largeSeg = new handleAiModelSeg("./HandleAiModels/large-seg.BHD",0); + midSeg = new handleAiModelSeg("./HandleAiModels/mid-seg.BHD", 0); + smallSeg = new handleAiModelSeg("./HandleAiModels/small-seg.BHD", 0); + + largeCls = new handleAiModelCls("./HandleAiModels/large-cls.BHD", 0); + midCls = new handleAiModelCls("./HandleAiModels/mid-cls.BHD", 0); + smallCls = new handleAiModelCls("./HandleAiModels/small_cls.BHD", 0); + + models.push_back(largeSeg); + models.push_back(midSeg); + models.push_back(smallSeg); + models.push_back(largeCls); + models.push_back(midCls); + models.push_back(smallCls); + } + ///////////END///////// + + void init(backEndManager* _backEndManagerIn) + { + return; + std::vector> futures;//异步初始化 + for(auto model: models) + { + futures.push_back(std::async(std::launch::async, &handleAiModelBase::init, model)); + emit _backEndManagerIn->sendInitString(QString::fromStdString(getFileName(model->path) + "初始化中...")); + } + int cnt = 0; + for (auto& func : futures) + { + func.wait(); + emit _backEndManagerIn->sendInitString(QString::fromStdString(getFileName(models[cnt]->path) + "成功")); + cnt++; + } + } + ~handleAiModelManager() + { + for (auto model : models) + model->destroy(); + } +private: + std::vector models; + std::vectorgpuMutex; + int gpuCnt = 1;//gpu数量 +}; +#pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/mainwindow.cpp b/HanddleAI/HandleAiUi-new/mainwindow.cpp index 80f92d0d..3435f850 100644 --- a/HanddleAI/HandleAiUi-new/mainwindow.cpp +++ b/HanddleAI/HandleAiUi-new/mainwindow.cpp @@ -221,6 +221,15 @@ void MainWindow::leftBarInit() pageWidgets.addWidget(_logWidget); pageBtns.push_back(logBtn); + toolBarButton* sqlBtn = new toolBarButton( + defaultWidth, + defaultHeight, + QIcon(":/topBar/icon/sql.png"), + u8"SQL可视化"); + //_logWidget = new logWidget(); + //pageWidgets.addWidget(_logWidget); + pageBtns.push_back(sqlBtn); + for (int index = 0; index < pageBtns.size(); index++) { layout->addWidget(pageBtns[index]); diff --git a/HanddleAI/HandleAiUi-new/mainwindow.h b/HanddleAI/HandleAiUi-new/mainwindow.h index 0e393bc2..abc9b455 100644 --- a/HanddleAI/HandleAiUi-new/mainwindow.h +++ b/HanddleAI/HandleAiUi-new/mainwindow.h @@ -58,6 +58,7 @@ private: QWidget* mainWidget; QWidget* mainWidget2; + bool isLogin = false; bool backEndInit = false; bool isMoving = false; QPoint startPos; @@ -91,26 +92,36 @@ public slots: { if (input == true) { - /*blurEffectAnimation->setStartValue(0); - blurEffectAnimation->setEndValue(20); - blurEffectAnimation->start(); - _loadingWidget.setStatus(&stackedWidgets); - stackedWidgets.setCurrentIndex(1); - blurEffectAnimation->setStartValue(20); - blurEffectAnimation->setEndValue(0); - blurEffectAnimation->start();*/ - loading(true); + if (backEndInit == true) + { + blurEffectAnimation->setStartValue(0); + blurEffectAnimation->setEndValue(20); + blurEffectAnimation->start(); + stackedWidgets.setCurrentIndex(2); + blurEffectAnimation->setStartValue(20); + blurEffectAnimation->setEndValue(0); + blurEffectAnimation->start(); + } + else + { + isLogin = true; + loading(true); + } + } + else if (input == false) + { + stackedWidgets.setCurrentIndex(0); + loading(false); } - else if(input == false)stackedWidgets.setCurrentIndex(0); } void loading(bool input) { if (input == true) { + blurEffectAnimation->setStartValue(0); blurEffectAnimation->setEndValue(20); blurEffectAnimation->start(); - //_loadingWidget.start(); stackedWidgets.setCurrentIndex(1); blurEffectAnimation->setStartValue(0); blurEffectAnimation->setEndValue(0); @@ -141,7 +152,8 @@ public slots: { case initStatus::InitOK: backEndInit = true; - loading(false); + if (isLogin == true) + loading(false); break; default: _loadingWidget.setError();