diff --git a/src/core/mission/algo/opencvPaintAlgo.hpp b/include/opencvPaintAlgo.hpp similarity index 100% rename from src/core/mission/algo/opencvPaintAlgo.hpp rename to include/opencvPaintAlgo.hpp diff --git a/src/core/mission/algo/simpleAlgo.h b/include/simpleAlgo.h similarity index 100% rename from src/core/mission/algo/simpleAlgo.h rename to include/simpleAlgo.h diff --git a/src/Core/CMakeLists.txt b/src/Core/CMakeLists.txt index 5d20828..5ea6a23 100644 --- a/src/Core/CMakeLists.txt +++ b/src/Core/CMakeLists.txt @@ -64,6 +64,8 @@ else() set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG") endif() # 生成动态库(DLL/.so/.dylib) + +FILE(GLOB CORE_HEADER_FILES "${PROJECT_ROOT_PATH}/include/core/*.h") add_library(${CURRENT_FOLDER} SHARED ${APP_HEADERPP_FILES} ${APP_HEADER_FILES} @@ -73,6 +75,7 @@ add_library(${CURRENT_FOLDER} SHARED ${WIN_RC_DIR} ${RESOURCES_DIR} ${PROJECT_ROOT_PATH}/include/qtBridge.h + ${CORE_HEADER_FILES} ) # 让外部项目可以使用库 diff --git a/src/Core/back/cameraManager.cpp b/src/Core/back/cameraManager.cpp index 32e1232..68b740c 100644 --- a/src/Core/back/cameraManager.cpp +++ b/src/Core/back/cameraManager.cpp @@ -51,7 +51,7 @@ void camera::run() data->oriImgMutex.lock(); const unsigned long long timeCode = data->timeCode; while(1){ - getCameraImg(data->oriImgs); + getCameraImg(data->oriImgs, data->imgAmountMin); if (data->oriImgs.size() >= data->imgAmountMin){ qDebug() << data->timeCode << " Min:" << data->imgAmountMin << " Get:" << data->oriImgs.size(); if (lastUpdateTime.elapsed() > 200){//显示在界面 @@ -59,10 +59,11 @@ void camera::run() for(int i = 0;i < data->oriImgs.size();i++){ QPixmap pixmap; cvMatToQPixMap(data->oriImgs[i], pixmap); - showImgPack* pack = new showImgPack(); + showImgPack* pack = new showImgPack( + cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first, + cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second + ); pack->img = pixmap; - pack->type = cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second; - pack->name = cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first; emit bridge->displayWidget_sendImg(pack); imgShowCnt++; @@ -83,7 +84,7 @@ void camera::run() } } - QThread::msleep(100); + QThread::msleep(10); } } @@ -195,17 +196,17 @@ bool cameraManager::loadModule(cameraStruct _cameraStruct) qDebug() << "[INFO] " << " module_path:" << module_path; /////// 自动拷贝重用dll - if (QString(module_path.at(module_path.size() - 1)).toInt() > 0) { + while (m_usedDllPath[module_path] == true) { //命名格式: 模块名+1/2/3... - QString path_model = module_path.mid(0, module_path.size() - 1); - if (QFile::exists(path_model + ".dll")) { + QString originalPath = "./" + moduleName; + module_path = "./" + moduleName + "-1"; + if (QFile::exists(module_path + ".dll")) { QFile::remove(module_path + ".dll"); - QFile::copy(path_model + ".dll", module_path + ".dll"); - - qDebug() << "[INFO] " << "copy dll " << module_path; } - + QFile::copy(originalPath + ".dll", module_path + ".dll"); + qDebug() << "[INFO] " << "copy dll " << module_path; } + m_usedDllPath[module_path] = true; /// 动态加载dll QLibrary* m_lib = new QLibrary(module_path); @@ -215,6 +216,7 @@ bool cameraManager::loadModule(cameraStruct _cameraStruct) { qDebug() << "[Error] " << " Loaded error:" << m_lib->errorString(); + bridge->loadingWindow_appendLog("加载相机模块" + moduleName + "失败->" + m_lib->errorString(), "red"); return false; } diff --git a/src/Core/back/cameraManager.h b/src/Core/back/cameraManager.h index 3dc7303..de826f0 100644 --- a/src/Core/back/cameraManager.h +++ b/src/Core/back/cameraManager.h @@ -1,7 +1,6 @@ #ifndef CAMERAManager_H #define CAMERAManager_H #include -#include #include #include #include @@ -12,7 +11,7 @@ #include #include #include -#include +#include #include #include //硬触发要求在触发相机前给出触发信号 @@ -72,11 +71,16 @@ public: value = task_name.toDouble(); return value; } - void getCameraImg(std::vector& mats) + void getCameraImg(std::vector& mats,int imgAmountMin) { QByteArray task_name; - if (cameraModulePtr.module_ptr->readData(mats, task_name)) - qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size(); + if (!cameraModulePtr.module_ptr->readData(mats, task_name)) { + if (mats.size() == 0) { + qDebug() << "camera_mat size 0,insert blank image"; + mats = std::vector(imgAmountMin, cv::Mat::zeros(100, 100, CV_8UC3)); + } + } + qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size(); } void setDigitalShift(float value) { @@ -115,7 +119,7 @@ class cameraManager : public serviceModule { Q_OBJECT public: - void initConfig(nlohmann::json& json, qtFuncBridge* bridgeIn) { + cameraManager(nlohmann::json& json, qtFuncBridge* bridgeIn) { bridge = bridgeIn; auto cameraJson = json["CameraSetting"]; for (auto data : cameraJson) @@ -166,6 +170,7 @@ private: std::vectorcamerasVec;//用于初始化和销毁 std::vector vec_mat;//没啥用,一直保持为空就好 QList lib_list; + std::map m_usedDllPath; public slots: void cameraTrigger(std::string Name) { diff --git a/src/Core/back/detData.h b/src/Core/back/detData.h index da0df50..657463f 100644 --- a/src/Core/back/detData.h +++ b/src/Core/back/detData.h @@ -1,20 +1,23 @@ #include #include #include -#include #include #include #include #include //#include -#include +#include +#include + //所有检测需要的数据均放在这里 +class detData; class detDataManager; class triggerManager; +using resultHandleCallback = std::function)>; class detData { public: - using resultHandleCallback = std::function)>; + std::chrono::steady_clock::time_point startTime = std::chrono::high_resolution_clock::now(); std::chrono::steady_clock::time_point getImageTime; @@ -61,17 +64,14 @@ public: std::vector< showImgPack*>resultImgShowSet; //需要存入的SQL数据 std::vector> sqlVec; - void registerResultHandleCallback(resultHandleCallback func) - { + void registerResultHandleCallback(resultHandleCallback func){ _resultHandleCallback = func; } - detData(std::string IN_cameraKeyName) - { + detData(std::string IN_cameraKeyName){ cameraKeyName = IN_cameraKeyName; imgSaveFileParameter.push_back(cameraKeyName); } - ~detData() - { + ~detData(){ for (auto& img : oriImgs) img.release(); for (auto& img : resultImgs) @@ -111,20 +111,25 @@ public: class detDataManager { public: + detDataManager(triggerManager* in_triggerManager) + :_triggerManager(in_triggerManager){ + + } std::unordered_map>map; QMutex dataMutex; std::shared_ptr insertDetData( QString IN_cameraKeyName, - std::string IN_SN, - int IN_algoThreadIndex) - { + std::string IN_SN,int imgAmountMin, + resultHandleCallback resultSolver){ + QMutexLocker locker(&dataMutex); std::shared_ptr dataPtr(new detData(IN_cameraKeyName.toStdString())); + dataPtr->triggerPtr = _triggerManager; dataPtr->SNcode = IN_SN; - dataPtr->algoThreadIndex = IN_algoThreadIndex; - + dataPtr->registerResultHandleCallback(resultSolver); + dataPtr->imgAmountMin = imgAmountMin; dataPtr->dManager = this; map.insert({ dataPtr->timeCode,dataPtr }); @@ -154,6 +159,7 @@ public: } return false; } - +private: + triggerManager* _triggerManager; }; #pragma once \ No newline at end of file diff --git a/src/Core/back/imgSaveThreadManager.cpp b/src/Core/back/imgSaveThreadManager.cpp deleted file mode 100644 index 10feed4..0000000 --- a/src/Core/back/imgSaveThreadManager.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include -//#include -//#include - -imgSaveThreadManager::imgSaveThreadManager() -{ - //path = _core._appConfig.imgSavePath; -} -imgSaveThreadManager::~imgSaveThreadManager() -{ - -} \ No newline at end of file diff --git a/src/Core/back/imgSaveThreadManager.h b/src/Core/back/imgSaveThreadManager.h index 398c6cd..a4acbb6 100644 --- a/src/Core/back/imgSaveThreadManager.h +++ b/src/Core/back/imgSaveThreadManager.h @@ -93,8 +93,10 @@ public: class imgSaveThreadManager { public: - imgSaveThreadManager(); - ~imgSaveThreadManager(); + imgSaveThreadManager(std::string pathIn) { + path = pathIn; + } + ~imgSaveThreadManager() {}; void setPath(std::string pathIn){ path = pathIn; } diff --git a/src/Core/back/manualDetThread.h b/src/Core/back/manualDetThread.h index 29ca5ac..f4633cc 100644 --- a/src/Core/back/manualDetThread.h +++ b/src/Core/back/manualDetThread.h @@ -44,21 +44,21 @@ public: for (int i = 0 ;i < filesMax;i++) { - std::shared_ptr data = _detDataManager->insertDetData("Manual", "Manual", 0); - data->algoThreadIndex = algoIndex; - data->oriImgMutex.lock(); - for(int o = 0 ; o < pathCount;o++) - { - if(i >= files[0].size()) - data->oriImgs.push_back(cv::Mat()); - else - data->oriImgs.push_back(cv::imread(files[0][i], cv::IMREAD_UNCHANGED)); - } - data->oriImgMutex.unlock(); - _threadManager->addTask(data);//添加任务 - //emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos, 1); - Pos++; - QThread::msleep(500); + //std::shared_ptr data = _detDataManager->insertDetData("Manual", "Manual", 0); + //data->algoThreadIndex = algoIndex; + //data->oriImgMutex.lock(); + //for(int o = 0 ; o < pathCount;o++) + //{ + // if(i >= files[0].size()) + // data->oriImgs.push_back(cv::Mat()); + // else + // data->oriImgs.push_back(cv::imread(files[0][i], cv::IMREAD_UNCHANGED)); + //} + //data->oriImgMutex.unlock(); + //_threadManager->addTask(data);//添加任务 + ////emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos, 1); + //Pos++; + //QThread::msleep(500); } emit finishImgReadSignal(); } diff --git a/src/Core/back/triggerManager.cpp b/src/Core/back/triggerManager.cpp index a2db3e7..d7658e4 100644 --- a/src/Core/back/triggerManager.cpp +++ b/src/Core/back/triggerManager.cpp @@ -7,12 +7,12 @@ #include #include #define debugTesting 0 -void triggerManager::initConfig(detProcess* _detProcessIn, qtFuncBridge* bridgeIn,nlohmann::json& triggerJson) +triggerManager::triggerManager(detProcess* _detProcessIn, qtFuncBridge* bridgeIn,nlohmann::json& triggerJson) { bridge = bridgeIn; _detProcess = _detProcessIn; - dManager = &_detProcessIn->_detDataManager; - _cameraManager = &_detProcessIn->_cameraManager; + dManager = _detProcessIn->_detDataManager; + _cameraManager = _detProcessIn->_cameraManager; //_threadManager = &_detProcessIn->_threadManager; //_lightSourceManager = &_detProcessIn->_lightSourceManager; readAllCmd = QByteArray::fromStdString(triggerJson["readAllCmd"]); diff --git a/src/Core/back/triggerManager.h b/src/Core/back/triggerManager.h index 8613eb6..7158538 100644 --- a/src/Core/back/triggerManager.h +++ b/src/Core/back/triggerManager.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include using triggerCallback = std::function; class cameraManager; @@ -78,7 +78,7 @@ public: this->terminate(); delete trigger; } - void initConfig(detProcess*, qtFuncBridge* bridgeIn, nlohmann::json& triggerJson); + triggerManager(detProcess*, qtFuncBridge* bridgeIn, nlohmann::json& triggerJson); bool connectHost(); void run(); void stop() @@ -150,6 +150,21 @@ public: return true; } + + //useage {"D9200_1","D9201_1"} + bool writeFloat(std::vector write_byte) { + if (trigger == nullptr) + return false; + for (auto& byteArray : write_byte) { + QByteArray array("write_float_" + byteArray); + if (!trigger->writeData(vec_mat, array) && trigger != nullptr) { + qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << array; + return false; + } + } + + return true; + } #pragma endregion int getValue(int dmPos, QByteArray byte); diff --git a/src/Core/detProcess.hpp b/src/Core/detProcess.hpp index ae59ace..26524d9 100644 --- a/src/Core/detProcess.hpp +++ b/src/Core/detProcess.hpp @@ -5,18 +5,19 @@ #include #include #include -#include - -#include +#include +#include +//#include class detProcess : public QThread { public: - detDataManager _detDataManager; // 检测数据管理器 需要初始化 - imgSaveThreadManager _imgSaveThreadManager;// 保存图像线程 需要初始化 - triggerManager _triggerManager; // 触发管理器 + detDataManager* _detDataManager; // 检测数据管理器 需要初始化 + imgSaveThreadManager* _imgSaveThreadManager;// 保存图像线程 需要初始化 + triggerManager* _triggerManager; // 触发管理器 handleAiModelManager _handleAiModelManager;// 模型管理器 - detThreadManager _threadManager; + detThreadManager* _threadManager; + cameraManager* _cameraManager; detProcess(){ //_threadManager.initialization(this); @@ -25,12 +26,14 @@ public: //_triggerManager.initialization(this); } - void initConfig(nlohmann::json& json, qtFuncBridge* bridgeIn) { + void initConfig(nlohmann::json& jsonIn, qtFuncBridge* bridgeIn) { bridge = bridgeIn; - _imgSaveThreadManager.setPath(json["imgSavePath"]); - _cameraManager.initConfig(json, bridgeIn); - _triggerManager.initConfig(this, bridgeIn, json["Triggers"]); - _threadManager.initConfig(this, bridgeIn); + json = jsonIn; + _imgSaveThreadManager = new imgSaveThreadManager(jsonIn["imgSavePath"]); + _cameraManager = new cameraManager(jsonIn, bridgeIn); + _triggerManager = new triggerManager(this, bridgeIn, jsonIn["Triggers"]); + _threadManager = new detThreadManager(this, bridgeIn); + _detDataManager = new detDataManager(_triggerManager); } bool waitrForInitResult(serviceModule* ptr, int overtimeS = 999999) { @@ -49,7 +52,7 @@ public: return true; } - cameraManager _cameraManager; // 相机管理器 + // 相机管理器 // lightSourceManager _lightSourceManager; // 光源管理器 SQLiteDB* dataBase; // hardwareMonitor _hardwareMonitor; // 硬件监控,如CPU、内存 @@ -61,36 +64,36 @@ public: void run() { #if 1 //dataBase = new SQLiteDB("generalDatabase"); - _cameraManager.start(); + _cameraManager->start(); _handleAiModelManager.start(); //_lightSourceManager.start(); - _triggerManager.start(); + _triggerManager->start(); /* _summaryData = new summaryData(&_triggerManager); */ - bool res1 = waitrForInitResult(&_cameraManager); + bool res1 = waitrForInitResult(_cameraManager); //bool res2 = waitrForInitResult(&_handleAiModelManager); - bool res3 = waitrForInitResult(&_triggerManager); + bool res3 = waitrForInitResult(_triggerManager); if (res1 == true && res3 == true) { - currentMission = new M952_15_H(); - currentMission->init( - &_cameraManager, - &_triggerManager, - &_detDataManager, - &_threadManager, + _missionLoader.loadMission(json["missionDllPath"]); + _missionLoader._misson->init( + _cameraManager, + _triggerManager, + _detDataManager, + _threadManager, dataBase, bridge ); - _threadManager.registerResultHandleCallback( + _threadManager->registerResultHandleCallback( [this](std::shared_ptr data) { detectionResultHandle(data); }); - _threadManager.registerProcessAlgoCallback( + _threadManager->registerProcessAlgoCallback( [this](std::shared_ptr data, handleAiModelManager* _handleAiModelManager) { - return currentMission->processAlgo(data, _handleAiModelManager); + return _missionLoader._misson->processAlgo(data, _handleAiModelManager); }); emit bridge->loginResult(InitOK); @@ -114,10 +117,10 @@ public: // 发回PLC数据 for (auto writeBackStr : data->writeBackData) - _triggerManager.sendFinsMsg(writeBackStr); + _triggerManager->sendFinsMsg(writeBackStr); // 异步保存检测图像 - std::async(std::launch::async, &imgSaveThreadManager::saveRes, &_imgSaveThreadManager, data); + std::async(std::launch::async, &imgSaveThreadManager::saveRes, _imgSaveThreadManager, data); // 删除数据释放资源 detDataManager* dManager = data->dManager; @@ -125,8 +128,9 @@ public: } private: + nlohmann::json json; qtFuncBridge* bridge; - mission* currentMission; + MissionLoader _missionLoader; // 任务加载器,用于加载任务配置 }; #pragma once diff --git a/src/Core/handleAi/handleAiModel.h b/src/Core/handleAi/handleAiModel.h index 0c68a23..23c129a 100644 --- a/src/Core/handleAi/handleAiModel.h +++ b/src/Core/handleAi/handleAiModel.h @@ -7,7 +7,7 @@ #include #include //#include -#include +#include class appConfig; diff --git a/src/core/back/coreStruct.h b/src/core/back/coreStruct.h new file mode 100644 index 0000000..e69de29 diff --git a/src/core/back/detThreadManager.cpp b/src/core/back/detThreadManager.cpp index 0e2653f..fe32d99 100644 --- a/src/core/back/detThreadManager.cpp +++ b/src/core/back/detThreadManager.cpp @@ -8,15 +8,11 @@ ////////////THREAD//Manager//////////////////////// -detThreadManager::detThreadManager() -{ -} - -void detThreadManager::initConfig(detProcess* _appCore, qtFuncBridge* bridgeIn) +detThreadManager::detThreadManager(detProcess* _appCore, qtFuncBridge* bridgeIn) { bridge = bridgeIn; - _imgSaveThreadManager = &_appCore->_imgSaveThreadManager; - _triggerManager = &_appCore->_triggerManager; + _imgSaveThreadManager = _appCore->_imgSaveThreadManager; + _triggerManager = _appCore->_triggerManager; //_handleAiModelManager = &_appCore->_handleAiModelManager; initFlag = true; this->start(); @@ -78,12 +74,6 @@ void detThreadManager::run() QThread::msleep(1); } } -void detThreadManager::addTask(std::shared_ptr data) -{ - insertQueueMutex.lock(); - insertQueue.enqueue(data); - insertQueueMutex.unlock(); -} detThreadManager::~detThreadManager() { runFlag = false; diff --git a/src/core/back/detThreadManager.h b/src/core/back/detThreadManager.h index 064232c..9599a78 100644 --- a/src/core/back/detThreadManager.h +++ b/src/core/back/detThreadManager.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include //#include #include #include @@ -15,7 +15,6 @@ #include #include #include -#include #include #include class detThreadManager; @@ -57,30 +56,30 @@ public: using resultHandleCallback = std::function)>; using processAlgoCallback = std::function, handleAiModelManager*)>; bool initFlag = false; - detThreadManager(); + detThreadManager(detProcess* _appCore, qtFuncBridge* bridgeIn); ~detThreadManager(); QQueue> detDataQueue; - void initConfig(detProcess* _appCore, qtFuncBridge* bridgeIn); void run(); - void stop() - { + void stop(){ runFlag = false; this->terminate(); } - void addTask(std::shared_ptr ); + void addTask(std::shared_ptr data) { + insertQueueMutex.lock(); + insertQueue.enqueue(data); + insertQueueMutex.unlock(); + } sncodeCls snDatas; QMutex queueMutex; QMutex insertQueueMutex; QQueue>insertQueue; void process(); - void registerResultHandleCallback(resultHandleCallback func) - { + void registerResultHandleCallback(resultHandleCallback func){ resultHandleCallbacks.push_back(func); } - void registerProcessAlgoCallback(processAlgoCallback func) - { + void registerProcessAlgoCallback(processAlgoCallback func){ _processAlgoCallback = func; } private: diff --git a/src/core/mission/missonBase.hpp b/src/core/back/missonBase.hpp similarity index 87% rename from src/core/mission/missonBase.hpp rename to src/core/back/missonBase.hpp index 7875fa4..3d93936 100644 --- a/src/core/mission/missonBase.hpp +++ b/src/core/back/missonBase.hpp @@ -1,7 +1,7 @@ #pragma once //#include #include -#include +#include //#include class detProcess; class mission @@ -33,6 +33,14 @@ static QString snHex(QString sn) return resultStr; } + +extern "C" +{ + __declspec(dllexport) mission* createMission(); + __declspec(dllexport) void destroyMission(mission*); +} +typedef mission* (*createMissionFunc)(); +typedef void (*destroyMissionFunc)(mission*); #pragma once diff --git a/src/core/back/missonLoader.h b/src/core/back/missonLoader.h new file mode 100644 index 0000000..f53790e --- /dev/null +++ b/src/core/back/missonLoader.h @@ -0,0 +1,31 @@ +#include + +class MissionLoader { + public: + MissionLoader() = default; + ~MissionLoader() = default; + bool loadMission(const std::string& missionPath) { + hDll = LoadLibrary(missionPath.c_str()); + if (!hDll) { + std::cerr << "Failed to load DLL!" << std::endl; + return false; + } + + createMissionFunc createMission = (createMissionFunc)GetProcAddress(hDll, "createMission"); + destroyMissionFunc destoryMission = (destroyMissionFunc)GetProcAddress(hDll, "destroyMission"); + + if (createMission && destoryMission) { + _misson = createMission(); + } + else { + std::cerr << "Failed to get function pointers!" << std::endl; + return false; + } + return true; + } + void deleteMission(const std::string& missionName) { + + } + mission* _misson = nullptr; + HMODULE hDll; +}; \ No newline at end of file diff --git a/src/Core/back/serviceModule.hpp b/src/core/back/serviceModule.h similarity index 100% rename from src/Core/back/serviceModule.hpp rename to src/core/back/serviceModule.h diff --git a/src/Core/back/summaryData.hpp b/src/core/back/summaryData.h similarity index 100% rename from src/Core/back/summaryData.hpp rename to src/core/back/summaryData.h diff --git a/src/core/sql/qSqlBase.hpp b/src/core/sql/qSqlBase.h similarity index 99% rename from src/core/sql/qSqlBase.hpp rename to src/core/sql/qSqlBase.h index b8d8cd9..9f40778 100644 --- a/src/core/sql/qSqlBase.hpp +++ b/src/core/sql/qSqlBase.h @@ -19,7 +19,7 @@ #include #include #include -#include "nlohmannJson.hpp" +#include #include #include diff --git a/src/core/struct.h b/src/core/struct.h index 59da066..d80a954 100644 --- a/src/core/struct.h +++ b/src/core/struct.h @@ -4,7 +4,6 @@ #include #include #include -#include #include struct productSignStruct { diff --git a/src/launcher/GUI/uiModule/uiModule_imageView.cpp b/src/launcher/GUI/uiModule/uiModule_imageView.cpp deleted file mode 100644 index 5b177fb..0000000 --- a/src/launcher/GUI/uiModule/uiModule_imageView.cpp +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/src/core/mission/952-11.hpp b/src/mission/952-11/952-11.hpp similarity index 98% rename from src/core/mission/952-11.hpp rename to src/mission/952-11/952-11.hpp index eb9b111..40e1b8a 100644 --- a/src/core/mission/952-11.hpp +++ b/src/mission/952-11/952-11.hpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include class M952_11 : public mission{ diff --git a/src/core/mission/algo/952DianJiao/EVE_2dAlgo.hpp b/src/mission/952-11/952DianJiao/EVE_2dAlgo.hpp similarity index 100% rename from src/core/mission/algo/952DianJiao/EVE_2dAlgo.hpp rename to src/mission/952-11/952DianJiao/EVE_2dAlgo.hpp diff --git a/src/core/mission/algo/952DianJiao/EVE_3dAlgo.hpp b/src/mission/952-11/952DianJiao/EVE_3dAlgo.hpp similarity index 100% rename from src/core/mission/algo/952DianJiao/EVE_3dAlgo.hpp rename to src/mission/952-11/952DianJiao/EVE_3dAlgo.hpp diff --git a/src/core/mission/algo/952DianJiao/EVE_3dBiaoDingAlgo.hpp b/src/mission/952-11/952DianJiao/EVE_3dBiaoDingAlgo.hpp similarity index 100% rename from src/core/mission/algo/952DianJiao/EVE_3dBiaoDingAlgo.hpp rename to src/mission/952-11/952DianJiao/EVE_3dBiaoDingAlgo.hpp diff --git a/src/mission/952-11/CMakeLists.txt b/src/mission/952-11/CMakeLists.txt new file mode 100644 index 0000000..a4b4bed --- /dev/null +++ b/src/mission/952-11/CMakeLists.txt @@ -0,0 +1,71 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/952_15_H_25D/952_15_H_25D.cpp b/src/mission/952_15_H_25D/952_15_H_25D.cpp new file mode 100644 index 0000000..9bbb741 --- /dev/null +++ b/src/mission/952_15_H_25D/952_15_H_25D.cpp @@ -0,0 +1,8 @@ +#include <952_15_H_25D.h> + +mission* createMission() { + return new M952_15_H(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/core/mission/952-15-H.h b/src/mission/952_15_H_25D/952_15_H_25D.h similarity index 94% rename from src/core/mission/952-15-H.h rename to src/mission/952_15_H_25D/952_15_H_25D.h index a4f4f77..2b2133f 100644 --- a/src/core/mission/952-15-H.h +++ b/src/mission/952_15_H_25D/952_15_H_25D.h @@ -1,10 +1,12 @@ -#include -#include -#include -#include +#include +#include +#include +#include +//#include #include #include -#include +#include + struct M952_15_H_summaryData { QString LT_Distance = "-1"; @@ -55,12 +57,12 @@ public: int snPos = 9300; _triggerManager->writeShort({ "D9200_0","D9201_1","D9202_1" }); std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); - std::shared_ptr data = _detDataManager->insertDetData("2.5D-H-1", sn, 0); - data->registerResultHandleCallback([this](std::shared_ptr data) { + std::shared_ptr data = + _detDataManager->insertDetData("2.5D-H-1",sn, 3, + ([this](std::shared_ptr data) { HouDuan12ResultHandle(data); - }); - data->triggerPtr = _triggerManager; - data->imgAmountMin = 3; + })); + data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; @@ -85,12 +87,12 @@ public: int snPos = 9700; _triggerManager->writeShort({"D9600_0","D9601_1","D9602_1"}); std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); - std::shared_ptr data = _detDataManager->insertDetData("2.5D-H-2", sn, 0); - data->registerResultHandleCallback([this](std::shared_ptr data) { + std::shared_ptr data = + _detDataManager->insertDetData("2.5D-H-2", sn, 3, + [this](std::shared_ptr data) { HouDuan12ResultHandle(data); }); - data->triggerPtr = _triggerManager; - data->imgAmountMin = 3; + data->algoThreadIndex = 0; qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; std::cout << "通道2 SN:" << sn << "检测开始" << std::endl; @@ -239,4 +241,8 @@ private: detThreadManager* _threadManager; }; + + + + #pragma once \ No newline at end of file diff --git a/src/mission/952_15_H_25D/CMakeLists.txt b/src/mission/952_15_H_25D/CMakeLists.txt new file mode 100644 index 0000000..76bbff3 --- /dev/null +++ b/src/mission/952_15_H_25D/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/back + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/qtBridge.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/core/mission/algo/952HouDuan/EVE_952_15_H_Algo.hpp b/src/mission/952_15_H_25D/EVE_952_15_H_Algo.hpp similarity index 99% rename from src/core/mission/algo/952HouDuan/EVE_952_15_H_Algo.hpp rename to src/mission/952_15_H_25D/EVE_952_15_H_Algo.hpp index f102c42..ce4bf46 100644 --- a/src/core/mission/algo/952HouDuan/EVE_952_15_H_Algo.hpp +++ b/src/mission/952_15_H_25D/EVE_952_15_H_Algo.hpp @@ -1,7 +1,6 @@ #include #include #include -#include #include using namespace HDevEngineCpp; diff --git a/src/mission/952_15_Q_25D/952_15_H_25D.cpp b/src/mission/952_15_Q_25D/952_15_H_25D.cpp new file mode 100644 index 0000000..9bbb741 --- /dev/null +++ b/src/mission/952_15_Q_25D/952_15_H_25D.cpp @@ -0,0 +1,8 @@ +#include <952_15_H_25D.h> + +mission* createMission() { + return new M952_15_H(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/952_15_Q_25D/952_15_H_25D.h b/src/mission/952_15_Q_25D/952_15_H_25D.h new file mode 100644 index 0000000..2b2133f --- /dev/null +++ b/src/mission/952_15_Q_25D/952_15_H_25D.h @@ -0,0 +1,248 @@ +#include +#include +#include +#include +//#include +#include +#include +#include + +struct M952_15_H_summaryData +{ + QString LT_Distance = "-1"; + QString RT_Distance = "-1"; + QString LD_Distance = "-1"; + QString RD_Distance = "-1"; + QString L_Duiqidu = "-1"; + QString R_Duiqidu = "-1"; +}; +class M952_15_H : public mission { +public: + summaryData _summaryData; + bool init(cameraManager* _cameraManagerPtr, + triggerManager* _triggerManagerPtr, + detDataManager* _detDataManagerPtr, + detThreadManager* _threadManagerPtr, + SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { + bridge = bridgeIn; + _cameraManager = _cameraManagerPtr; + _triggerManager = _triggerManagerPtr; + _detDataManager = _detDataManagerPtr; + _threadManager = _threadManagerPtr; + + _25DCamera_1 = _cameraManager->getCamera("25D-1"); + if (_25DCamera_1 == nullptr) { + std::cout << "camera ->> 25D-1 not found" << std::endl; + return false; + } + + _25DCamera_2 = _cameraManager->getCamera("25D-2"); + if (_25DCamera_2 == nullptr){ + std::cout << "camera ->> 25D-2 not found" << std::endl; + return false; + } + + _triggerManager->registerCallback(9200, 1, [this](QByteArray& byteArray) {HouDuan1(byteArray); }, "25D-1拍照触发"); + _triggerManager->registerCallback(9600, 1, [this](QByteArray& byteArray) {HouDuan2(byteArray); }, "25D-2拍照触发"); + + _triggerManager->registerCallback(9400, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "25D-1结果获取触发"); + _triggerManager->registerCallback(9800, 1, [this](QByteArray& byteArray) {sumRequest2(byteArray); }, "25D-2结果获取触发"); + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl"); + return true; + } + //9200 1 + bool houduan1SecondTime = false; + void HouDuan1(QByteArray& byteArray){ + int snPos = 9300; + _triggerManager->writeShort({ "D9200_0","D9201_1","D9202_1" }); + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _detDataManager->insertDetData("2.5D-H-1",sn, 3, + ([this](std::shared_ptr data) { + HouDuan12ResultHandle(data); + })); + + data->algoThreadIndex = 0; + qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-1 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; + std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; + ////////拍照//////////////// + _25DCamera_1->captureImage(data); + //data->oriImgs.push_back(cv::imread("D:/952Code/2025-06-04-1752578989220/2.5D-H-1_2025-06-04-1752578989220__17-41-08-45_Count0.bmp", -1)); + //data->oriImgs.push_back(cv::imread("D:/952Code/2025-06-04-1752578989220/2.5D-H-1_2025-06-04-1752578989220__17-41-08-45_Count1.bmp", -1)); + //data->oriImgs.push_back(cv::imread("D:/952Code/2025-06-04-1752578989220/2.5D-H-1_2025-06-04-1752578989220__17-41-08-45_Count2.bmp", -1)); + //data->imgSaveFileParameter.push_back(sn); + //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); + if(houduan1SecondTime == false) + data->resultImgShowSet.push_back(new showImgPack("后段1-1", "结果图")); + else + data->resultImgShowSet.push_back(new showImgPack("后段1-2", "结果图")); + houduan1SecondTime = !houduan1SecondTime; + _threadManager->addTask(data); + } + + //9600 1 + bool houduan2SecondTime = false; + void HouDuan2(QByteArray& byteArray){ + int snPos = 9700; + _triggerManager->writeShort({"D9600_0","D9601_1","D9602_1"}); + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _detDataManager->insertDetData("2.5D-H-2", sn, 3, + [this](std::shared_ptr data) { + HouDuan12ResultHandle(data); + }); + + data->algoThreadIndex = 0; + qDebug() << "[ Station 10 ] " << QString::fromUtf8("2.5D-2 后段检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; + std::cout << "通道2 SN:" << sn << "检测开始" << std::endl; + _25DCamera_2->captureImage(data); + data->imgSaveFileParameter.push_back(sn); + //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); + if (houduan2SecondTime == false) + data->resultImgShowSet.push_back(new showImgPack("后段2-1", "结果图")); + else + data->resultImgShowSet.push_back(new showImgPack("后段2-2", "结果图")); + houduan2SecondTime = !houduan2SecondTime; + _threadManager->addTask(data); + } + + void HouDuan12ResultHandle(std::shared_ptr data){ + //发送图片 + if (data->resultImgs.size() > 0){ + for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){ + showImgPack* pack = data->resultImgShowSet[std::min(i, (int)data->resultImgShowSet.size() - 1)]; + QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]); + pack->img = pixmap; + emit bridge->displayWidget_sendImg(pack); + pixmap = QPixmap(); + } + } + //结果数据保存 + if (data->resultData.size() > 0){ + std::string sn = data->SNcode; + try { + M952_15_H_summaryData* dataPtr = _summaryData.get(sn); + dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); + dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); + dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); + dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); + dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); + dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); + + if (data->cameraKeyName == "2.5D-H-1") { + emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); + emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); + emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); + emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); + emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + } + else{ + emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); + emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); + emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); + emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); + emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + + } + + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + } + else { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; + } + + + + //9400 1 Summary1 + void sumRequest1(QByteArray& byteArray) + { + _triggerManager->sendFinsMsg("write_short_D9400_0"); + _triggerManager->sendFinsMsg("write_short_D9402_1"); + _triggerManager->sendFinsMsg("write_short_D9404_1"); + int snPos = 9500; + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + M952_15_H_summaryData* dataPtr = _summaryData.get(sn); + _triggerManager->sendFinsMsg("write_float_D9410_"+ dataPtr->RT_Distance);//右上留白 + _triggerManager->sendFinsMsg("write_float_D9412_" + dataPtr->RD_Distance);//右下留白 + _triggerManager->sendFinsMsg("write_float_D9414_" + dataPtr->R_Duiqidu);//右对其度 + + _triggerManager->sendFinsMsg("write_float_D9436_" + dataPtr->RT_Distance);//左上留白 + _triggerManager->sendFinsMsg("write_float_D9438_" + dataPtr->RD_Distance);//左下留白 + _triggerManager->sendFinsMsg("write_float_D9440_" + dataPtr->R_Duiqidu);//左对其度 + std::cout << "通道1 SN:" << sn << " 发送结果" << std::endl;//:\n左留白->" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString()<sendFinsMsg("write_short_D9800_0"); + _triggerManager->sendFinsMsg("write_short_D9802_1"); + _triggerManager->sendFinsMsg("write_short_D9804_1"); + int snPos = 9900; + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + M952_15_H_summaryData* dataPtr = _summaryData.get(sn); + _triggerManager->sendFinsMsg("write_float_D9810_" + dataPtr->RT_Distance);//右上留白 + _triggerManager->sendFinsMsg("write_float_D9812_" + dataPtr->RD_Distance);//右下留白 + _triggerManager->sendFinsMsg("write_float_D9814_" + dataPtr->R_Duiqidu);//右对其度 + + _triggerManager->sendFinsMsg("write_float_D9836_" + dataPtr->RT_Distance);//左上留白 + _triggerManager->sendFinsMsg("write_float_D9838_" + dataPtr->RD_Distance);//左下留白 + _triggerManager->sendFinsMsg("write_float_D9840_" + dataPtr->R_Duiqidu);//左对其度 + std::cout << "通道2 SN:" << sn << " 获取结果"<" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString() << std::endl; + _summaryData.remove(sn); + } + bool processAlgo(std::shared_ptr data, handleAiModelManager* _handleAiModelManager) + { + try + { + data->algoStartTime = std::chrono::high_resolution_clock::now(); + _952_15_H_Algo(data); + data->algoEndTime = std::chrono::high_resolution_clock::now(); + return true; + } + catch (HDevEngineCpp::HDevEngineException& ex) { + std::cerr << "HDevEngineException: " << ex.Message() << std::endl; + qDebug() << "HDevEngineException: " << ex.Message(); + } + catch (HException& ex) { + // 捕获Halcon异常 + std::cerr << "Halcon Exception Caught!" << std::endl; + std::cerr << "Error Code: " << ex.ErrorCode() << std::endl; + std::cerr << "Error Message: " << ex.ErrorMessage() << std::endl; + + qDebug() << "Halcon Exception Caught!"; + qDebug() << "Error Code: " << ex.ErrorCode(); + qDebug() << "Error Message: " << ex.ErrorMessage(); + } + catch (const std::exception& e) + { + std::cerr << "Caught exception: " << e.what() << std::endl; + qDebug() << "Caught exception: " << e.what(); + return false; + } + return false; + } + +private: + + camera* _25DCamera_1 = nullptr, * _25DCamera_2 = nullptr; + qtFuncBridge* bridge; + cameraManager* _cameraManager; + triggerManager* _triggerManager; + detDataManager* _detDataManager; + detThreadManager* _threadManager; +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/952_15_Q_25D/CMakeLists.txt b/src/mission/952_15_Q_25D/CMakeLists.txt new file mode 100644 index 0000000..76bbff3 --- /dev/null +++ b/src/mission/952_15_Q_25D/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/back + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/qtBridge.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/952_15_Q_25D/EVE_952_15_H_Algo.hpp b/src/mission/952_15_Q_25D/EVE_952_15_H_Algo.hpp new file mode 100644 index 0000000..ce4bf46 --- /dev/null +++ b/src/mission/952_15_Q_25D/EVE_952_15_H_Algo.hpp @@ -0,0 +1,110 @@ +#include +#include +#include +#include +using namespace HDevEngineCpp; + +static void _952_15_H_Algo(std::shared_ptr data) +{ + qDebug() << "SN" << QString::fromStdString(data->SNcode)<< "algo start"; + HDevEngineCpp::HDevProcedure proc("Cal_LouBai_Distance"); + HDevProcedureCall procedureCall(proc); + + ///////////////////取图//处理////////////////// + if (data->oriImgs.size() != 3 ) + { + qCritical() << "图片数量不满足要求:" << data->oriImgs.size(); + return; + } + + cv::Mat Paint; + clock_t start, finish; + start = clock(); + + cv::Mat src1 = data->oriImgs[1]; + cv::Mat src2 = data->oriImgs[0]; + src1.copyTo(Paint); + + if (Paint.channels() != 3) + cv::cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + HObject in_Image1 = MatToHObject(src1); + HObject in_Image2 = MatToHObject(src2); + procedureCall.SetInputIconicParamObject("in_Image1", in_Image1); + procedureCall.SetInputIconicParamObject("in_Image2", in_Image2); + procedureCall.SetInputCtrlParamTuple("in_xResolution", HTuple(0.0323938)); + procedureCall.SetInputCtrlParamTuple("in_yResolution", HTuple(0.0366128)); + procedureCall.Execute(); + + HTuple out_Distance, out_ResultRows, out_ResultCols, out_Flag, out_LinePonit; + + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance"); + //out_RightDistance = procedureCall.GetOutputCtrlParamTuple("out_RightDistance"); + out_ResultRows = procedureCall.GetOutputCtrlParamTuple("out_ResultRows"); + out_ResultCols = procedureCall.GetOutputCtrlParamTuple("out_ResultCols"); + + //out_Angle = procedureCall.GetOutputCtrlParamTuple("out_Angle"); + out_LinePonit = procedureCall.GetOutputCtrlParamTuple("out_LinePonit"); + + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + + int algoFlag = out_Flag.D(); + double LT_Distance = -1, RT_Distance = -1, LD_Distance = -1, RD_Distance = -1, L_Duiqidu = -1 ,R_Duiqidu = -1; + if (algoFlag == 1) // 算法OK + { + LT_Distance = out_Distance[0].D() + 0.86;//左上 + putTextZH(Paint, "左上留白:" + std::to_string(LT_Distance), cv::Point(100, 100), 150, cv::Scalar(0, 255, 0)); + + RT_Distance = out_Distance[1].D() + 0.52;//右上 + putTextZH(Paint, "右上留白:" + std::to_string(RT_Distance), cv::Point(100, 250), 150, cv::Scalar(0, 255, 0)); + + LD_Distance = out_Distance[2].D() + 0.86;//左下 + putTextZH(Paint, "左下留白:" + std::to_string(LD_Distance), cv::Point(100, 400), 150, cv::Scalar(0, 255, 0)); + + RD_Distance = out_Distance[3].D() + 0.52;//右下 + putTextZH(Paint, "右下留白:" + std::to_string(RD_Distance), cv::Point(100, 550), 150, cv::Scalar(0, 255, 0)); + + int outPointRowsLength = out_ResultRows.Length(); + for (int i = 0; i < outPointRowsLength; i++) + Cross(Paint, + cv::Point(out_ResultCols[i].D(), out_ResultRows[i].D()), + 3, 2, cv::Scalar(0, 0, 255)); + + //duiqidu = out_Angle.D(); + L_Duiqidu = std::abs(LT_Distance - LD_Distance); + putTextZH(Paint, "左对齐度:" + std::to_string(L_Duiqidu), cv::Point(100, 700), 150, cv::Scalar(0, 255, 0)); + R_Duiqidu = std::abs(RT_Distance - RD_Distance); + putTextZH(Paint, "右对齐度:" + std::to_string(R_Duiqidu), cv::Point(100, 850), 150, cv::Scalar(0, 255, 0)); + int out_LinePonitLength = out_LinePonit.Length() / 4; + for (int i = 0; i < out_LinePonitLength; i++) + line(Paint, + cv::Point(out_LinePonit[i * 4 + 1].D(), out_LinePonit[i * 4].D()), + cv::Point(out_LinePonit[i * 4 + 3].D(), out_LinePonit[i * 4 + 2].D()), + cv::Scalar(0, 0, 255) , 3); + + data->halconOK = true; + } + else // 算法异常 + { + putTextZH(Paint, "算法异常", + cv::Point(100, 100), 300 , cv::Scalar(0, 0, 255)); + + data->halconOK = false; + } + data->resultImgs.push_back(Paint); + + + //data->resultImgs.push_back(Paint); + // data->sqlVec.push_back({ "Gluewidth",std::to_string(Gluewidth) }); + // data->sqlVec.push_back({ "_2dResult",std::to_string(result) }); + // qDebug() << "[Debug]2D Data:" << "hv_out_Gluewidth ::" << QString::number(Gluewidth) << ",Result" << QString::number(result); + data->resultData.insert(std::make_pair("LT_Distance", LT_Distance)); + data->resultData.insert(std::make_pair("RT_Distance", RT_Distance)); + data->resultData.insert(std::make_pair("LD_Distance", LD_Distance)); + data->resultData.insert(std::make_pair("RD_Distance", RD_Distance)); + data->resultData.insert(std::make_pair("L_Duiqidu", L_Duiqidu)); + data->resultData.insert(std::make_pair("R_Duiqidu", R_Duiqidu)); + finish = clock(); + qDebug() << "[Debug]2D useTime:" << finish - start << "ms"; +} +#pragma once diff --git a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.cpp b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.cpp new file mode 100644 index 0000000..6c80b29 --- /dev/null +++ b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.cpp @@ -0,0 +1,8 @@ +#include <952_15_Q_2D3D_1.h> + +mission* createMission() { + return new _952_15_Q_2D3D_1(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h new file mode 100644 index 0000000..d41797c --- /dev/null +++ b/src/mission/952_15_Q_2D3D/952_15_Q_2D3D_1.h @@ -0,0 +1,285 @@ +#include +#include +#include +#include +//#include +#include +#include +//#include <952HouDuan/EVE_952_15_H_Algo.hpp> + +#define _952_15_Q_2D3D_channel_switch 0 //通道切换 + +#if _952_15_Q_2D3D_channel_switch == 0 +const std::string _2D_P_Camera_Name = "2D-P-1 (24488341)"; +const std::string _2D_N_Camera_Name = "2D-N-1 (24488402)"; +const std::string _3D_1_Camera_Name = "162762"; + +const int _2D_P_triggerPos = 8010; +const std::vector _2D_P_triggerReply = { "D8010_0", "D8011_1", "D8012_1" }; +const int _2D_P_snPos = 8200; +const QString _2D_P_viewName = "通道1-2D正极"; + +const int _2D_N_triggerPos = 8020; +const std::vector _2D_N_triggerReply = { "D8020_0", "D8021_1", "D8022_1" }; +const int _2D_N_snPos = 8300; +const QString _2D_N_viewName = "通道1-2D负极"; + +const int _3D_triggerPos = 8030; +const std::vector _3D_triggerReply = { "D8030_0","D8031_1","D8032_1" }; +const int _3D_snPos = 8400; +const QString _3D_P_viewName = "通道1-3D"; + +const int _summary_triggerPos = 8040; +#elif _952_15_Q_2D3D_channel_switch == 1 +const std::string _2D_P_Camera_Name = "2D-P-2 (24488342)"; +const std::string _2D_N_Camera_Name = "2D-N-2 (24488458)"; +const std::string _3D_1_Camera_Name = "156112"; + +const int _2D_P_triggerPos = 8060; +const std::vector _2D_P_triggerReply = { "D8060_0", "D8061_1", "D8062_1" }; +const int _2D_P_snPos = 8700; +const QString _2D_P_viewName = "通道2-2D正极"; + +const int _2D_N_triggerPos = 8070; +const std::vector _2D_N_triggerReply = { "D8070_0", "D8071_1", "D8072_1" }; +const int _2D_N_snPos = 8800; +const QString _2D_N_viewName = "通道2-2D负极"; + +const int _3D_triggerPos = 8080; +const std::vector _3D_triggerReply = { "D8080_0","D8081_1","D8082_1" }; +const int _3D_snPos = 8900; +const QString _3D_P_viewName = "通道2-3D"; + +const int _summary_triggerPos = 8090; +#endif +struct _952_15_Q_2D3D_1_summaryData +{ + QString _2D_P_Result = "-1"; + QString _2D_N_Result = "-1"; + QString _3D_1_Result = "-1"; +}; +class _952_15_Q_2D3D_1 : public mission { +public: + summaryData<_952_15_Q_2D3D_1_summaryData> _summaryData; + bool init(cameraManager* _cameraManagerPtr, + triggerManager* _triggerManagerPtr, + detDataManager* _detDataManagerPtr, + detThreadManager* _threadManagerPtr, + SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) { + bridge = bridgeIn; + _cameraManager = _cameraManagerPtr; + _triggerManager = _triggerManagerPtr; + _detDataManager = _detDataManagerPtr; + _threadManager = _threadManagerPtr; + + _2DCamera_P = _cameraManager->getCamera(_2D_P_Camera_Name); + if (_2DCamera_P == nullptr) { + std::cout << "camera ->> " << _2D_P_Camera_Name <<" not found" << std::endl; + return false; + } + + _2DCamera_N = _cameraManager->getCamera(_2D_N_Camera_Name); + if (_2DCamera_N == nullptr) { + std::cout << "camera ->> " << _2D_N_Camera_Name <<" not found" << std::endl; + return false; + } + + _3DCamera_1 = _cameraManager->getCamera(_3D_1_Camera_Name); + if (_3DCamera_1 == nullptr){ + std::cout << "camera ->> " << _3D_1_Camera_Name <<" not found" << std::endl; + return false; + } + + _triggerManager->registerCallback(_2D_P_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_P(byteArray); }, "2D_1拍照触发"); + _triggerManager->registerCallback(_2D_N_triggerPos, 1, [this](QByteArray& byteArray) {Qian_2D_N(byteArray); }, "2D_2拍照触发"); + _triggerManager->registerCallback(_3D_triggerPos, 1, [this](QByteArray& byteArray) {Qian_3D_1(byteArray); }, "3D拍照触发"); + + _triggerManager->registerCallback(_summary_triggerPos, 1, [this](QByteArray& byteArray) {sumRequest1(byteArray); }, "结果获取触发"); + //HDevEngineCpp::HDevEngine myEngine; + //myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl"); + return true; + } + //8010 1 + void Qian_2D_P(QByteArray& byteArray){ + int snPos = _2D_P_snPos; + _triggerManager->writeShort(_2D_P_triggerReply); + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _detDataManager->insertDetData("Qian_2D_P",sn, 3, + ([this](std::shared_ptr data) { + HouDuan12ResultHandle(data); + })); + + data->algoThreadIndex = 0; + qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; + std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; + ////////拍照//////////////// + _2DCamera_P->captureImage(data); + //data->imgSaveFileParameter.push_back(sn); + //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); + data->resultImgShowSet.push_back(new showImgPack("通道1-2D正极", "结果图")); + _threadManager->addTask(data); + } + + //8020 1 + void Qian_2D_N(QByteArray& byteArray) { + int snPos = _2D_N_snPos; + _triggerManager->writeShort(_2D_N_triggerReply); + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _detDataManager->insertDetData("Qian_2D_N", sn, 1, + ([this](std::shared_ptr data) { + HouDuan12ResultHandle(data); + })); + + data->algoThreadIndex = 0; + qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; + std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; + ////////拍照//////////////// + _2DCamera_N->captureImage(data); + //data->imgSaveFileParameter.push_back(sn); + //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); + data->resultImgShowSet.push_back(new showImgPack("通道1-2D负极", "结果图")); + _threadManager->addTask(data); + } + + //8030 1 + void Qian_3D_1(QByteArray& byteArray) { + int snPos = _3D_snPos; + _triggerManager->writeShort(_3D_triggerReply); + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + std::shared_ptr data = + _detDataManager->insertDetData("Qian_3D", sn, 2, + ([this](std::shared_ptr data) { + HouDuan12ResultHandle(data); + })); + + data->algoThreadIndex = 0; + qDebug() << "[ Station 10 ] " << QString::fromUtf8("_2DCamera_P 检测开始 timeCode :") << data->timeCode << data->timeCode << "SN" << QString::fromStdString(sn);; + std::cout << "通道1 SN:" << sn << "检测开始" << std::endl; + ////////拍照//////////////// + _3DCamera_1->captureImage(data); + //data->imgSaveFileParameter.push_back(sn); + //data->imgSaveFileParameter.push_back(_core._detGlobalData.productTypeStr); + data->resultImgShowSet.push_back(new showImgPack("通道1-3D", "结果图")); + _threadManager->addTask(data); + } + + void HouDuan12ResultHandle(std::shared_ptr data){ + //发送图片 + if (data->resultImgs.size() > 0){ + for (int i = 0; i < data->resultImgs.size() && i < data->resultImgShowSet.size(); i++){ + showImgPack* pack = data->resultImgShowSet[std::min(i, (int)data->resultImgShowSet.size() - 1)]; + QPixmap pixmap = cvMatToQPixMap(data->resultImgs[i]); + pack->img = pixmap; + emit bridge->displayWidget_sendImg(pack); + pixmap = QPixmap(); + } + } + //结果数据保存 + if (data->resultData.size() > 0){ + std::string sn = data->SNcode; + try { + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + // dataPtr->LT_Distance = data->resultData["LT_Distance"].toString(); + //dataPtr->RT_Distance = data->resultData["RT_Distance"].toString(); + // dataPtr->LD_Distance = data->resultData["LD_Distance"].toString(); + // dataPtr->RD_Distance = data->resultData["RD_Distance"].toString(); + // dataPtr->L_Duiqidu = data->resultData["L_Duiqidu"].toString(); + // dataPtr->R_Duiqidu = data->resultData["R_Duiqidu"].toString(); + + // if (data->cameraKeyName == "2.5D-H-1") { + // emit bridge->summaryData_addData("后段1-左上留白", data->resultData["LT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-右上留白", data->resultData["RT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-左下留白", data->resultData["LD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-右下留白", data->resultData["RD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段1-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + // emit bridge->summaryData_addData("后段1-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + // } + // else{ + // emit bridge->summaryData_addData("后段2-左上留白", data->resultData["LT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-右上留白", data->resultData["RT_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-左下留白", data->resultData["LD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-右下留白", data->resultData["RD_Distance"].toDouble()); + // emit bridge->summaryData_addData("后段2-左对齐度", data->resultData["L_Duiqidu"].toDouble()); + // emit bridge->summaryData_addData("后段2-右对齐度", data->resultData["R_Duiqidu"].toDouble()); + // + // } + + } + catch (...) { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据异常 SN:") << QString::fromStdString(data->SNcode); + } + } + else { + qDebug() << "[ Station 10 ] " << QString::fromUtf8("后段检测结果数据为空 SN:") << QString::fromStdString(data->SNcode); + } + std::cout << "SN:" << data->SNcode << "检测结束 结果获取完成" << std::endl; + } + + //8040 1 Summary1 + void sumRequest1(QByteArray& byteArray){ + _triggerManager->writeShort({ "D8040_0" ,"D9402_1","D9404_1"}); + int snPos = 9500; + std::string sn = _triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1); + _952_15_Q_2D3D_1_summaryData* dataPtr = _summaryData.get(sn); + _triggerManager->sendFinsMsg("write_float_D8046_"+ dataPtr->_2D_P_Result);//右上留白 + _triggerManager->sendFinsMsg("write_float_D8047_" + dataPtr->_2D_N_Result);//右下留白 + _triggerManager->sendFinsMsg("write_float_D8048_" + dataPtr->_3D_1_Result);//右对其度 + + std::cout << "通道1 SN:" << sn << " 发送结果" << std::endl;//:\n左留白->" << dataPtr->leftLiuBai.toStdString() << "\n右留白->" << dataPtr->rightLiuBai.toStdString() << "\n对其度->" << dataPtr->duiqidu.toStdString()< data, handleAiModelManager* _handleAiModelManager){ + cv::Mat testImg; + if(data->oriImgs[0].channels() == 1) + cv::cvtColor(data->oriImgs[0], testImg, cv::COLOR_GRAY2BGR); + cv::putText(testImg, "result test", cv::Point(200, 200), + 1, 10,cv::Scalar(0,255,0),4); + data->resultImgs.push_back(testImg); + //try + //{ + // data->algoStartTime = std::chrono::high_resolution_clock::now(); + // _952_15_H_Algo(data); + // data->algoEndTime = std::chrono::high_resolution_clock::now(); + // return true; + //} + //catch (HDevEngineCpp::HDevEngineException& ex) { + // std::cerr << "HDevEngineException: " << ex.Message() << std::endl; + // qDebug() << "HDevEngineException: " << ex.Message(); + //} + //catch (HException& ex) { + // // 捕获Halcon异常 + // std::cerr << "Halcon Exception Caught!" << std::endl; + // std::cerr << "Error Code: " << ex.ErrorCode() << std::endl; + // std::cerr << "Error Message: " << ex.ErrorMessage() << std::endl; + + // qDebug() << "Halcon Exception Caught!"; + // qDebug() << "Error Code: " << ex.ErrorCode(); + // qDebug() << "Error Message: " << ex.ErrorMessage(); + //} + //catch (const std::exception& e) + //{ + // std::cerr << "Caught exception: " << e.what() << std::endl; + // qDebug() << "Caught exception: " << e.what(); + // return false; + //} + return false; + } + +private: + + camera* _2DCamera_P = nullptr, * _2DCamera_N = nullptr, * _3DCamera_1 = nullptr; + qtFuncBridge* bridge; + cameraManager* _cameraManager; + triggerManager* _triggerManager; + detDataManager* _detDataManager; + detThreadManager* _threadManager; +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/952_15_Q_2D3D/CMakeLists.txt b/src/mission/952_15_Q_2D3D/CMakeLists.txt new file mode 100644 index 0000000..76bbff3 --- /dev/null +++ b/src/mission/952_15_Q_2D3D/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/back + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/qtBridge.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/CMakeLists.txt b/src/mission/CMakeLists.txt new file mode 100644 index 0000000..f9a95fd --- /dev/null +++ b/src/mission/CMakeLists.txt @@ -0,0 +1,11 @@ +# CMakeList.txt: 遍历文件夹 添加子项目 + +set(OUR_LIBS "") +SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF) +message("OUR_LIBS :" ${OUR_LIBS}) + + +# 遍历子库 +foreach(dll ${OUR_LIBS}) + add_subdirectory(${dll}) +endforeach(dll ${}) diff --git a/subModule/Hd_3DCameraLMI_module_OutLine/CMakeLists.txt b/subModule/Hd_3DCameraLMI_module_OutLine/CMakeLists.txt new file mode 100644 index 0000000..0f64ccb --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_OutLine/CMakeLists.txt @@ -0,0 +1,71 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "LMI" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + ${lmi_target_link} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.cpp b/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.cpp new file mode 100644 index 0000000..03ca3e6 --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.cpp @@ -0,0 +1,365 @@ +#include "Hd_3DCameraLMI_module.h" +#include +std::vector queuePic; +QMutex* m_mutex; +int countNm = 0; +//0106 断连提示 +void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) { + mv_Status = "disconnect"; + qDebug() << "[Error] " << " LMI camera disconnects!"; +} +bool m_Flag = false; +#pragma region LMI + +// Data callback function +// This function is called from a separate thread spawned by the GoSDK library. +// Processing within this function should be minimal. +kStatus kCall onData(void* ctx, void* sys, void* dataset) +{ + double time_Start = (double)clock(); + unsigned int i, j; + Mat heightMat1, heightMat2;//高度图 + Mat luminanceMat1, luminanceMat2;//灰度图 + //DataContext* context = (DataContext*)ctx; + + std::vector picVec; + + for (i = 0; i < GoDataSet_Count(dataset); ++i) + { + GoDataMsg dataObj = GoDataSet_At(dataset, i); + + switch (GoDataMsg_Type(dataObj)) + { + case GO_DATA_MESSAGE_TYPE_UNIFORM_SURFACE: + { + MyTiff temp; + GoUniformSurfaceMsg surfaceMsg = dataObj; + double XResolution = NM_TO_MM(GoSurfaceMsg_XResolution(surfaceMsg)); + double YResolution = NM_TO_MM(GoSurfaceMsg_YResolution(surfaceMsg)); + double ZResolution = NM_TO_MM(GoSurfaceMsg_ZResolution(surfaceMsg)); + double XOffset = UM_TO_MM(GoSurfaceMsg_XOffset(surfaceMsg)); + double YOffset = UM_TO_MM(GoSurfaceMsg_YOffset(surfaceMsg)); + double ZOffset = UM_TO_MM(GoSurfaceMsg_ZOffset(surfaceMsg)); + + int Width = GoSurfaceMsg_Width(surfaceMsg); + int Height = GoSurfaceMsg_Length(surfaceMsg); + + if (Width > 100)//轮廓出图 + { + temp.Tiff = new unsigned short[Width * Height * sizeof(unsigned short)]; + temp.w = Width; + temp.h = Height; + for (int rowIdx = 0; rowIdx < Height; rowIdx++) + { + k16s* data = GoSurfaceMsg_RowAt(surfaceMsg, rowIdx); + for (int colIdx = 0; colIdx < Width; colIdx++) + { + unsigned short val = data[colIdx]-0x8000; + //unsigned short val = ZOffset + ZResolution * data[colIdx]; + temp.Tiff[rowIdx * Width + colIdx] = val; + } + } + heightMat1 = cv::Mat(temp.h, temp.w, CV_16U, temp.Tiff); + heightMat1.copyTo(heightMat2); + m_Flag = true; + countNm++; + qDebug() << "cout:"<< countNm; + m_lmiheightFlag = true; + delete[]temp.Tiff; + temp.Tiff = nullptr; + } + + + /*cv::Mat dst; + SYSTEMTIME t; + std::vector params{ (int)cv::IMWRITE_TIFF_RESUNIT,2, (int)cv::IMWRITE_TIFF_COMPRESSION,1,(int)cv::IMWRITE_TIFF_XDPI,300,(int)cv::IMWRITE_TIFF_YDPI,300 }; + GetLocalTime(&t); + std::string filename = std::to_string(t.wHour) + "-" + std::to_string(t.wMinute) + "-" + std::to_string(t.wSecond) + "-" + std::to_string(t.wMilliseconds) + ".tiff"; + cv::imwrite(filename, img, params);*/ + } + break; + case GO_DATA_MESSAGE_TYPE_SURFACE_INTENSITY: + { + MyBmp temp; + GoSurfaceIntensityMsg surfaceIntMsg = dataObj; + double XResolution = NM_TO_MM(GoSurfaceIntensityMsg_XResolution(surfaceIntMsg)); + double YResolution = NM_TO_MM(GoSurfaceIntensityMsg_YResolution(surfaceIntMsg)); + double XOffset = UM_TO_MM(GoSurfaceIntensityMsg_XOffset(surfaceIntMsg)); + double YOffset = UM_TO_MM(GoSurfaceIntensityMsg_YOffset(surfaceIntMsg)); + + int Width = GoSurfaceIntensityMsg_Width(surfaceIntMsg); + int Height = GoSurfaceIntensityMsg_Length(surfaceIntMsg); + + temp.Bmp = new unsigned char[Width * Height * sizeof(unsigned char)]; + temp.w = Width; + temp.h = Height; + + for (int rowIdx = 0; rowIdx < Height; rowIdx++) + { + k8u* data = GoSurfaceIntensityMsg_RowAt(surfaceIntMsg, rowIdx); + for (int colIdx = 0; colIdx < Width; colIdx++) + { + temp.Bmp[rowIdx * Width + colIdx] = data[colIdx]; + } + } + + luminanceMat1 = cv::Mat(temp.h, temp.w, CV_8UC1, temp.Bmp); + luminanceMat1.copyTo(luminanceMat2); + m_lmiluminanceFlag = true; + delete[]temp.Bmp; + temp.Bmp = nullptr; + //SYSTEMTIME t; + //GetLocalTime(&t); + //std::string filename = std::to_string(t.wHour) + "-" + std::to_string(t.wMinute) + "-" + std::to_string(t.wSecond) + "-" + std::to_string(t.wMilliseconds) + ".bmp"; + //cv::imwrite(filename, img); + } + break; + + } + DataSetCollection.push_back(dataObj); + } + + //luminanceMat2 = imread("c://temp.png"); + if (m_Flag == true) + { + m_Flag = false; + if (!heightMat2.empty() && !luminanceMat2.empty()) + { + picVec.push_back(luminanceMat2); + picVec.push_back(heightMat2); + //imwrite("D://CCD//3D//" + to_string(clock()) + ".tiff", heightMat2); + //imwrite("D://CCD//3D//" + to_string(clock()) + ".bmp", luminanceMat2); + } + else + { + heightMat2 = imread("c://temp.png", 0); + luminanceMat2 = imread("c://temp.png", 0); + picVec.push_back(luminanceMat2); + picVec.push_back(heightMat2); + qDebug() << "[INFO] " "image pic:IMG is empty --CameraName:" << id; + } + m_mutex->lock(); + queuePic.clear(); + queuePic.swap(picVec); + //if (picVec.size() > 0) + // queuePic.append(picVec); + m_mutex->unlock(); + heightMat1.release(); + heightMat2.release(); + luminanceMat1.release(); + luminanceMat2.release(); + picVec.clear(); + GoDestroy(dataset); + double time_End = (double)clock(); + qDebug() << "[INFO] " "image pic:" << picIndex++ << " srcImage Exist,Time:" << (time_End - time_Start) << "ms" << "--CameraName:" << id; + } + + + return kOK; +} + + +bool InitLmi(k32u ID) +{ + + kStatus status; + if ((status = GoSdk_Construct(&api)) != kOK) + { + //printf("Error: GoSdk_Construct:%d\n", status); + qDebug() << "[Error] " << "Error: GoSdk_Construct:%d\n", status; + return false; + } + + if ((status = GoSystem_Construct(&system1, kNULL)) != kOK) + { + //printf("Error: GoSystem_Construct:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_Construct:%d\n", status; + return false; + } + + + if ((status = GoSystem_FindSensorById(system1, ID, &sensor)) != kOK) + { + //printf("Error: GoSystem_FindSensor:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_FindSensor:%d\n", status; + return false; + } + + /*GoSystem_Disconnect(system1);*/ + // create connection to GoSystem object + if ((status = GoSensor_Connect(sensor)) != kOK) + { + //ExceptionCB(status, NULL); + qDebug() << "[Error] " << "Error: GoSensor_Connect:%d\n", status; + return false; + } + + // enable sensor data channel + if ((status = GoSystem_EnableData(system1, kTRUE)) != kOK) + { + //printf("Error: GoSensor_EnableData:%d\n", status); + qDebug() << "[Error] "<< "Error: GoSensor_EnableData:%d\n", status; + return false; + } + + // set data handler to receive data asynchronously + if ((status = GoSystem_SetDataHandler(system1, onData, contextPointer)) != kOK) + { + //printf("Error: GoSystem_SetDataHandler:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_SetDataHandler:%d\n", status; + return false; + } + + if ((status = GoSystem_SetDataCapacity(system1, kSIZE_MAX)) != kOK) + { + qDebug() << "[Error] " << "Error: GoSystem_SetDataCapacity:%d\n", status; + } + return true; +} + +bool StartLmi() +{ + kStatus status; + if ((status = GoSystem_Start(system1)) != kOK) + { + //printf("Error: GoSystem_Stop:%d\n", status); + qDebug() << "[Error] " << "Failed to start LMI "; + return false; + } + return true; +} + +bool StopLmi() +{ + kStatus status; + if ((status = GoSystem_Stop(system1)) != kOK) + { + qDebug() << "[Error] " << "Failed to stop LMI "; + return false; + } + return true; +} + +void CloseLmi() +{ + // destroy handles + GoDestroy(system1); + GoDestroy(api); +} + +#pragma endregion + + +Hd_3DCameraLMI_module::Hd_3DCameraLMI_module() +{ + m_mutex = new QMutex(); +} + +Hd_3DCameraLMI_module::~Hd_3DCameraLMI_module() +{ + ExceptionCB(-1, NULL); +} + +bool Hd_3DCameraLMI_module::readData(std::vector& vecPic, QByteArray& data, nlohmann::json& json) +{ + + + int cnt = 0; + while (queuePic.size() == 0) + { + //qDebug() << " [Error] " << " srcImage is null"; + cnt++; + QThread::msleep(100); + if (cnt > 30) + { + //m_mutex->unlock(); + return false; + } + } + m_mutex->lock(); + //vector dstvec = queuePic.dequeue(); + qDebug() << queuePic.size(); + vecPic.assign(queuePic.begin(), queuePic.end()); + queuePic.clear(); + m_mutex->unlock(); + return true; + +} + +bool Hd_3DCameraLMI_module::writeData(std::vector &, QByteArray &qbyte, nlohmann::json& json) +{ + string reciveid = qbyte.toStdString(); + + id = atoi(reciveid.c_str()); + + return true; +} + +bool Hd_3DCameraLMI_module::initParas(QByteArray &, nlohmann::json& json) +{ + bool flag = InitLmi(id); //3D初始化 + m_status = flag ? OK : UnInit; + if (!flag) + { + qDebug() << "[Error] " << "Failed to Init LMI,id:"<< id; + return false; + } + + flag = StartLmi(); + m_status == flag ? Grab : OK; + + if (!flag) + { + qDebug() << "[Error] " << " Failed to start LMI"; + return false; + } + + qDebug() << "[INFO] " << " success to start LMI,id:" << id; + + return true; +} + +bool Hd_3DCameraLMI_module::run() +{ + + bool result = false; + //qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << " run start" << id; + try + { + //m_mutex->lock(); + int timeOut = 0; + while (queuePic.size() == 0&&timeOut<100) + { + timeOut++; + _sleep(100); + } + int sai = queuePic.size(); + if(timeOut<100) + result = true; + //if(queuePic.size() > 0) + // result = true; + //m_mutex->unlock(); + } + catch (QString ev) + { + qDebug() << "[Error] " << " ev:" << ev ; + } + //qDebug() << "[info]"<< __FUNCTION__ << " line:" << __LINE__ << " run end" ; + return result; +} + +Hd_3DCameraLMI_module *create() +{ + qDebug() << "[INFO] " << "Hd_MvCamera_module create success!" ; + return new Hd_3DCameraLMI_module; +} + +void destory(Hd_3DCameraLMI_module *ptr) +{ + if (ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[INFO] " << "Hd_MvCamera_module destory success!"; +} diff --git a/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.h b/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.h new file mode 100644 index 0000000..dbe2edd --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_OutLine/Hd_3DCameraLMI_module.h @@ -0,0 +1,91 @@ +#ifndef HD_3DCAMERALMI_MODULE_H +#define HD_3DCAMERALMI_MODULE_H +#include +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "winmm.lib") +#pragma comment(lib,"GoSdk.lib") +#pragma comment(lib,"kApi.lib") + +using namespace std; +using namespace cv; + +#pragma region LMI + +static QByteArray mv_Status = "connected";//0106 新增相机断联报警 +static long long picIndex = 0; +enum LmiStatus +{ + UnInit = 0, + OK = 1, + Grab = 2, +}; + +#define NM_TO_MM(VALUE) (((k64f)(VALUE))/1000000.0) +#define UM_TO_MM(VALUE) (((k64f)(VALUE))/1000.0) + +#define INVALID_RANGE_16BIT ((signed short)0x8000) // gocator transmits range data as 16-bit signed integers. 0x8000 signifies invalid range data. +#define DOUBLE_MAX ((k64f)1.7976931348623157e+308) // 64-bit double - largest positive value. +#define INVALID_RANGE_DOUBLE ((k64f)-DOUBLE_MAX) // floating point value to represent invalid range data. + + +struct MyTiff +{ + unsigned short* Tiff; + int w; + int h; +}; + +struct MyBmp +{ + unsigned char* Bmp; + int w; + int h; +}; + +struct DataContext +{ + k32u count; +}; + + +static std::vectorDataSetCollection; +static std::mutex DataSetMutex; + + +static k32u id = 117599; //3D 序列号 +static kAssembly api = kNULL; +static GoSystem system1 = kNULL; +static GoSensor sensor = kNULL; +static GoDataSet dataset = kNULL; +static DataContext* contextPointer = new DataContext(); +static LmiStatus m_status = UnInit; +static bool m_lmiheightFlag = false; +static bool m_lmiluminanceFlag = false; + +#pragma endregion + + +class Hd_3DCameraLMI_module:public subModuleBase +{ +public: + Hd_3DCameraLMI_module(); + virtual ~Hd_3DCameraLMI_module(); + bool readData(std::vector&, QByteArray&, nlohmann::json& json); + bool writeData(std::vector&, QByteArray&, nlohmann::json& json); + bool initParas(QByteArray&, nlohmann::json& json = nlohmann::json()); + bool run(); +}; + +extern "C" +{ +Q_DECL_EXPORT Hd_3DCameraLMI_module * create(); +Q_DECL_EXPORT void destory(Hd_3DCameraLMI_module * ptr); +} + + +#endif // HD_3DCAMERALMI_MODULE_H diff --git a/subModule/Hd_3DCameraLMI_module_PointCloud/CMakeLists.txt b/subModule/Hd_3DCameraLMI_module_PointCloud/CMakeLists.txt new file mode 100644 index 0000000..0fec877 --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_PointCloud/CMakeLists.txt @@ -0,0 +1,70 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "LMI" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp b/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp new file mode 100644 index 0000000..16f5572 --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp @@ -0,0 +1,354 @@ +#include "Hd_3DCameraLMI_module.h" +#include +QQueue> queuePic; +QMutex* m_mutex; + +//0106 断连提示 +void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) { + mv_Status = "disconnect"; + qDebug() << "[Error] " << " LMI camera disconnects!"; +} + +#pragma region LMI + +// Data callback function +// This function is called from a separate thread spawned by the GoSDK library. +// Processing within this function should be minimal. +kStatus kCall onData(void* ctx, void* sys, void* dataset) +{ + double time_Start = (double)clock(); + unsigned int i, j; + Mat heightMat1, heightMat2;//高度图 + Mat luminanceMat1, luminanceMat2;//灰度图 + //DataContext* context = (DataContext*)ctx; + + std::vector picVec; + + for (i = 0; i < GoDataSet_Count(dataset); ++i) + { + GoDataMsg dataObj = GoDataSet_At(dataset, i); + + switch (GoDataMsg_Type(dataObj)) + { + case GO_DATA_MESSAGE_TYPE_UNIFORM_SURFACE: + { + MyTiff temp; + GoUniformSurfaceMsg surfaceMsg = dataObj; + double XResolution = NM_TO_MM(GoSurfaceMsg_XResolution(surfaceMsg)); + double YResolution = NM_TO_MM(GoSurfaceMsg_YResolution(surfaceMsg)); + double ZResolution = NM_TO_MM(GoSurfaceMsg_ZResolution(surfaceMsg)); + double XOffset = UM_TO_MM(GoSurfaceMsg_XOffset(surfaceMsg)); + double YOffset = UM_TO_MM(GoSurfaceMsg_YOffset(surfaceMsg)); + double ZOffset = UM_TO_MM(GoSurfaceMsg_ZOffset(surfaceMsg)); + + int Width = GoSurfaceMsg_Width(surfaceMsg); + int Height = GoSurfaceMsg_Length(surfaceMsg); + + temp.Tiff = new unsigned short[Width * Height * sizeof(unsigned short)]; + temp.w = Width; + temp.h = Height; + for (int rowIdx = 0; rowIdx < Height; rowIdx++) + { + k16s* data = GoSurfaceMsg_RowAt(surfaceMsg, rowIdx); + for (int colIdx = 0; colIdx < Width; colIdx++) + { + unsigned short val = data[colIdx]; + //unsigned short val = ZOffset + ZResolution * data[colIdx]; + temp.Tiff[rowIdx * Width + colIdx] = val; + } + } + + heightMat1 = cv::Mat(temp.h, temp.w, CV_16U, temp.Tiff); + heightMat1.copyTo(heightMat2); + + m_lmiheightFlag = true; + delete[]temp.Tiff; + temp.Tiff = nullptr; + /*cv::Mat dst; + SYSTEMTIME t; + std::vector params{ (int)cv::IMWRITE_TIFF_RESUNIT,2, (int)cv::IMWRITE_TIFF_COMPRESSION,1,(int)cv::IMWRITE_TIFF_XDPI,300,(int)cv::IMWRITE_TIFF_YDPI,300 }; + GetLocalTime(&t); + std::string filename = std::to_string(t.wHour) + "-" + std::to_string(t.wMinute) + "-" + std::to_string(t.wSecond) + "-" + std::to_string(t.wMilliseconds) + ".tiff"; + cv::imwrite(filename, img, params);*/ + } + break; + case GO_DATA_MESSAGE_TYPE_SURFACE_INTENSITY: + { + MyBmp temp; + GoSurfaceIntensityMsg surfaceIntMsg = dataObj; + //double ZResolution = NM_TO_MM(GoSectionMsg_ZResolution(surfaceIntMsg)); + double XResolution = NM_TO_MM(GoSurfaceIntensityMsg_XResolution(surfaceIntMsg)); + double YResolution = NM_TO_MM(GoSurfaceIntensityMsg_YResolution(surfaceIntMsg)); + double XOffset = UM_TO_MM(GoSurfaceIntensityMsg_XOffset(surfaceIntMsg)); + double YOffset = UM_TO_MM(GoSurfaceIntensityMsg_YOffset(surfaceIntMsg)); + + int Width = GoSurfaceIntensityMsg_Width(surfaceIntMsg); + int Height = GoSurfaceIntensityMsg_Length(surfaceIntMsg); + + temp.Bmp = new unsigned char[Width * Height * sizeof(unsigned char)]; + temp.w = Width; + temp.h = Height; + + for (int rowIdx = 0; rowIdx < Height; rowIdx++) + { + k8u* data = GoSurfaceIntensityMsg_RowAt(surfaceIntMsg, rowIdx); + for (int colIdx = 0; colIdx < Width; colIdx++) + { + temp.Bmp[rowIdx * Width + colIdx] = data[colIdx]; + } + } + + luminanceMat1 = cv::Mat(temp.h, temp.w, CV_8UC1, temp.Bmp); + luminanceMat1.copyTo(luminanceMat2); + m_lmiluminanceFlag = true; + delete[]temp.Bmp; + temp.Bmp = nullptr; + //SYSTEMTIME t; + //GetLocalTime(&t); + //std::string filename = std::to_string(t.wHour) + "-" + std::to_string(t.wMinute) + "-" + std::to_string(t.wSecond) + "-" + std::to_string(t.wMilliseconds) + ".bmp"; + //cv::imwrite(filename, img); + } + break; + } + //DataSetCollection.push_back(dataObj); + } + + if (!luminanceMat2.empty()) + { + picVec.push_back(luminanceMat2); + } + else + { + luminanceMat2 = imread("C://empty.png"); + picVec.push_back(luminanceMat2); + } + if( !heightMat2.empty()) + { + picVec.push_back(heightMat2); + } + else + { + heightMat2 = imread("C://empty2.png"); + picVec.push_back(heightMat2); + } + m_mutex->lock(); + if(picVec.size() > 0) + queuePic.push_front(picVec); + m_mutex->unlock(); + heightMat1.release(); + heightMat2.release(); + luminanceMat1.release(); + luminanceMat2.release(); + picVec.clear(); + GoDestroy(dataset); + double time_End = (double)clock(); + qDebug() << "[INFO] " "image pic:" << picIndex++ << " srcImage Exist,Time:" << (time_End - time_Start) << "ms" << "--CameraName:" << id; + + return kOK; +} + + +bool InitLmi(k32u ID) +{ + + //return true;//edit + kStatus status; + if ((status = GoSdk_Construct(&api)) != kOK) + { + //printf("Error: GoSdk_Construct:%d\n", status); + qDebug() << "[Error] " << "Error: GoSdk_Construct:%d\n", status; + return false; + } + + if ((status = GoSystem_Construct(&system1, kNULL)) != kOK) + { + //printf("Error: GoSystem_Construct:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_Construct:%d\n", status; + return false; + } + + if ((status = GoSystem_FindSensorById(system1, ID, &sensor)) != kOK) + { + //printf("Error: GoSystem_FindSensor:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_FindSensor:%d\n", status; + return false; + } + + /*GoSystem_Disconnect(system1);*/ + // create connection to GoSystem object + if ((status = GoSensor_Connect(sensor)) != kOK) + { + //ExceptionCB(status, NULL); + qDebug() << "[Error] " << "Error: GoSensor_Connect:%d\n", status; + return false; + } + + // enable sensor data channel + if ((status = GoSystem_EnableData(system1, kTRUE)) != kOK) + { + //printf("Error: GoSensor_EnableData:%d\n", status); + qDebug() << "[Error] "<< "Error: GoSensor_EnableData:%d\n", status; + return false; + } + + // set data handler to receive data asynchronously + if ((status = GoSystem_SetDataHandler(system1, onData, contextPointer)) != kOK) + { + //printf("Error: GoSystem_SetDataHandler:%d\n", status); + qDebug() << "[Error] " << "Error: GoSystem_SetDataHandler:%d\n", status; + return false; + } + + if ((status = GoSystem_SetDataCapacity(system1, kSIZE_MAX)) != kOK) + { + qDebug() << "[Error] " << "Error: GoSystem_SetDataCapacity:%d\n", status; + } + return true; +} + +bool StartLmi() +{ + + kStatus status; + if ((status = GoSystem_Start(system1)) != kOK) + { + //printf("Error: GoSystem_Stop:%d\n", status); + qDebug() << "[Error] " << "Failed to start LMI "; + return false; + } + return true; +} + +bool StopLmi() +{ + kStatus status; + if ((status = GoSystem_Stop(system1)) != kOK) + { + qDebug() << "[Error] " << "Failed to stop LMI "; + return false; + } + return true; +} + +void CloseLmi() +{ + // destroy handles + GoDestroy(system1); + GoDestroy(api); +} + +#pragma endregion + + +Hd_3DCameraLMI_module::Hd_3DCameraLMI_module() +{ + m_mutex = new QMutex(); +} + +Hd_3DCameraLMI_module::~Hd_3DCameraLMI_module() +{ + ExceptionCB(-1, NULL); +} + +bool Hd_3DCameraLMI_module::readData(std::vector& vecPic, QByteArray &data, nlohmann::json& json) +{ + + if (data == "connect") + { + data = mv_Status; + return true; + } + + + + int timeOut = 0; + while (timeOut < 10000) + { + if (queuePic.size() > 0) + { + break; + } + timeOut += 1; + QThread::msleep(1); + } + m_mutex->lock(); + if (queuePic.empty()) + { + qDebug() << " [Error] " << " srcImage is null"; + std::cout<< " [Error] " << "3D srcImage is null"<unlock(); + return false; + } + vector dstvec = queuePic.dequeue(); + queuePic.clear(); + m_mutex->unlock(); + vecPic.assign(dstvec.begin(), dstvec.end()); + return true; + +} + +bool Hd_3DCameraLMI_module::writeData(std::vector &, QByteArray &qbyte, nlohmann::json& json) +{ + string reciveid = qbyte.toStdString(); + + id = atoi(reciveid.c_str()); + + return true; +} + +bool Hd_3DCameraLMI_module::initParas(QByteArray &, nlohmann::json& json) +{ + bool flag = InitLmi(id); //3D初始化 + m_status = flag ? OK : UnInit; + if (!flag) + { + qDebug() << "[Error] " << "Failed to Init LMI,id:"<< id; + return false; + } + + flag = StartLmi(); + m_status == flag ? Grab : OK; + + if (!flag) + { + qDebug() << "[Error] " << " Failed to start LMI"; + return false; + } + + qDebug() << "[INFO] " << " success to start LMI,id:" << id; + + return true; +} + +bool Hd_3DCameraLMI_module::run() +{ + + bool result = false; + //qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << " run start" << id; + try + { + result = true; + } + catch (QString ev) + { + qDebug() << "[Error] " << " ev:" << ev ; + } + //qDebug() << "[info]"<< __FUNCTION _ << " line:" << __LINE__ << " run end" ; + return result; +} + +Hd_3DCameraLMI_module *create() +{ + qDebug() << "[INFO] " << "Hd_MvCamera_module create success!" ; + return new Hd_3DCameraLMI_module; +} + +void destory(Hd_3DCameraLMI_module *ptr) +{ + if (ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[INFO] " << "Hd_MvCamera_module destory success!"; +} diff --git a/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h b/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h new file mode 100644 index 0000000..67adf20 --- /dev/null +++ b/subModule/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h @@ -0,0 +1,92 @@ +#ifndef HD_3DCAMERALMI_MODULE_H +#define HD_3DCAMERALMI_MODULE_H +#include +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "winmm.lib") +#pragma comment(lib,"GoSdk.lib") +#pragma comment(lib,"kApi.lib") + +using namespace std; +using namespace cv; + +#pragma region LMI + +static QByteArray mv_Status = "connected";//0106 新增相机断联报警 +static long long picIndex = 0; +enum LmiStatus +{ + UnInit = 0, + OK = 1, + Grab = 2, +}; + +#define NM_TO_MM(VALUE) (((k64f)(VALUE))/1000000.0) +#define UM_TO_MM(VALUE) (((k64f)(VALUE))/1000.0) + +#define INVALID_RANGE_16BIT ((signed short)0x8000) // gocator transmits range data as 16-bit signed integers. 0x8000 signifies invalid range data. +#define DOUBLE_MAX ((k64f)1.7976931348623157e+308) // 64-bit double - largest positive value. +#define INVALID_RANGE_DOUBLE ((k64f)-DOUBLE_MAX) // floating point value to represent invalid range data. + + +struct MyTiff +{ + unsigned short* Tiff; + int w; + int h; +}; + +struct MyBmp +{ + unsigned char* Bmp; + int w; + int h; +}; + +struct DataContext +{ + k32u count; +}; + + +static std::vectorDataSetCollection; +static std::mutex DataSetMutex; + + +static k32u id = 117599; //3D 序列号 +static kAssembly api = kNULL; +static GoSystem system1 = kNULL; +static GoSensor sensor = kNULL; +static GoDataSet dataset = kNULL; +static DataContext* contextPointer = new DataContext(); +static LmiStatus m_status = UnInit; +static bool m_lmiheightFlag = false; +static bool m_lmiluminanceFlag = false; +//static cv::Mat luminanceMat; +//static cv::Mat heightMat; +#pragma endregion + + +class Hd_3DCameraLMI_module:public subModuleBase +{ +public: + Hd_3DCameraLMI_module(); + virtual ~Hd_3DCameraLMI_module(); + bool readData(std::vector&, QByteArray&, nlohmann::json& json); + bool writeData(std::vector&, QByteArray&, nlohmann::json& json); + bool initParas(QByteArray&, nlohmann::json& json = nlohmann::json()); + bool run(); +}; + +extern "C" +{ +Q_DECL_EXPORT Hd_3DCameraLMI_module * create(); +Q_DECL_EXPORT void destory(Hd_3DCameraLMI_module * ptr); +} + + +#endif // HD_3DCAMERALMI_MODULE_H diff --git a/subModule/Hd_CameraModule_Basler_hard/CMakeLists.txt b/subModule/Hd_CameraModule_Basler_hard/CMakeLists.txt new file mode 100644 index 0000000..885253e --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_hard/CMakeLists.txt @@ -0,0 +1,70 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "basler" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.cpp b/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.cpp new file mode 100644 index 0000000..9f538f2 --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.cpp @@ -0,0 +1,538 @@ +#include "Hd_CameraModule_Basler_hard.h" +#include "qfuture.h" +#include + +QQueue queuepic; +Pylon::DeviceInfoList_t m_devices; +static int FrameID = 0; +static const size_t c_maxCamerasToUse = 2; +// Smart pointer to camera features +Pylon::CIntegerParameter m_exposureTime; //曝光 +Pylon::CIntegerParameter m_gain; //增益 +// The grab result retrieved from the camera. +Pylon::CGrabResultPtr m_ptrGrabResult; +bool m_invertImage=true; +// The grab result as a windows DIB to be displayed on the screen. +Pylon::CPylonBitmapImage m_bitmapImage; +bool ifGetImage = false; + +bool ifmoduleRun = true; + + +//判断是否为彩色相机 +bool IsColor(EPixelType enType) +{ + switch (enType) + { + case PixelType_RGB8packed: + case PixelType_BayerGR8: + case PixelType_BayerRG8: + case PixelType_BayerGB8: + case PixelType_BayerBG8: + case PixelType_BayerGR10: + case PixelType_BayerRG10: + case PixelType_BayerGB10: + case PixelType_BayerBG10: + case PixelType_BayerGR12: + case PixelType_BayerRG12: + case PixelType_BayerGB12: + case PixelType_BayerBG12: + case PixelType_RGB10packed: + case PixelType_BGR10packed: + case PixelType_RGB12packed: + case PixelType_BGR12packed: + case PixelType_YUV422_YUYV_Packed: + case PixelType_BayerGR12Packed: + case PixelType_BayerRG12Packed: + case PixelType_BayerGB12Packed: + case PixelType_BayerBG12Packed: + return true; + default: + return false; + } +} + +//搜索设备 +int Hd_CameraModule_Basler_hard::SearchDevice() +{ + CTlFactory& tlFactory = CTlFactory::GetInstance(); + + DeviceInfoList_t devices; + //找到所有相机 + if (tlFactory.EnumerateDevices(devices) == 0) + { + qDebug() << "No camera present"; + } + m_devices = devices; + + + // Fill the combo box. + int mindex = 0; + for (Pylon::DeviceInfoList_t::const_iterator it = m_devices.begin(); it != m_devices.end(); ++it) + { + // Get the pointer to the current device info. + const Pylon::CDeviceInfo* const pDeviceInfo = &(*it); + + // Add the friendly name to the list. + Pylon::String_t friendlyName = pDeviceInfo->GetFriendlyName(); + std::string s = friendlyName; //Basler raL4096-24gm (24731776);cam0 (23593460) + std:cout << s << std::endl; + if (s == Username) + { + index = mindex; + break; + } + mindex++; + } + return (int)devices.size(); +} + +//回调函数 +//当有新图像可用时,从CInstantCamera抓取线程调用此函数。 +//在此处执行图像处理。 +//之后,我们将把图像转换为RGB位图,并通知GUI关于新图像的信息。 +// +//注意:您不能访问任何UI对象,因为此函数不是从GUI线程调用的。 +//为了更新GUI,我们将在该功能结束时向主窗口发布一条消息。 +//GUI线程将处理消息并更新GUI。 +void Hd_CameraModule_Basler_hard::OnImageGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult) +{ + // The following line is commented out as this function will be called very often + // filling up the debug output. + //TRACE(_T("%s\n"), __FUNCTIONW__); + // When overwriting the current CGrabResultPtr, the previous result will automatically be + // released and reused by CInstantCamera. + double time_Start = (double)clock(); + m_ptrGrabResult = grabResult; + + // First check whether the smart pointer is valid. + // Then call GrabSucceeded() on the CGrabResultData to test whether the grab resulut conatains + // an sucessfully grabbed image. + // In case of i.e. transmission errors the result may be invalid + if (grabResult.IsValid() && grabResult->GrabSucceeded()) + { + // This is where you would do image processing + // and do other tasks. + // --- Start of sample image processing --- (only works for 8-bit formats) + if (m_invertImage && grabResult->GetPixelType() == PixelType_Mono8) + { + srcImage = cv::Mat(grabResult->GetHeight(), grabResult->GetWidth(), CV_8UC1, grabResult->GetBuffer()); + + //size_t imageSize = Pylon::ComputeBufferSize(grabResult->GetPixelType(), grabResult->GetWidth(), grabResult->GetHeight(), grabResult->GetPaddingX()); + + //uint8_t* p = reinterpret_cast(grabResult->GetBuffer()); + //uint8_t* const pEnd = p + (imageSize / sizeof(uint8_t)); + //for (; p < pEnd; ++p) + //{ + // *p = 255 - *p; //For demonstration purposes only, invert the image. + //} + } + else if (m_invertImage && grabResult->GetPixelType() == PixelType_BGR8packed) + { + srcImage = cv::Mat(grabResult->GetHeight(), grabResult->GetWidth(), CV_8UC3, grabResult->GetBuffer()); + } + else if (IsColor(grabResult->GetPixelType())) + { + // Create a target image. + CPylonImage targetImage; + + // Create the converter and set parameters. + CImageFormatConverter converter; + converter.OutputPixelFormat = PixelType_BGR8packed; + // Now we can check if conversion is required. + if (converter.ImageHasDestinationFormat(grabResult)) + { + ; + } + else + { + converter.Convert(targetImage, grabResult); + } + srcImage = cv::Mat(targetImage.GetHeight(), targetImage.GetWidth(), CV_8UC3, targetImage.GetBuffer()); + } + //--- End of sample image processing --- + // Convert the processed image to a bmp so we can display it on the screen. + // We must lock the bitmap, so we don't modify the pixels while the GUI thread is painting. + m_bitmapImage.CopyImage(grabResult); + + //++m_cntGrabbedImages; + ifGetImage = true; + } + else + { + // If the grab result is invalid, we also mark the bitmap as invalid. + m_bitmapImage.Release(); + ifGetImage = false; + // The some TLs provide an error code why the grab failed. + //TRACE(_T("%s Grab failed. Error code. %x\n"), __FUNCTIONW__, (int)grabResult->GetErrorCode()); + //CSingleLock lockErrorCount(&m_MemberLock, TRUE); + //++m_cntGrabErrors; + //lockErrorCount.Unlock(); + } + // Tell the main window that there is a new image available so it can update the image window. + double time_End = (double)clock(); + qDebug() << "[INFO] " " srcImage Exist,Time:" << (time_End - time_Start) / 1.0 << "ms" << "--CameraName:" << QString::fromStdString(Username) << "--FrameID : " << FrameID++; +} + +//断线回调 +// This will be called when the camera has been removed/disconnected. +// We'll post a message to the GUI about this event and return. +// In response to this message, the GUI will be updated and the camera will be closed. +void Hd_CameraModule_Basler_hard::OnCameraDeviceRemoved(Pylon::CInstantCamera& camera) +{ + moduleStatus = false; + qDebug() << "[Hd_CameraModule_Basler_hard] " << " Camera disconnected! try auto connect"; + + //运行重连线程 + QFuture future2 = QtConcurrent::run(this, &Hd_CameraModule_Basler_hard::reConnctDevice); +} + +//OnImageGrabbed和OnCameraDeviceRemoved函数,相机创建时自动绑定;相机释放时,自动解除绑定。 +//重连 +bool Hd_CameraModule_Basler_hard::reConnctDevice() +{ + m_camera->StopGrabbing(); + m_camera->DestroyDevice(); + m_camera->Close(); + delete m_camera; + m_camera = nullptr; + + while (1) + { + if (ifmoduleRun == false) + return false; + Sleep(100); + //m_mutex->lock(); + if (ConnctDevice() == true) + { + qWarning() << "[Hd_CameraModule_Basler_hard] " << " Camera create success again! "; + moduleStatus = true; + //m_mutex->unlock(); + return true; + } + } +} + +//连接设备 +bool Hd_CameraModule_Basler_hard::ConnctDevice() +{ + index = -1; + SearchDevice(); + if (index < 0) + return false; + + m_camera = new CBaslerUniversalInstantCamera; + + //因为用的new方式 + + // Register this object as an image event handler in order to get notified of new images. + // See Pylon::CImageEventHandler for details. + m_camera->RegisterImageEventHandler(this, Pylon::RegistrationMode_ReplaceAll, Pylon::Cleanup_None); + + // Register this object as a configuration event handler in order to get notified of camera state changes. + // See Pylon::CConfigurationEventHandler for details. + m_camera->RegisterConfiguration(new Pylon::CAcquireContinuousConfiguration(), Pylon::RegistrationMode_ReplaceAll, Pylon::Cleanup_Delete); + m_camera->RegisterConfiguration(this, Pylon::RegistrationMode_Append, Pylon::Cleanup_None); + + // Get the pointer to Pylon::CDeviceInfo selected. + const Pylon::CDeviceInfo* pDeviceInfo = &m_devices[index];// (const Pylon::CDeviceInfo*)m_cameraBox.GetItemData(index); + + try + { + // Add the AutoPacketSizeConfiguration and let pylon delete it when not needed anymore. + //m_camera->RegisterConfiguration(new CAutoPacketSizeConfiguration(), Pylon::RegistrationMode_Append, Pylon::Cleanup_Delete); + + // Create the device and attach it to CInstantCamera. + // Let CInstantCamera take care of destroying the device. + Pylon::IPylonDevice* pDevice = Pylon::CTlFactory::GetInstance().CreateDevice(*pDeviceInfo); + m_camera->Attach(pDevice, Pylon::Cleanup_Delete); + if (m_camera->IsPylonDeviceAttached() == false) + return false; + // Open camera. + m_camera->Open(); + //设置心跳;快速进断线回调函数 + CIntegerParameter heartbeat(m_camera->GetTLNodeMap(), "HeartbeatTimeout"); + heartbeat.TrySetValue(1000, IntegerValueCorrection_Nearest); // set to 1000 ms timeout if writable + + ////设置曝光,GigE相机为ExposureTimeRaw;USB相机为ExposureTime;方法可行,断电不保存 + //if (m_camera->ExposureTime.IsValid()) + //{ + // m_camera->ExposureTime.GetAlternativeIntegerRepresentation(m_exposureTime); + // int64_t myExposureTimeRaw=m_camera->ExposureTimeRaw.GetValue(); + // m_camera->ExposureTimeRaw.SetValue(20); + //} + //else if (m_camera->ExposureTimeRaw.IsValid()) + //{ + // m_exposureTime.Attach(m_camera->ExposureTimeRaw.GetNode()); + // m_camera->ExposureTimeRaw.SetValue(20); + //} + + //线扫相机,设置增益有问题 + ////设置增益,GigE相机为GainRaw;USB相机为Gain + //if (m_camera->Gain.IsValid()) + //{ + // m_camera->Gain.GetAlternativeIntegerRepresentation(m_gain); + // m_camera->Gain.SetValue(2); + //} + //else if (m_camera->GainRaw.IsValid()) + //{ + // m_gain.Attach(m_camera->GainRaw.GetNode()); + // m_camera->GainRaw.SetValue(2); + //} + + //这几行会把相机设置重置 + //像素格式 + //m_camera->RegisterCameraEventHandler(this, "PixelFormat", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + //触发模式 + //m_camera->RegisterCameraEventHandler(this, "TriggerMode", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + //触发源 + //m_camera->RegisterCameraEventHandler(this, "TriggerSource", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + + //触发模式 + m_camera->TriggerSource.SetValue( Basler_UniversalCameraParams::TriggerSource_Line1); + //触发源 + m_camera->TriggerMode.SetValue(Basler_UniversalCameraParams::TriggerMode_On); + //m_camera->configuration + //m_camera->UserSetLoad("User Set 1"); + //m_camera->PixelFormat.SetValue();// + + + //连续采集 + // Camera may have been disconnected. + if (!m_camera->IsOpen() || m_camera->IsGrabbing()) + { + return false; + } + // Try set continuous frame mode if available + m_camera->AcquisitionMode.TrySetValue(Basler_UniversalCameraParams::AcquisitionMode_Continuous); + + // Start grabbing until StopGrabbing() is called. + m_camera->StartGrabbing(Pylon::GrabStrategy_OneByOne, Pylon::GrabLoop_ProvidedByInstantCamera); + qDebug() << "[StartGrabbing] " << " basler camera StartGrabbing!"; + + } + catch (const Pylon::GenericException& e) + { + qDebug() << "[error] " << " basler camera disconnects!"; + return false; + } + return true; + +} + +void Hd_CameraModule_Basler_hard::OnCameraEvent(Pylon::CInstantCamera& camera, intptr_t userProvidedId, GenApi::INode* pNode) +{ + std::cout << "Hd_CameraModule_Basler_hard OnCameraEvent:: " << std::endl; +} + +//错误 +void Hd_CameraModule_Basler_hard::OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage) +{ + std::cout << "Hd_CameraModule_Basler_hard err:: " << errorMessage << std::endl; + + moduleStatus = false; +} + + +Hd_CameraModule_Basler_hard* create() +{ + qDebug() << "[info] " << "Hd_CameraModule_Basler_hard create success!"; + return new Hd_CameraModule_Basler_hard; +} + + +void destory(Hd_CameraModule_Basler_hard* ptr) +{ + if (ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[info] " << "Hd_CameraModule_Basler_hard destory success!"; +} + +Hd_CameraModule_Basler_hard::Hd_CameraModule_Basler_hard() +{ + PylonInitialize(); + + m_mutex = new QMutex(); +} + + +//关闭设备 +void Hd_CameraModule_Basler_hard::CloseDevice() +{ + m_camera->StopGrabbing(); + //m_bitmapImage.Release(); + + //// Free the grab result, if present. + //m_ptrGrabResult.Release(); + + //// Remove the event handlers that will be called when the feature changes. + //m_camera->DeregisterCameraEventHandler(this, "TriggerSource"); + + //m_camera->DeregisterCameraEventHandler(this, "TriggerMode"); + + //m_camera->DeregisterCameraEventHandler(this, "PixelFormat"); + + //if (m_gain.IsValid()) + //{ + // // If we must use the alternative integer representation, we don't know the name of the node as it defined by the camera + // m_camera->DeregisterCameraEventHandler(this, m_gain.GetNode()->GetName()); + //} + + //if (m_exposureTime.IsValid()) + //{ + // // If we must use the alternative integer representation, we don't know the name of the node as it defined by the camera + // m_camera->DeregisterCameraEventHandler(this, m_exposureTime.GetNode()->GetName()); + //} + + //// Clear the pointers to the features we set manually in Open(). + //m_exposureTime.Release(); + //m_gain.Release(); + + // Close the camera and free all ressources. + // This will also unregister all + m_camera->DestroyDevice(); + m_camera->Close(); + delete m_camera; + m_camera = nullptr; + //m_camera->ClearBufferModeEnable(); + + /*camera.StopGrabbing(); + camera.DestroyDevice(); + camera.Close();*/ +} +Hd_CameraModule_Basler_hard::~Hd_CameraModule_Basler_hard() +{ + ifmoduleRun = false; + m_mutex->lock(); + CloseDevice(); + m_mutex->unlock(); + //PylonTerminate(); + if (m_mutex) + { + delete m_mutex; + m_mutex = nullptr; + } + + qDebug() << "[info] " << " delete success!"; +} + + +//从类中读数据到实例对象 +bool Hd_CameraModule_Basler_hard::readData(std::vector& mat, QByteArray& data, nlohmann::json& json) +{ + int cnt = 0; + while (srcImage.empty()) + { + cnt++; + QThread::msleep(1); + if (cnt > 3000) + { + return false; + } + } + mat.push_back(srcImage); + srcImage.release(); + return true; +} + + +//实例对象把数据写入到类 +bool Hd_CameraModule_Basler_hard::writeData(std::vector& mat, QByteArray& data, nlohmann::json& json) +{ + Q_UNUSED(mat) + m_flag = false; + Username = data.toStdString(); + return true; +} + +bool Hd_CameraModule_Basler_hard::initParas(QByteArray&, nlohmann::json& json) +{ + return ConnctDevice(); +} + +bool Hd_CameraModule_Basler_hard::run() +{ + bool result = false; + ifGetImage = false; + + try + { + m_mutex->lock(); + + if (!m_camera->IsGrabbing()) + { + m_mutex->unlock(); + return result; + } + + ////软触发一次 + //// Only wait if software trigger is currently turned on. + //if (m_camera->TriggerSource.GetValue() == Basler_UniversalCameraParams::TriggerSource_Software + // && m_camera->TriggerMode.GetValue() == Basler_UniversalCameraParams::TriggerMode_On) + //{ + // // If the camera is currently processing a previous trigger command, + // // it will silently discard trigger commands. + // // We wait until the camera is ready to process the next trigger. + // if (moduleStatus == false) + // { + // m_mutex->unlock(); + // return result; + // } + // if (m_camera->WaitForFrameTriggerReady(3000, Pylon::TimeoutHandling_ThrowException) == true) + // { + // // Send trigger + // m_camera->ExecuteSoftwareTrigger(); + // } + // else { + // m_mutex->unlock(); + // return result; + // } + //} + //else { + // m_mutex->unlock(); + // return result; + //} + + int timeOut = 0; + while (1) + { + if (ifGetImage == true) + { + result = true; + break; + } + + if (timeOut++ > 3000 || moduleStatus == false) + { + result = false; + break; + } + //else + //{ + // result = true; + // break; + //} + Sleep(1); + } + } + catch (...) + { + qDebug() << "[error] " << " Hd_CameraModule_Basler_hard:" ; + } + m_mutex->unlock(); + return result; +} + + +//相机连接状态:正常连接或断开 +bool Hd_CameraModule_Basler_hard::checkStatus() +{ + //m_mutex->lock(); + //status = modulestatus; + return moduleStatus; + //m_mutex->unlock(); +} + diff --git a/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.h b/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.h new file mode 100644 index 0000000..36a4887 --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_hard/Hd_CameraModule_Basler_hard.h @@ -0,0 +1,77 @@ +#ifndef Hd_CameraModule_Basler_LineSweep_H +#define Hd_CameraModule_Basler_LineSweep_H +#include +#include +#include +#include +#include +#include +//#include +//#include +//#include +#include +#include + +#include + +using namespace cv; +using namespace std; +using namespace Pylon; +#pragma execution_character_set("utf-8") + +static QByteArray mv_Status = "connected";//0106 新增相机断联报警 +//static void* handle; +static string Username=""; +static bool m_flag = false; +static cv::Mat srcImage; +static bool moduleStatus = true; +static int index=-1; +class Hd_CameraModule_Basler_hard :public subModuleBase + , public Pylon::CImageEventHandler // Allows you to get notified about images received and grab errors. + , public Pylon::CConfigurationEventHandler // Allows you to get notified about device removal. + , public Pylon::CCameraEventHandler + //, public CInstantInterface +{ +public: + Hd_CameraModule_Basler_hard(); + virtual ~Hd_CameraModule_Basler_hard(); + //从类中读数据到实例对象 + bool readData(std::vector& mat, QByteArray& data, nlohmann::json& json); + //实例对象把数据写入到类 + bool writeData(std::vector& mat, QByteArray& data, nlohmann::json& json); + bool initParas(QByteArray&, nlohmann::json& json = nlohmann::json()); + bool run(); + bool checkStatus(); + + int SearchDevice(); + + //关闭设备 + void CloseDevice(); + //连接设备 + bool ConnctDevice(); + //重连设备 + bool reConnctDevice(); + //回调函数? + virtual void OnImageGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult); + //断线回调 + void OnCameraDeviceRemoved(Pylon::CInstantCamera& camera); + //错误 + void OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage); + + void OnCameraEvent(Pylon::CInstantCamera& camera, intptr_t userProvidedId, GenApi::INode* pNode); + +private: + //MyThread *m_thread = nullptr; + QMutex* m_mutex; + + Pylon::CBaslerUniversalInstantCamera *m_camera; +}; + +extern "C" +{ +Q_DECL_EXPORT Hd_CameraModule_Basler_hard* create(); +Q_DECL_EXPORT void destory(Hd_CameraModule_Basler_hard* ptr); +} + +#endif // Hd_CameraModule_Basler_LineSweep_H +//Hd_CameraModule_Basler_hard diff --git a/subModule/Hd_CameraModule_Basler_soft/CMakeLists.txt b/subModule/Hd_CameraModule_Basler_soft/CMakeLists.txt new file mode 100644 index 0000000..885253e --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_soft/CMakeLists.txt @@ -0,0 +1,70 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "basler" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.cpp b/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.cpp new file mode 100644 index 0000000..0300248 --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.cpp @@ -0,0 +1,541 @@ +#include "Hd_CameraModule_Basler_soft.h" +#include "qfuture.h" +#include + +QQueue queuepic; +Pylon::DeviceInfoList_t m_devices; + +static int FrameID = 0; +static const size_t c_maxCamerasToUse = 2; +// Smart pointer to camera features +Pylon::CIntegerParameter m_exposureTime; //曝光 +Pylon::CIntegerParameter m_gain; //增益 +// The grab result retrieved from the camera. +Pylon::CGrabResultPtr m_ptrGrabResult; +bool m_invertImage=true; +// The grab result as a windows DIB to be displayed on the screen. +Pylon::CPylonBitmapImage m_bitmapImage; +bool ifGetImage = false; + +bool ifmoduleRun = true; + +//判断是否为彩色相机 +bool IsColor(EPixelType enType) +{ + switch (enType) + { + case PixelType_RGB8packed: + case PixelType_BayerGR8: + case PixelType_BayerRG8: + case PixelType_BayerGB8: + case PixelType_BayerBG8: + case PixelType_BayerGR10: + case PixelType_BayerRG10: + case PixelType_BayerGB10: + case PixelType_BayerBG10: + case PixelType_BayerGR12: + case PixelType_BayerRG12: + case PixelType_BayerGB12: + case PixelType_BayerBG12: + case PixelType_RGB10packed: + case PixelType_BGR10packed: + case PixelType_RGB12packed: + case PixelType_BGR12packed: + case PixelType_YUV422_YUYV_Packed: + case PixelType_BayerGR12Packed: + case PixelType_BayerRG12Packed: + case PixelType_BayerGB12Packed: + case PixelType_BayerBG12Packed: + return true; + default: + return false; + } +} +//搜索设备 +int Hd_CameraModule_Basler_soft::SearchDevice() +{ + CTlFactory& tlFactory = CTlFactory::GetInstance(); + + DeviceInfoList_t devices; + //找到所有相机 + if (tlFactory.EnumerateDevices(devices) == 0) + { + qDebug() << "No camera present"; + } + m_devices = devices; + + + // Fill the combo box. + int mindex = 0; + for (Pylon::DeviceInfoList_t::const_iterator it = m_devices.begin(); it != m_devices.end(); ++it) + { + // Get the pointer to the current device info. + const Pylon::CDeviceInfo* const pDeviceInfo = &(*it); + + // Add the friendly name to the list. + Pylon::String_t friendlyName = pDeviceInfo->GetFriendlyName(); + std::string s = friendlyName; //Basler raL4096-24gm (24731776);cam0 (23593460) + //std:cout << s << std::endl; + if (s == Username) + { + index = mindex; + break; + } + mindex++; + } + return (int)devices.size(); +} +//回调函数 +//当有新图像可用时,从CInstantCamera抓取线程调用此函数。 +//在此处执行图像处理。 +//之后,我们将把图像转换为RGB位图,并通知GUI关于新图像的信息。 +// +//注意:您不能访问任何UI对象,因为此函数不是从GUI线程调用的。 +//为了更新GUI,我们将在该功能结束时向主窗口发布一条消息。 +//GUI线程将处理消息并更新GUI。 +void Hd_CameraModule_Basler_soft::OnImageGrabbed(Pylon::CInstantCamera& camera, const CGrabResultPtr& grabResult) +{ + // The following line is commented out as this function will be called very often + // filling up the debug output. + //TRACE(_T("%s\n"), __FUNCTIONW__); + // When overwriting the current CGrabResultPtr, the previous result will automatically be + // released and reused by CInstantCamera. + double time_Start = (double)clock(); + + //m_ptrGrabResult = grabResult; + //CBaslerUniversalGrabResultPtr ptrGrabResult;CGrabResultPtr + + // First check whether the smart pointer is valid. + // Then call GrabSucceeded() on the CGrabResultData to test whether the grab resulut conatains + // an sucessfully grabbed image. + // In case of i.e. transmission errors the result may be invalid + if (grabResult.IsValid() && grabResult->GrabSucceeded()) + { + // This is where you would do image processing + // and do other tasks. + // --- Start of sample image processing --- (only works for 8-bit formats) + if (m_invertImage && grabResult->GetPixelType() == PixelType_Mono8) + { + srcImage = cv::Mat(grabResult->GetHeight(), grabResult->GetWidth(), CV_8UC1, grabResult->GetBuffer()); + + //size_t imageSize = Pylon::ComputeBufferSize(grabResult->GetPixelType(), grabResult->GetWidth(), grabResult->GetHeight(), grabResult->GetPaddingX()); + + //uint8_t* p = reinterpret_cast(grabResult->GetBuffer()); + //uint8_t* const pEnd = p + (imageSize / sizeof(uint8_t)); + //for (; p < pEnd; ++p) + //{ + // *p = 255 - *p; //For demonstration purposes only, invert the image. + //} + } + else if (m_invertImage && grabResult->GetPixelType() == PixelType_BGR8packed) + { + srcImage = cv::Mat(grabResult->GetHeight(), grabResult->GetWidth(), CV_8UC3, grabResult->GetBuffer()); + } + else if (IsColor(grabResult->GetPixelType())) + { + // Create a target image. + CPylonImage targetImage; + + // Create the converter and set parameters. + CImageFormatConverter converter; + converter.OutputPixelFormat = PixelType_BGR8packed; + // Now we can check if conversion is required. + if (converter.ImageHasDestinationFormat(grabResult)) + { + ; + } + else + { + converter.Convert(targetImage, grabResult); + } + srcImage = cv::Mat(targetImage.GetHeight(), targetImage.GetWidth(), CV_8UC3, targetImage.GetBuffer()); + } + //++m_cntGrabbedImages; + + ifGetImage = true; + } + else + { + // If the grab result is invalid, we also mark the bitmap as invalid. + m_bitmapImage.Release(); + ifGetImage = false; + // The some TLs provide an error code why the grab failed. + //TRACE(_T("%s Grab failed. Error code. %x\n"), __FUNCTIONW__, (int)grabResult->GetErrorCode()); + //CSingleLock lockErrorCount(&m_MemberLock, TRUE); + //++m_cntGrabErrors; + //lockErrorCount.Unlock(); + } + // Tell the main window that there is a new image available so it can update the image window. + double time_End = (double)clock(); + qDebug() << "[INFO] " " srcImage Exist,Time:" << (time_End - time_Start) / 1.0 << "ms" << "--CameraName:" << QString::fromStdString(Username) << "--FrameID : " << FrameID++; +} +//断线回调 +// This will be called when the camera has been removed/disconnected. +// We'll post a message to the GUI about this event and return. +// In response to this message, the GUI will be updated and the camera will be closed. +void Hd_CameraModule_Basler_soft::OnCameraDeviceRemoved(Pylon::CInstantCamera& camera) +{ + moduleStatus = false; + qDebug() << "[Hd_CameraModule_Basler_soft] " << " Camera disconnected! try auto connect"; + + //运行重连线程 + QFuture future2 = QtConcurrent::run(this, &Hd_CameraModule_Basler_soft::reConnctDevice); +} +//OnImageGrabbed和OnCameraDeviceRemoved函数,相机创建时自动绑定;相机释放时,自动解除绑定。 +//重连 +bool Hd_CameraModule_Basler_soft::reConnctDevice() +{ + m_camera->StopGrabbing(); + m_camera->DestroyDevice(); + m_camera->Close(); + delete m_camera; + m_camera = nullptr; + + while (1) + { + if (ifmoduleRun == false) + return false; + Sleep(100); + //m_mutex->lock(); + if (ConnctDevice() == true) + { + qWarning() << "[Hd_CameraModule_Basler_soft] " << " Camera create success again! "; + moduleStatus = true; + //m_mutex->unlock(); + return true; + } + } +} +//连接设备 +bool Hd_CameraModule_Basler_soft::ConnctDevice() +{ + index = -1; + SearchDevice(); + if (index < 0) + return false; + + m_camera = new CBaslerUniversalInstantCamera; + + //因为用的new方式 + { + // Register this object as an image event handler in order to get notified of new images. + // See Pylon::CImageEventHandler for details. + m_camera->RegisterImageEventHandler(this, Pylon::RegistrationMode_ReplaceAll, Pylon::Cleanup_None); + + // Register this object as a configuration event handler in order to get notified of camera state changes. + // See Pylon::CConfigurationEventHandler for details. + m_camera->RegisterConfiguration(new Pylon::CAcquireContinuousConfiguration(), Pylon::RegistrationMode_ReplaceAll, Pylon::Cleanup_Delete); + m_camera->RegisterConfiguration(this, Pylon::RegistrationMode_Append, Pylon::Cleanup_None); + } + // Get the pointer to Pylon::CDeviceInfo selected. + const Pylon::CDeviceInfo* pDeviceInfo = &m_devices[index];// (const Pylon::CDeviceInfo*)m_cameraBox.GetItemData(index); + + try + { + // Add the AutoPacketSizeConfiguration and let pylon delete it when not needed anymore. + //m_camera->RegisterConfiguration(new CAutoPacketSizeConfiguration(), Pylon::RegistrationMode_Append, Pylon::Cleanup_Delete); + + // Create the device and attach it to CInstantCamera. + // Let CInstantCamera take care of destroying the device. + Pylon::IPylonDevice* pDevice = Pylon::CTlFactory::GetInstance().CreateDevice(*pDeviceInfo); + m_camera->Attach(pDevice, Pylon::Cleanup_Delete); + if (m_camera->IsPylonDeviceAttached() == false) + return false; + // Open camera. + m_camera->Open(); + + //设置心跳;快速进断线回调函数 + CIntegerParameter heartbeat(m_camera->GetTLNodeMap(), "HeartbeatTimeout"); + heartbeat.TrySetValue(1000, IntegerValueCorrection_Nearest); // set to 1000 ms timeout if writable + + ////设置曝光,GigE相机为ExposureTimeRaw;USB相机为ExposureTime;方法可行,断电不保存 + //if (m_camera->ExposureTime.IsValid()) + //{ + // m_camera->ExposureTime.GetAlternativeIntegerRepresentation(m_exposureTime); + // int64_t myExposureTimeRaw=m_camera->ExposureTimeRaw.GetValue(); + // m_camera->ExposureTimeRaw.SetValue(20); + //} + //else if (m_camera->ExposureTimeRaw.IsValid()) + //{ + // m_exposureTime.Attach(m_camera->ExposureTimeRaw.GetNode()); + // m_camera->ExposureTimeRaw.SetValue(20); + //} + + //线扫相机,设置增益有问题 + ////设置增益,GigE相机为GainRaw;USB相机为Gain + //if (m_camera->Gain.IsValid()) + //{ + // m_camera->Gain.GetAlternativeIntegerRepresentation(m_gain); + // m_camera->Gain.SetValue(2); + //} + //else if (m_camera->GainRaw.IsValid()) + //{ + // m_gain.Attach(m_camera->GainRaw.GetNode()); + // m_camera->GainRaw.SetValue(2); + //} + + //这几行会把相机设置重置 + //像素格式 + //m_camera->RegisterCameraEventHandler(this, "PixelFormat", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + //触发模式 + //m_camera->RegisterCameraEventHandler(this, "TriggerMode", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + //触发源 + //m_camera->RegisterCameraEventHandler(this, "TriggerSource", 0, Pylon::RegistrationMode_Append, Pylon::Cleanup_None, Pylon::CameraEventAvailability_Optional); + + //触发模式 + m_camera->TriggerSource.SetValue( Basler_UniversalCameraParams::TriggerSource_Software); + //触发源 + m_camera->TriggerMode.SetValue(Basler_UniversalCameraParams::TriggerMode_On); + //m_camera->PixelFormat.SetValue();// + + //连续采集 + // Camera may have been disconnected. + if (!m_camera->IsOpen() || m_camera->IsGrabbing()) + { + return false; + } + // Try set continuous frame mode if available + m_camera->AcquisitionMode.TrySetValue(Basler_UniversalCameraParams::AcquisitionMode_Continuous); + + // Start grabbing until StopGrabbing() is called. + m_camera->StartGrabbing(Pylon::GrabStrategy_OneByOne, Pylon::GrabLoop_ProvidedByInstantCamera); + qDebug() << "[StartGrabbing] " << " basler camera StartGrabbing!"; + } + catch (const Pylon::GenericException& e) + { + qDebug() << "[error] " << " basler camera disconnects!"; + return false; + } + return true; + ////创建相机对象(以最先识别的相机) + ////camera = CTlFactory::GetInstance().CreateFirstDevice(); + //CInstantCameraArray cameras(min(devices.size(), c_maxCamerasToUse)); + //// 打印相机的名称 + ////std::cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl; + // + ////获取相机节点映射以获得相机参数 + //GenApi::INodeMap& nodemap = camera.GetNodeMap(); + ////打开相机 + //camera.Open(); + ////加载用户集,相机设置应当userset1 + //camera.UserSetSelector.SetValue(UserSetSelector_UserSet1); + //camera.RegisterImageEventHandler(new CSampleImageEventHandler, RegistrationMode_Append, Cleanup_Delete); + //camera.RegisterExceptionCallBack(); + // 设置相机参数 + /*GenApi::cenumerationptr ptracquisitionmode = camera.getparameter("acquisitionmode"); + ptracquisitionmode->fromstring("continuous"); + + genapi::cenumerationptr ptrtriggerselector = camera.getparameter("triggerselector"); + ptrtriggerselector->fromstring("framestart"); + + genapi::cenumerationptr ptrtriggermode = camera.getparameter("triggermode"); + ptrtriggermode->fromstring("on"); + + genapi::cenumerationptr ptrtriggersource = camera.getparameter("triggersource"); + ptrtriggersource->fromstring("software"); + + CIntegerParameter heartbeat( camera.GetTLNodeMap(), "HeartbeatTimeout" ); + heartbeat.TrySetValue( 1000, IntegerValueCorrection_Nearest ); + */ +} +//错误 +void Hd_CameraModule_Basler_soft::OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage) +{ + std::cout << "Hd_CameraModule_Basler_soft err:: " << errorMessage << std::endl; + + moduleStatus = false; +} + +Hd_CameraModule_Basler_soft* create() +{ + qDebug() << "[info] " << "Hd_CameraModule_Basler_soft create success!"; + return new Hd_CameraModule_Basler_soft; +} + +void destory(Hd_CameraModule_Basler_soft* ptr) +{ + if (ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[info] " << "Hd_CameraModule_Basler_soft destory success!"; +} + +Hd_CameraModule_Basler_soft::Hd_CameraModule_Basler_soft() +{ + PylonInitialize(); + + m_mutex = new QMutex(); +} +//关闭设备 +void Hd_CameraModule_Basler_soft::CloseDevice() +{ + m_camera->StopGrabbing(); + //m_bitmapImage.Release(); + + //// Free the grab result, if present. + //m_ptrGrabResult.Release(); + + //// Remove the event handlers that will be called when the feature changes. + //m_camera->DeregisterCameraEventHandler(this, "TriggerSource"); + + //m_camera->DeregisterCameraEventHandler(this, "TriggerMode"); + + //m_camera->DeregisterCameraEventHandler(this, "PixelFormat"); + + //if (m_gain.IsValid()) + //{ + // // If we must use the alternative integer representation, we don't know the name of the node as it defined by the camera + // m_camera->DeregisterCameraEventHandler(this, m_gain.GetNode()->GetName()); + //} + + //if (m_exposureTime.IsValid()) + //{ + // // If we must use the alternative integer representation, we don't know the name of the node as it defined by the camera + // m_camera->DeregisterCameraEventHandler(this, m_exposureTime.GetNode()->GetName()); + //} + + //// Clear the pointers to the features we set manually in Open(). + //m_exposureTime.Release(); + //m_gain.Release(); + + // Close the camera and free all ressources. + // This will also unregister all + m_camera->DestroyDevice(); + m_camera->Close(); + delete m_camera; + m_camera = nullptr; + //m_camera->ClearBufferModeEnable(); + + /*camera.StopGrabbing(); + camera.DestroyDevice(); + camera.Close();*/ +} + +Hd_CameraModule_Basler_soft::~Hd_CameraModule_Basler_soft() +{ + ifmoduleRun = false; + m_mutex->lock(); + CloseDevice(); + m_mutex->unlock(); + //PylonTerminate(); + if (m_mutex) + { + delete m_mutex; + m_mutex = nullptr; + } + + qDebug() << "[info] " << " delete success!"; +} +//从类中读数据到实例对象 +bool Hd_CameraModule_Basler_soft::readData(std::vector& mat, QByteArray& data, nlohmann::json& json) +{ + int timeCnt = 0; + while (srcImage.empty()) + { + //qCritical() << "[INFO] " << " srcImage is null!"; + QThread::msleep(1); + timeCnt++; + if(timeCnt>1000) + return false; + } + mat.push_back(srcImage); + return true; +} +//实例对象把数据写入到类 +bool Hd_CameraModule_Basler_soft::writeData(std::vector& mat, QByteArray& data, nlohmann::json& json) +{ + Q_UNUSED(mat) + m_flag = false; + Username = data.toStdString(); + return true; +} + +bool Hd_CameraModule_Basler_soft::initParas(QByteArray&, nlohmann::json& json) +{ + return true; + return ConnctDevice(); +} + +bool Hd_CameraModule_Basler_soft::run() +{ + bool result = false; + ifGetImage = false; + + try + { + m_mutex->lock(); + + if (!m_camera->IsGrabbing()) + { + m_mutex->unlock(); + return result; + } + + //软触发一次 + // Only wait if software trigger is currently turned on. + if (m_camera->TriggerSource.GetValue() == Basler_UniversalCameraParams::TriggerSource_Software + && m_camera->TriggerMode.GetValue() == Basler_UniversalCameraParams::TriggerMode_On) + { + // If the camera is currently processing a previous trigger command, + // it will silently discard trigger commands. + // We wait until the camera is ready to process the next trigger. + if (moduleStatus == false) + { + m_mutex->unlock(); + return result; + } + if (m_camera->WaitForFrameTriggerReady(3000, Pylon::TimeoutHandling_ThrowException) == true) + { + // Send trigger + m_camera->ExecuteSoftwareTrigger(); + } + else { + m_mutex->unlock(); + return result; + } + } + else { + m_mutex->unlock(); + return result; + } + + int timeOut = 0; + while (1) + { + if (ifGetImage == true) + { + result = true; + break; + } + + if (timeOut++ > 3000 || moduleStatus ==false) + { + result = false; + break; + } + //else + //{ + // result = true; + // break; + //} + Sleep(1); + } + } + catch (...) + { + qDebug() << "[error] " << " Hd_CameraModule_Basler_soft:" ; + } + m_mutex->unlock(); + return result; +} +//相机连接状态:正常连接或断开 +bool Hd_CameraModule_Basler_soft::checkStatus() +{ + //m_mutex->lock(); + //status = modulestatus; + return moduleStatus; + //m_mutex->unlock(); +} + diff --git a/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.h b/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.h new file mode 100644 index 0000000..36b321e --- /dev/null +++ b/subModule/Hd_CameraModule_Basler_soft/Hd_CameraModule_Basler_soft.h @@ -0,0 +1,76 @@ +#ifndef Hd_CameraModule_Basler_LineSweep_H +#define Hd_CameraModule_Basler_LineSweep_H +#include +#include +#include +#include +#include +#include +//#include +//#include +//#include +#include +#include + +#include + +using namespace cv; +using namespace std; +using namespace Pylon; +using namespace Basler_UniversalCameraParams; + +#pragma execution_character_set("utf-8") + +static QByteArray mv_Status = "connected";//0106 新增相机断联报警 +//static void* handle; +static string Username=""; +static bool m_flag = false; +static cv::Mat srcImage; +static bool moduleStatus = true; +static int index=-1; +class Hd_CameraModule_Basler_soft :public subModuleBase + , public Pylon::CImageEventHandler // Allows you to get notified about images received and grab errors. + , public Pylon::CConfigurationEventHandler // Allows you to get notified about device removal. + , public Pylon::CCameraEventHandler + //, public CInstantInterface +{ +public: + Hd_CameraModule_Basler_soft(); + virtual ~Hd_CameraModule_Basler_soft(); + //从类中读数据到实例对象 + bool readData(std::vector& mat, QByteArray& data, nlohmann::json& json); + //实例对象把数据写入到类 + bool writeData(std::vector& mat, QByteArray& data, nlohmann::json& json); + bool initParas(QByteArray&, nlohmann::json& json = nlohmann::json()); + bool run(); + bool checkStatus(); + + int SearchDevice(); + + //关闭设备 + void CloseDevice(); + //连接设备 + bool ConnctDevice(); + //重连设备 + bool reConnctDevice(); + //回调函数? + virtual void OnImageGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult); + //断线回调 + void OnCameraDeviceRemoved(Pylon::CInstantCamera& camera); + //错误 + void OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage); +private: + //MyThread *m_thread = nullptr; + QMutex* m_mutex; + + Pylon::CBaslerUniversalInstantCamera *m_camera; +}; + +extern "C" +{ +Q_DECL_EXPORT Hd_CameraModule_Basler_soft* create(); +Q_DECL_EXPORT void destory(Hd_CameraModule_Basler_soft* ptr); +} + +#endif // Hd_CameraModule_Basler_LineSweep_H +//Hd_CameraModule_Basler_soft