From 84088adc94e58a9d7ace4eedddc79fc4e9eff3bd Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Mon, 23 Dec 2024 15:14:23 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=9E=81=E6=80=A7=E7=94=A8=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CMakeLists.txt | 0 .../Hd_AI_algo_jiXing_L.cpp} | 429 ++++++++++-------- .../Hd_AI_algo_jiXing_L.h} | 39 +- .../base.h | 0 .../CMakeLists.txt | 0 .../Hd_AI_algo_jiXing_T.cpp} | 124 +++-- .../Hd_AI_algo_jiXing_T.h} | 19 +- .../base.h | 0 8 files changed, 339 insertions(+), 272 deletions(-) rename BaseModules/{Hd_AI_algo_jiXing_cam1 => Hd_AI_algo_jiXing_L}/CMakeLists.txt (100%) rename BaseModules/{Hd_AI_algo_jiXing_cam2/Hd_AI_algo_jiXing_cam1.cpp => Hd_AI_algo_jiXing_L/Hd_AI_algo_jiXing_L.cpp} (75%) rename BaseModules/{Hd_AI_algo_jiXing_cam2/Hd_AI_algo_jiXing_cam1.h => Hd_AI_algo_jiXing_L/Hd_AI_algo_jiXing_L.h} (74%) rename BaseModules/{Hd_AI_algo_jiXing_cam1 => Hd_AI_algo_jiXing_L}/base.h (100%) rename BaseModules/{Hd_AI_algo_jiXing_cam2 => Hd_AI_algo_jiXing_T}/CMakeLists.txt (100%) rename BaseModules/{Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.cpp => Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.cpp} (92%) rename BaseModules/{Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.h => Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.h} (86%) rename BaseModules/{Hd_AI_algo_jiXing_cam2 => Hd_AI_algo_jiXing_T}/base.h (100%) diff --git a/BaseModules/Hd_AI_algo_jiXing_cam1/CMakeLists.txt b/BaseModules/Hd_AI_algo_jiXing_L/CMakeLists.txt similarity index 100% rename from BaseModules/Hd_AI_algo_jiXing_cam1/CMakeLists.txt rename to BaseModules/Hd_AI_algo_jiXing_L/CMakeLists.txt diff --git a/BaseModules/Hd_AI_algo_jiXing_cam2/Hd_AI_algo_jiXing_cam1.cpp b/BaseModules/Hd_AI_algo_jiXing_L/Hd_AI_algo_jiXing_L.cpp similarity index 75% rename from BaseModules/Hd_AI_algo_jiXing_cam2/Hd_AI_algo_jiXing_cam1.cpp rename to BaseModules/Hd_AI_algo_jiXing_L/Hd_AI_algo_jiXing_L.cpp index 79d6223..067c871 100644 --- a/BaseModules/Hd_AI_algo_jiXing_cam2/Hd_AI_algo_jiXing_cam1.cpp +++ b/BaseModules/Hd_AI_algo_jiXing_L/Hd_AI_algo_jiXing_L.cpp @@ -1,4 +1,4 @@ -#include "Hd_AI_algo_jiXing_cam1.h" +#include "Hd_AI_algo_jiXing_L.h" #include #include @@ -7,141 +7,142 @@ #include #include #include + using namespace cv; //原图保存文件夹s - QString oriImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/原图/"; +QString oriImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/原图/"; //原图class图保存文件夹 - QString classImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/class图/"; +QString classImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/class图/"; //结果保存文件夹 - QString resImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/结果图/"; - int algoResult = 0;//0 OK 1 NG +QString resImgSaveDir = "D:/601线/终焊CCD/极性检测CCD/相机2/结果图/"; +int algoResult = 0;//0 OK 1 NG //切图的class的width,根据项目实际设置! - int sizeW = 150; +int sizeW = 150; //切图的class的height,根据项目实际设置! - int sizeH = 150; +int sizeH = 150; //切图的class的width,根据项目实际设置!0为黑,255为白; - int fillColour = 0; +int fillColour = 0; //检测线程锁 - QMutex* detect_mutex; +QMutex* detect_mutex; //保存线程锁 - QMutex* saveStruct_mutex; +QMutex* saveStruct_mutex; //检测线程运行标志 - bool ifdetectThread = false; +bool ifdetectThread = false; - QString cameraKey_index = ""; +QString cameraKey_index = ""; - //初始化参数列表 - QByteArrayList initValueList; +//初始化参数列表 +QByteArrayList initValueList; - static void createDirectoryIfNotExists(const QString& path) { - QDir dir; - dir.mkpath(path); - } - static std::string getCurrentTime() { +static void createDirectoryIfNotExists(const QString& path) { + QDir dir; + dir.mkpath(path); +} +static std::string getCurrentTime() { - // 获取当前时间点 - auto now = std::chrono::system_clock::now(); + // 获取当前时间点 + auto now = std::chrono::system_clock::now(); - // 转换为字符串 - auto currentTime = std::chrono::system_clock::to_time_t(now); - auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 100; - std::tm* localTime = std::localtime(¤tTime); - std::stringstream ss; - ss << std::put_time(localTime, "%H-%M-%S") << "-" << std::setfill('0') << std::setw(2) << ms.count(); - return ss.str(); - } - static QString getCurrentDate() - { - QDateTime currentDateTime = QDateTime::currentDateTime(); - return currentDateTime.toString("yyyy-MM-dd"); - } - static QString getCurrentHour() - { - QDateTime currentDateTime = QDateTime::currentDateTime(); - return QString::number(currentDateTime.time().hour())+"H"; - } - QString byteArrayToUnicode(const QByteArray array) { + // 转换为字符串 + auto currentTime = std::chrono::system_clock::to_time_t(now); + auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 100; + std::tm* localTime = std::localtime(¤tTime); + std::stringstream ss; + ss << std::put_time(localTime, "%H-%M-%S") << "-" << std::setfill('0') << std::setw(2) << ms.count(); + return ss.str(); +} +static QString getCurrentDate() +{ + QDateTime currentDateTime = QDateTime::currentDateTime(); + return currentDateTime.toString("yyyy-MM-dd"); +} +static QString getCurrentHour() +{ + QDateTime currentDateTime = QDateTime::currentDateTime(); + return QString::number(currentDateTime.time().hour()) + "H"; +} +QString byteArrayToUnicode(const QByteArray array) { - // state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功 - // 如果转换成功,则值为0,如果值大于0,则说明转换失败 - QTextCodec::ConverterState state; - // 先尝试使用utf-8的方式把QByteArray转换成QString - QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state); - // 如果转换时无效字符数量大于0,说明编码格式不对 - if (state.invalidChars > 0) - { - // 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了) - text = QTextCodec::codecForName("GBK")->toUnicode(array); - } - return text; - } - static cv::Rect findMaxAreaContour(cv::Mat src) - { - int maxIndex = 0, maxArea = 0; - std::vector>contours; - cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - if (contours.size() == 0) - return cv::Rect(0, 0, 0, 0); - for (int i = 0; i < contours.size(); i++) - { - int Area = cv::contourArea(contours[i]); - if (Area > maxArea) - { - maxArea = Area; - maxIndex = i; - } - } - if (contours.size() != 0) - return cv::boundingRect(contours[maxIndex]); - return cv::Rect(0, 0, 0, 0); - } - inline std::string utf8_to_gbk(const std::string& str) - { - std::wstring_convert> conv; - std::wstring tmp_wstr = conv.from_bytes(str); - //GBK locale name in windows - const char* GBK_LOCALE_NAME = ".936"; - std::wstring_convert> convert(new std::codecvt_byname(GBK_LOCALE_NAME)); - return convert.to_bytes(tmp_wstr); - } - void getAllFiles(std::string path, std::vector& files, std::string format) - { - intptr_t hFile = 0;//文件句柄 - struct _finddata_t fileinfo;//文件信息 - std::string p; - if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) //文件存在 - { - do - { - if ((fileinfo.attrib & _A_SUBDIR))//判断是否为文件夹 - { - if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//文件夹名中不含"."和".." - { - files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //保存文件夹名 - getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //递归遍历文件夹 - } - } - else - { - files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名 - } - } while (_findnext(hFile, &fileinfo) == 0); - _findclose(hFile); - } - } - QString geteOriSaveFromat() - { - return oriImgSaveDir + getCurrentDate() + "//" + getCurrentHour() + "//" - + "ORI_" + cameraKey_index + "_" + QString::fromStdString(getCurrentTime()) + ".bmp"; - } - QString geteResSaveFromat() - { - return resImgSaveDir + getCurrentDate() + "//" + getCurrentHour() + "//" - + "RES_" + cameraKey_index + "_" + QString::fromStdString(getCurrentTime()) + ".png"; - } + // state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功 + // 如果转换成功,则值为0,如果值大于0,则说明转换失败 + QTextCodec::ConverterState state; + // 先尝试使用utf-8的方式把QByteArray转换成QString + QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state); + // 如果转换时无效字符数量大于0,说明编码格式不对 + if (state.invalidChars > 0) + { + // 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了) + text = QTextCodec::codecForName("GBK")->toUnicode(array); + } + return text; +} +static cv::Rect findMaxAreaContour(cv::Mat src) +{ + int maxIndex = 0, maxArea = 0; + std::vector>contours; + cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + if (contours.size() == 0) + return cv::Rect(0, 0, 0, 0); + for (int i = 0; i < contours.size(); i++) + { + int Area = cv::contourArea(contours[i]); + if (Area > maxArea) + { + maxArea = Area; + maxIndex = i; + } + } + if (contours.size() != 0) + return cv::boundingRect(contours[maxIndex]); + return cv::Rect(0, 0, 0, 0); +} +inline std::string utf8_to_gbk(const std::string& str) +{ + std::wstring_convert> conv; + std::wstring tmp_wstr = conv.from_bytes(str); + //GBK locale name in windows + const char* GBK_LOCALE_NAME = ".936"; + std::wstring_convert> convert(new std::codecvt_byname(GBK_LOCALE_NAME)); + return convert.to_bytes(tmp_wstr); +} +void getAllFiles(std::string path, std::vector& files, std::string format) +{ + intptr_t hFile = 0;//文件句柄 + struct _finddata_t fileinfo;//文件信息 + std::string p; + if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) //文件存在 + { + do + { + if ((fileinfo.attrib & _A_SUBDIR))//判断是否为文件夹 + { + if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//文件夹名中不含"."和".." + { + files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //保存文件夹名 + getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //递归遍历文件夹 + } + } + else + { + files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名 + } + } while (_findnext(hFile, &fileinfo) == 0); + _findclose(hFile); + } +} +QString geteOriSaveFromat() +{ + return oriImgSaveDir + getCurrentDate() + "//" + getCurrentHour() + "//" + + "ORI_" + cameraKey_index + "_" + QString::fromStdString(getCurrentTime()) + ".bmp"; +} +QString getResSaveFromat() +{ + return resImgSaveDir + getCurrentDate() + "//" + getCurrentHour() + "//" + + "RES_" + cameraKey_index + "_" + QString::fromStdString(getCurrentTime()) + ".png"; +} // 缺陷信息结构体 typedef struct { QString defectName = "";//缺陷名称 @@ -443,7 +444,7 @@ void drawDefects(cv::Mat& sourceMat, QQueue defectInfoList) //判断文件夹是否存在,不存在则创建 -void Hd_AI_algo_jiXing_cam1::isDirExist(QString fullDirName) +void Hd_AI_algo_jiXing_L::isDirExist(QString fullDirName) { QDir* photo = new QDir; bool exist = photo->exists(fullDirName); @@ -461,23 +462,23 @@ void Hd_AI_algo_jiXing_cam1::isDirExist(QString fullDirName) photo = nullptr; } -Hd_AI_algo_jiXing_cam1* create() +Hd_AI_algo_jiXing_L* create() { - qDebug() << "[INFO] " << " Hd_AI_algo_jiXing_cam1 create success!" ; - return new Hd_AI_algo_jiXing_cam1; + qDebug() << "[INFO] " << " Hd_AI_algo_jiXing_L create success!"; + return new Hd_AI_algo_jiXing_L; } -void destory(Hd_AI_algo_jiXing_cam1* ptr) +void destory(Hd_AI_algo_jiXing_L* ptr) { - qDebug() << "[INFO] " << "Hd_AI_algo_jiXing_cam1 destory success!"; - if(ptr) + qDebug() << "[INFO] " << "Hd_AI_algo_jiXing_L destory success!"; + if (ptr) { delete ptr; ptr = nullptr; } } -Hd_AI_algo_jiXing_cam1::Hd_AI_algo_jiXing_cam1() +Hd_AI_algo_jiXing_L::Hd_AI_algo_jiXing_L() { detect_mutex = new QMutex; saveStruct_mutex = new QMutex; @@ -501,7 +502,7 @@ Hd_AI_algo_jiXing_cam1::Hd_AI_algo_jiXing_cam1() } } -Hd_AI_algo_jiXing_cam1::~Hd_AI_algo_jiXing_cam1() +Hd_AI_algo_jiXing_L::~Hd_AI_algo_jiXing_L() { ifdetectThread = false; Sleep(10); @@ -520,25 +521,25 @@ Hd_AI_algo_jiXing_cam1::~Hd_AI_algo_jiXing_cam1() DestroyClsObj(pCls);*/ } //从类中读数据到实例对象 -bool Hd_AI_algo_jiXing_cam1::readData(std::vector&vec_mat,QByteArray &data) +bool Hd_AI_algo_jiXing_L::readData(std::vector& vec_mat, QByteArray& data) { detect_mutex->lock(); //qDebug() << __FUNCTION__ << " line:" <<__LINE__ << " data len:" << data.length(); - if (resMat.size()>0) + if (resMat.size() > 0) { vec_mat.push_back(resMat[0]); resMat.clear(); } else { - if(HikMat.size()>0) + if (HikMat.size() > 0) vec_mat.push_back(HikMat[0]); //qDebug() << __FUNCTION__ << " line:" << __LINE__ << " resMat.data err:"; } //if (allNum++ % 2 == 0) // data = "2*3*2";// resByte.dequeue(); //else - data = "1*&" + QByteArray::number(algoResult) + "&+" + QByteArray::number(algoResult);//1OK,2NG + data = "1*" + QByteArray::number(algoResult) + "&+" + QByteArray::number(algoResult);//1OK,2NG resByte.clear(); ////之后根据结果类修改 //if(resIfNg == true) @@ -546,40 +547,41 @@ bool Hd_AI_algo_jiXing_cam1::readData(std::vector&vec_mat,QByteArray &d //else data = "OK"; detect_mutex->unlock(); /*if(cameraKey_index.contains('_')) - qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getDetectData--CameraName:" + qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getDetectData--CameraName:" << cameraKey_index.split("_")[0] << " imgIndex:" << cameraKey_index.split("_")[1]; else qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getDetectData--CameraName imgIndex:" << cameraKey_index;*/ return true; } //从类中读数据到实例对象 -bool Hd_AI_algo_jiXing_cam1::encodeResultValue(QVector append_value,QByteArray &resultByte) +bool Hd_AI_algo_jiXing_L::encodeResultValue(QVector append_value, QByteArray& resultByte) { try { std::string sendMsg; - for(int i = 0 ; i < append_value.size();i++) + for (int i = 0; i < append_value.size(); i++) { std::string value = append_value.at(1); //type int type = 3; std::string m_type; - m_type.insert(0,4,'1'); - memcpy ( (void*)m_type.c_str(),(void*)&type,4 ); + m_type.insert(0, 4, '1'); + memcpy((void*)m_type.c_str(), (void*)&type, 4); sendMsg.append(m_type); //len int len = value.length(); std::string m_len; - m_len.insert(0,4,'1'); - memcpy ( (void*)m_len.c_str(),(void*)&len,4 ); + m_len.insert(0, 4, '1'); + memcpy((void*)m_len.c_str(), (void*)&len, 4); sendMsg.append(m_len); //data x sendMsg.append(value); } resultByte = QByteArray::fromStdString(sendMsg); - } catch (QString ev) + } + catch (QString ev) { qCritical() << "[Error] " << " ev:" << ev; return false; @@ -587,13 +589,14 @@ bool Hd_AI_algo_jiXing_cam1::encodeResultValue(QVector append_value return true; } -int myallNum[4] = {0}; +int myallNum[4] = { 0 }; QMap lastImgMap; //接收数据 -bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray &data) +bool Hd_AI_algo_jiXing_L::writeData(std::vector& vec_mat, QByteArray& data) { //qDebug() << __FUNCTION__ << "line:"<< __LINE__ << " data len" << data.length() ; - if(vec_mat.empty()) + + if (vec_mat.empty()) { qCritical() << "[Error] " << " vec_mat is null !"; return false; @@ -601,7 +604,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray detect_mutex->lock(); HikMat.clear(); for (int i = 0; i < vec_mat.size(); i++) - HikMat.enqueue(vec_mat[i]); + HikMat.enqueue(vec_mat[i]); QByteArray source_savePath; QByteArray sData = data; @@ -612,7 +615,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray cameraKey_index = splitDataList[2]; QByteArray saveDir = splitDataList[0] + "/" + splitDataList[1] + "/"; isDirExist(byteArrayToUnicode(saveDir)); //不存在,创建 - QString sdataTime= QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz"); + QString sdataTime = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz"); source_savePath = splitDataList[0] + "/" + splitDataList[1] + "/" + sdataTime.toLocal8Bit() + "-" + splitDataList[2] + "-" + splitDataList[3];// +".bmp"; } //int index = -1; @@ -690,7 +693,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray /*saveKey.enqueue("datalist[0]"); Dir2D.enqueue("datalist[1]"); - QStringList SN_dataTime; + QStringList SN_dataTime; SN_dataTime = datalist[3].split('_'); DateTime1 = "SN_dataTime[1]"; SN.enqueue("SN_dataTime[0]");*/ @@ -707,7 +710,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray //传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... //初始化 -bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) +bool Hd_AI_algo_jiXing_L::initParas(QByteArray& byte) { initValueList = byte.split('+'); QStringList valueiList; @@ -745,9 +748,9 @@ bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) //线程检测:结果类完成时,使用 //ifThreadRunDetect = true; - //QFuture future1 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_cam1::detectThread); + //QFuture future1 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_L::detectThread); //运行存图线程 - QFuture future2 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_cam1::saveImgThread); + QFuture future2 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_L::saveImgThread); //detectThread(); //原图总文件夹 @@ -758,48 +761,51 @@ bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) isDirExist(resImgSaveDir); //qDebug() << "[INFO] " << " StationNo:" << StationNo << " img2D:" << img2D ; + myEngine.SetProcedurePath("./halconFilesAlgo/JX_ColorInspection.hdpl"); //设置hdvp路径 return true; } // 解码 -bool Hd_AI_algo_jiXing_cam1::decodeAiValue(QByteArray byte,QVector &vec_ret) +bool Hd_AI_algo_jiXing_L::decodeAiValue(QByteArray byte, QVector& vec_ret) { - if(byte.isEmpty()) + if (byte.isEmpty()) { qCritical() << "[Error] " << " byte is null!"; return false; } /*******************************************/ - byte.remove(0,8); - QByteArray mm_data = byte.mid(0,4); - memcpy((void*)¶mNum,(void*)mm_data.data(), 4); + byte.remove(0, 8); + QByteArray mm_data = byte.mid(0, 4); + memcpy((void*)¶mNum, (void*)mm_data.data(), 4); qDebug() << "[INFO] " << " paramNum:" << paramNum; - byte.remove(0,4); + byte.remove(0, 4); /*******************************************/ while (!byte.isEmpty()) { int type = 0; - QByteArray m_type = byte.mid(0,4); - memcpy((void*)&type,(void*)m_type.data(), 4); - byte.remove(0,4); + QByteArray m_type = byte.mid(0, 4); + memcpy((void*)&type, (void*)m_type.data(), 4); + byte.remove(0, 4); int len = 0; - QByteArray m_len = byte.mid(0,4); - memcpy((void*)&len,(void*)m_len.data(), 4); - byte.remove(0,4); + QByteArray m_len = byte.mid(0, 4); + memcpy((void*)&len, (void*)m_len.data(), 4); + byte.remove(0, 4); - QByteArray mm_data = byte.mid(0,len); + QByteArray mm_data = byte.mid(0, len); vec_ret.append(mm_data); - byte.remove(0,len); + byte.remove(0, len); } return true; } //---------检测流程,根据实际项目修改--------- -bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir2D, QString mySN, QString myDataTime) +bool Hd_AI_algo_jiXing_L::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir2D, QString mySN, QString myDataTime) { try { + + //存图数据加保存队列,加锁,避免数据访问冲突 saveStruct_mutex->lock(); saveImgStruct mySave; @@ -827,35 +833,60 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString // csvName.close(); //} //sourceImg = cv::imread("D:\\mySN15-46-33-86.bmp",-1); - //sourceImg = cv::imread("D:/1/2024-10-17-14-07-07-225-DA4203326_0-errSN.bmp", -1); + //sourceImg = cv::imread("F:/CCD/TEST/20241024-091531.bmp", -1); cv::Mat Paint; sourceImg.copyTo(Paint); - if(Paint.channels() == 1) + if (Paint.channels() == 1) cvtColor(Paint, Paint, COLOR_GRAY2BGR); - HObject ho_Image; - HTuple hv_out_Value; - HTuple hv_Make; - MatToHObject(sourceImg, &ho_Image); + HDevEngineCpp::HDevProcedure proc("JX_Inspection"); + HDevProcedureCall procedureCall(proc); - _628_2_Polarity_detection(ho_Image, &hv_out_Value, &hv_Make); - if(hv_Make.D() == 1) + HObject in_Image; + HTuple out_Flag, out_ColorType; + MatToHObject(sourceImg, &in_Image); + + procedureCall.SetInputIconicParamObject("in_Image", in_Image);// + procedureCall.Execute();//执行halcon程序 + + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出图像类变量 + out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出控制类变量 + + if (out_Flag.D() == 1) { - int res1 = hv_out_Value[0].D(); - int res2 = hv_out_Value[1].D(); - if(res1 == 1) - putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); - else + int res1 = out_ColorType[0].D(); + int res2 = out_ColorType[1].D(); + //1铜 2铝+ + switch (res1) + { + case 0: + putTextHusky(Paint, utf8_to_gbk("异常").c_str(), cv::Point(0, 0), cv::Scalar(0, 0, 255), 300); + break; + case 1: putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); + break; + case 2: + putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); + break; + } - if (res2 == 1) - putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); - else + switch (res1) + { + case 0: + putTextHusky(Paint, utf8_to_gbk("异常").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 0, 255), 300); + break; + case 1: putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); + break; + case 2: + putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); + break; - //CAM1 为铜OK,CAM2为铝OK - if (res1 == 1 && res2 == 1)//铝 + } + + //T 为铜OK,L为铝OK + if (res1 == 2 && res2 == 2)//铝ok { putTextHusky(Paint, utf8_to_gbk("OK").c_str(), cv::Point(Paint.cols - 800, 0), cv::Scalar(0, 255, 0), 500); algoResult = 1; @@ -872,12 +903,12 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString QQueue defectInfoList; - + detect_mutex->lock(); - + resMat.push_back(Paint); QJsonArray detaillists; @@ -901,10 +932,10 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString detailObj.insert("defectRect.width", QString::number(mdefect.defectRect.width)); detailObj.insert("defectRect.height", QString::number(mdefect.defectRect.height)); detailObj.insert("defectScalar0", QString::number(mdefect.defectScalar[0])); - detailObj.insert("defectScalar1", QString::number(mdefect.defectScalar[1])); + detailObj.insert("defectScalar1", QString::number(mdefect.defectScalar[1])); detailObj.insert("defectScalar2", QString::number(mdefect.defectScalar[2])); detailObj.insert("defectArea", QString::number(mdefect.defectArea)); - detailObj.insert("defectLength", QString::number(sqrt(mdefect.defectRect.width* mdefect.defectRect.width+ mdefect.defectRect.height* mdefect.defectRect.height))); + detailObj.insert("defectLength", QString::number(sqrt(mdefect.defectRect.width * mdefect.defectRect.width + mdefect.defectRect.height * mdefect.defectRect.height))); detaillists.append(detailObj); } @@ -920,10 +951,10 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString //isDirExist(resImgSaveDir + mysaveKey1 + "/"); QString qimgsavePath = resImgSaveDir + mysaveKey1 + "/" + mySN + myDataTime + ".png"; //存图数据入队,按需 - if (resMat.size() > 0 ) + if (resMat.size() > 0) { createDirectoryIfNotExists(resImgSaveDir + getCurrentDate() + "//" + getCurrentHour() + "//"); - addImgToSaveStruct(resMat[0], "0", geteResSaveFromat());//保存原图 + addImgToSaveStruct(resMat[0], "0", getResSaveFromat());//保存原图 } detect_mutex->unlock(); @@ -967,7 +998,7 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString } //存图加入队列 -void Hd_AI_algo_jiXing_cam1::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey, QString savePath) +void Hd_AI_algo_jiXing_L::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey, QString savePath) { //存图数据加保存队列,加锁,避免数据访问冲突 saveStruct_mutex->lock(); @@ -979,7 +1010,7 @@ void Hd_AI_algo_jiXing_cam1::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey saveStruct.enqueue(mySave); saveStruct_mutex->unlock(); } -void Hd_AI_algo_jiXing_cam1::saveImgThread() +void Hd_AI_algo_jiXing_L::saveImgThread() { while (1) { @@ -995,7 +1026,7 @@ void Hd_AI_algo_jiXing_cam1::saveImgThread() saveImgStruct mysaveStruct = saveStruct.dequeue(); saveStruct_mutex->unlock(); stop = clock(); - if(stop-start >1000) + if (stop - start > 1000) std::cout << "lock stop-start >1000::************************" << stop - start << std::endl; start = clock(); if (mysaveStruct.out_Mat.data) @@ -1003,17 +1034,17 @@ void Hd_AI_algo_jiXing_cam1::saveImgThread() //std::cout << "savePath::" << mysaveStruct.savePath << std::endl; stop = clock(); if (stop - start > 1000) - std::cout << "imwrite stop-start >1000::--------------------------"<< stop - start << std::endl; + std::cout << "imwrite stop-start >1000::--------------------------" << stop - start << std::endl; _sleep(1); } } } //检测线程,应当只运行一次 -void Hd_AI_algo_jiXing_cam1::detectThread() +void Hd_AI_algo_jiXing_L::detectThread() { do { - if (!ifdetectThread)return; + if (!ifdetectThread)return; //此两行代码,避免程序卡死;_sleep的时间根据实际项目调整 _sleep(2); @@ -1043,7 +1074,7 @@ void Hd_AI_algo_jiXing_cam1::detectThread() isDirExist(resImgSaveDir + mysaveKey); } - + //测试相机的, // while (sourceImg1.cols > 2000)cv::resize(sourceImg1, sourceImg1, cv::Size(), 0.5, 0.5); @@ -1058,14 +1089,14 @@ void Hd_AI_algo_jiXing_cam1::detectThread() myDir2D.clear(); mySN.clear(); myDataTime.clear(); - qApp->processEvents(); + qApp->processEvents(); } while (ifThreadRunDetect); - + } static int runNum = 0; -bool Hd_AI_algo_jiXing_cam1::run() +bool Hd_AI_algo_jiXing_L::run() { clock_t start, stop; start = clock(); @@ -1073,14 +1104,14 @@ bool Hd_AI_algo_jiXing_cam1::run() //Sleep(1000); detectThread(); stop = clock(); - qDebug() << __FUNCTION__ << "line:" << __LINE__ << " run start ::runNum::" << runNum++<<" cutTime::"< #include @@ -21,7 +21,9 @@ #include "base.h" #include "handleAI.h" #pragma execution_character_set("utf-8") +#include +using namespace HDevEngineCpp; //保存图片的结构体 @@ -32,16 +34,16 @@ struct saveImgStruct; // std::string savePath; //保存路径 //}; -//初始化流程(一次):Hd_AI_algo_jiXing_cam1,initParas +//初始化流程(一次):Hd_AI_algo_jiXing_L,initParas //运行流程:writeData主线程把数据传过来,run,readData此线程把数据传主线程 -class Hd_AI_algo_jiXing_cam1 :public Base +class Hd_AI_algo_jiXing_L :public Base { Q_OBJECT public: - Hd_AI_algo_jiXing_cam1(); - virtual ~Hd_AI_algo_jiXing_cam1(); + Hd_AI_algo_jiXing_L(); + virtual ~Hd_AI_algo_jiXing_L(); //从类中读数据到实例对象 - bool readData(std::vector&,QByteArray&); + bool readData(std::vector&, QByteArray&); //实例对象把数据写入到类 bool writeData(std::vector&, QByteArray&); bool initParas(QByteArray&); @@ -50,14 +52,15 @@ public: //线程状态 bool checkStatus();// { return true; }; - bool encodeResultValue(QVector append_value,QByteArray &resultByte); - bool decodeAiValue(QByteArray byte,QVector &vec_ret); + bool encodeResultValue(QVector append_value, QByteArray& resultByte); + bool decodeAiValue(QByteArray byte, QVector& vec_ret); //---------检测流程,根据实际项目修改--------- bool AIdetect(cv::Mat img2D, QString saveKey, QString Dir2D, QString SN, QString DataTime); - + private: + HDevEngine myEngine; int allNum = 0; - int StationNo=0; + int StationNo = 0; int img2D = 2; bool moduleStatus = true; @@ -65,13 +68,13 @@ private: //输入图片队列 QQueue HikMat; //输入关键字队列 - QString saveKey="saveKey"; + QString saveKey = "saveKey"; //结果路径文件夹队列 - QString Dir2D="Dir2D"; + QString Dir2D = "Dir2D"; //产品SN队列 - QString SN="SN"; + QString SN = "SN"; //产品时间戳队列 - QString DateTime1="DateTime1"; + QString DateTime1 = "DateTime1"; int paramNum; @@ -88,7 +91,7 @@ private: void detectThread(); //存图线程 void saveImgThread(); - + //保存图片队列 QQueue saveStruct; @@ -101,8 +104,8 @@ private: extern "C" { - Q_DECL_EXPORT Hd_AI_algo_jiXing_cam1 * create(); - Q_DECL_EXPORT void destory(Hd_AI_algo_jiXing_cam1 * ptr); + Q_DECL_EXPORT Hd_AI_algo_jiXing_L* create(); + Q_DECL_EXPORT void destory(Hd_AI_algo_jiXing_L* ptr); } //保存图片的结构体 struct saveImgStruct diff --git a/BaseModules/Hd_AI_algo_jiXing_cam1/base.h b/BaseModules/Hd_AI_algo_jiXing_L/base.h similarity index 100% rename from BaseModules/Hd_AI_algo_jiXing_cam1/base.h rename to BaseModules/Hd_AI_algo_jiXing_L/base.h diff --git a/BaseModules/Hd_AI_algo_jiXing_cam2/CMakeLists.txt b/BaseModules/Hd_AI_algo_jiXing_T/CMakeLists.txt similarity index 100% rename from BaseModules/Hd_AI_algo_jiXing_cam2/CMakeLists.txt rename to BaseModules/Hd_AI_algo_jiXing_T/CMakeLists.txt diff --git a/BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.cpp b/BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.cpp similarity index 92% rename from BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.cpp rename to BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.cpp index d47881a..e5976a4 100644 --- a/BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.cpp +++ b/BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.cpp @@ -1,4 +1,4 @@ -#include "Hd_AI_algo_jiXing_cam1.h" +#include "Hd_AI_algo_jiXing_T.h" #include #include @@ -7,6 +7,7 @@ #include #include #include + using namespace cv; //原图保存文件夹s @@ -443,7 +444,7 @@ void drawDefects(cv::Mat& sourceMat, QQueue defectInfoList) //判断文件夹是否存在,不存在则创建 -void Hd_AI_algo_jiXing_cam1::isDirExist(QString fullDirName) +void Hd_AI_algo_jiXing_T::isDirExist(QString fullDirName) { QDir* photo = new QDir; bool exist = photo->exists(fullDirName); @@ -461,15 +462,15 @@ void Hd_AI_algo_jiXing_cam1::isDirExist(QString fullDirName) photo = nullptr; } -Hd_AI_algo_jiXing_cam1* create() +Hd_AI_algo_jiXing_T* create() { - qDebug() << "[INFO] " << " Hd_AI_algo_jiXing_cam1 create success!" ; - return new Hd_AI_algo_jiXing_cam1; + qDebug() << "[INFO] " << " Hd_AI_algo_jiXing_T create success!" ; + return new Hd_AI_algo_jiXing_T; } -void destory(Hd_AI_algo_jiXing_cam1* ptr) +void destory(Hd_AI_algo_jiXing_T* ptr) { - qDebug() << "[INFO] " << "Hd_AI_algo_jiXing_cam1 destory success!"; + qDebug() << "[INFO] " << "Hd_AI_algo_jiXing_T destory success!"; if(ptr) { delete ptr; @@ -477,7 +478,7 @@ void destory(Hd_AI_algo_jiXing_cam1* ptr) } } -Hd_AI_algo_jiXing_cam1::Hd_AI_algo_jiXing_cam1() +Hd_AI_algo_jiXing_T::Hd_AI_algo_jiXing_T() { detect_mutex = new QMutex; saveStruct_mutex = new QMutex; @@ -501,7 +502,7 @@ Hd_AI_algo_jiXing_cam1::Hd_AI_algo_jiXing_cam1() } } -Hd_AI_algo_jiXing_cam1::~Hd_AI_algo_jiXing_cam1() +Hd_AI_algo_jiXing_T::~Hd_AI_algo_jiXing_T() { ifdetectThread = false; Sleep(10); @@ -520,7 +521,7 @@ Hd_AI_algo_jiXing_cam1::~Hd_AI_algo_jiXing_cam1() DestroyClsObj(pCls);*/ } //从类中读数据到实例对象 -bool Hd_AI_algo_jiXing_cam1::readData(std::vector&vec_mat,QByteArray &data) +bool Hd_AI_algo_jiXing_T::readData(std::vector&vec_mat,QByteArray &data) { detect_mutex->lock(); //qDebug() << __FUNCTION__ << " line:" <<__LINE__ << " data len:" << data.length(); @@ -553,7 +554,7 @@ bool Hd_AI_algo_jiXing_cam1::readData(std::vector&vec_mat,QByteArray &d return true; } //从类中读数据到实例对象 -bool Hd_AI_algo_jiXing_cam1::encodeResultValue(QVector append_value,QByteArray &resultByte) +bool Hd_AI_algo_jiXing_T::encodeResultValue(QVector append_value,QByteArray &resultByte) { try { @@ -590,9 +591,10 @@ bool Hd_AI_algo_jiXing_cam1::encodeResultValue(QVector append_value int myallNum[4] = {0}; QMap lastImgMap; //接收数据 -bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray &data) +bool Hd_AI_algo_jiXing_T::writeData(std::vector& vec_mat, QByteArray &data) { //qDebug() << __FUNCTION__ << "line:"<< __LINE__ << " data len" << data.length() ; + if(vec_mat.empty()) { qCritical() << "[Error] " << " vec_mat is null !"; @@ -603,7 +605,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray for (int i = 0; i < vec_mat.size(); i++) HikMat.enqueue(vec_mat[i]); - QByteArray source_savePath; + QByteArray source_savePath; QByteArray sData = data; QByteArrayList splitDataList = sData.split(','); if (splitDataList.size() >= 4) @@ -707,7 +709,7 @@ bool Hd_AI_algo_jiXing_cam1::writeData(std::vector& vec_mat, QByteArray //传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... //初始化 -bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) +bool Hd_AI_algo_jiXing_T::initParas(QByteArray& byte) { initValueList = byte.split('+'); QStringList valueiList; @@ -745,9 +747,9 @@ bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) //线程检测:结果类完成时,使用 //ifThreadRunDetect = true; - //QFuture future1 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_cam1::detectThread); + //QFuture future1 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_T::detectThread); //运行存图线程 - QFuture future2 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_cam1::saveImgThread); + QFuture future2 = QtConcurrent::run(this, &Hd_AI_algo_jiXing_T::saveImgThread); //detectThread(); //原图总文件夹 @@ -758,10 +760,11 @@ bool Hd_AI_algo_jiXing_cam1::initParas(QByteArray& byte) isDirExist(resImgSaveDir); //qDebug() << "[INFO] " << " StationNo:" << StationNo << " img2D:" << img2D ; + myEngine.SetProcedurePath("./halconFilesAlgo/JX_ColorInspection.hdpl"); //设置hdvp路径 return true; } // 解码 -bool Hd_AI_algo_jiXing_cam1::decodeAiValue(QByteArray byte,QVector &vec_ret) +bool Hd_AI_algo_jiXing_T::decodeAiValue(QByteArray byte,QVector &vec_ret) { if(byte.isEmpty()) { @@ -796,10 +799,12 @@ bool Hd_AI_algo_jiXing_cam1::decodeAiValue(QByteArray byte,QVector & return true; } //---------检测流程,根据实际项目修改--------- -bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir2D, QString mySN, QString myDataTime) +bool Hd_AI_algo_jiXing_T::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir2D, QString mySN, QString myDataTime) { try { + + //存图数据加保存队列,加锁,避免数据访问冲突 saveStruct_mutex->lock(); saveImgStruct mySave; @@ -827,44 +832,69 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString // csvName.close(); //} //sourceImg = cv::imread("D:\\mySN15-46-33-86.bmp",-1); - //sourceImg = cv::imread("D:/1/2024-10-17-14-07-07-225-DA4203326_0-errSN.bmp", -1); + //sourceImg = cv::imread("F:/CCD/TEST/20241024-091531.bmp", -1); cv::Mat Paint; sourceImg.copyTo(Paint); if(Paint.channels() == 1) cvtColor(Paint, Paint, COLOR_GRAY2BGR); - HObject ho_Image; - HTuple hv_out_Value; - HTuple hv_Make; - MatToHObject(sourceImg, &ho_Image); + HDevEngineCpp::HDevProcedure proc("JX_Inspection"); + HDevProcedureCall procedureCall(proc); - _628_2_Polarity_detection(ho_Image, &hv_out_Value, &hv_Make); - if(hv_Make.D() == 1) + HObject in_Image; + HTuple out_Flag, out_ColorType; + MatToHObject(sourceImg, &in_Image); + + procedureCall.SetInputIconicParamObject("in_Image", in_Image);// + procedureCall.Execute();//执行halcon程序 + + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出图像类变量 + out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出控制类变量 + + if(out_Flag.D() == 1) { - int res1 = hv_out_Value[0].D(); - int res2 = hv_out_Value[1].D(); - if(res1 == 1) - putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); - else - putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); - - if (res2 == 1) - putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); - else - putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); - - //CAM1 为铜OK,CAM2为铝OK - if (res1 == 1 && res2 == 1)//铝 + int res1 = out_ColorType[0].D(); + int res2 = out_ColorType[1].D(); + //1铜 2铝+ + switch (res1) { - putTextHusky(Paint, utf8_to_gbk("NG").c_str(), cv::Point(Paint.cols - 800, 0), cv::Scalar(0, 0, 255), 500); - algoResult = 0; + case 0: + putTextHusky(Paint, utf8_to_gbk("异常").c_str(), cv::Point(0, 0), cv::Scalar(0, 0, 255), 300); + break; + case 1: + putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); + break; + case 2: + putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 500); + break; } - else + + switch (res1) + { + case 0: + putTextHusky(Paint, utf8_to_gbk("异常").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 0, 255), 300); + break; + case 1: + putTextHusky(Paint, utf8_to_gbk("铜").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); + break; + case 2: + putTextHusky(Paint, utf8_to_gbk("铝").c_str(), cv::Point(0, Paint.rows - 500), cv::Scalar(0, 255, 0), 500); + break; + + } + + //T 为铜OK,L为铝OK + if (res1 == 1 && res2 == 1)//铜ok { putTextHusky(Paint, utf8_to_gbk("OK").c_str(), cv::Point(Paint.cols - 800, 0), cv::Scalar(0, 255, 0), 500); algoResult = 1; } + else + { + putTextHusky(Paint, utf8_to_gbk("NG").c_str(), cv::Point(Paint.cols - 800, 0), cv::Scalar(0, 0, 255), 500); + algoResult = 0; + } } else putTextHusky(Paint, utf8_to_gbk("算法错误").c_str(), cv::Point(0, 50), cv::Scalar(0, 255, 0), 500); @@ -967,7 +997,7 @@ bool Hd_AI_algo_jiXing_cam1::AIdetect(cv::Mat img2D, QString mysaveKey, QString } //存图加入队列 -void Hd_AI_algo_jiXing_cam1::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey, QString savePath) +void Hd_AI_algo_jiXing_T::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey, QString savePath) { //存图数据加保存队列,加锁,避免数据访问冲突 saveStruct_mutex->lock(); @@ -979,7 +1009,7 @@ void Hd_AI_algo_jiXing_cam1::addImgToSaveStruct(cv::Mat img2D, QString mysaveKey saveStruct.enqueue(mySave); saveStruct_mutex->unlock(); } -void Hd_AI_algo_jiXing_cam1::saveImgThread() +void Hd_AI_algo_jiXing_T::saveImgThread() { while (1) { @@ -1009,7 +1039,7 @@ void Hd_AI_algo_jiXing_cam1::saveImgThread() } } //检测线程,应当只运行一次 -void Hd_AI_algo_jiXing_cam1::detectThread() +void Hd_AI_algo_jiXing_T::detectThread() { do { @@ -1065,7 +1095,7 @@ void Hd_AI_algo_jiXing_cam1::detectThread() } static int runNum = 0; -bool Hd_AI_algo_jiXing_cam1::run() +bool Hd_AI_algo_jiXing_T::run() { clock_t start, stop; start = clock(); @@ -1080,7 +1110,7 @@ bool Hd_AI_algo_jiXing_cam1::run() return true; } -bool Hd_AI_algo_jiXing_cam1::checkStatus() +bool Hd_AI_algo_jiXing_T::checkStatus() { status = moduleStatus; return status; diff --git a/BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.h b/BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.h similarity index 86% rename from BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.h rename to BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.h index bc62fae..346acf0 100644 --- a/BaseModules/Hd_AI_algo_jiXing_cam1/Hd_AI_algo_jiXing_cam1.h +++ b/BaseModules/Hd_AI_algo_jiXing_T/Hd_AI_algo_jiXing_T.h @@ -1,5 +1,5 @@ -#ifndef Hd_AI_algo_jiXing_cam1_H -#define Hd_AI_algo_jiXing_cam1_H +#ifndef Hd_AI_algo_jiXing_T_H +#define Hd_AI_algo_jiXing_T_H #include #include @@ -21,7 +21,9 @@ #include "base.h" #include "handleAI.h" #pragma execution_character_set("utf-8") +#include +using namespace HDevEngineCpp; //保存图片的结构体 @@ -32,14 +34,14 @@ struct saveImgStruct; // std::string savePath; //保存路径 //}; -//初始化流程(一次):Hd_AI_algo_jiXing_cam1,initParas +//初始化流程(一次):Hd_AI_algo_jiXing_T,initParas //运行流程:writeData主线程把数据传过来,run,readData此线程把数据传主线程 -class Hd_AI_algo_jiXing_cam1 :public Base +class Hd_AI_algo_jiXing_T :public Base { Q_OBJECT public: - Hd_AI_algo_jiXing_cam1(); - virtual ~Hd_AI_algo_jiXing_cam1(); + Hd_AI_algo_jiXing_T(); + virtual ~Hd_AI_algo_jiXing_T(); //从类中读数据到实例对象 bool readData(std::vector&,QByteArray&); //实例对象把数据写入到类 @@ -56,6 +58,7 @@ public: bool AIdetect(cv::Mat img2D, QString saveKey, QString Dir2D, QString SN, QString DataTime); private: + HDevEngine myEngine; int allNum = 0; int StationNo=0; int img2D = 2; @@ -101,8 +104,8 @@ private: extern "C" { - Q_DECL_EXPORT Hd_AI_algo_jiXing_cam1 * create(); - Q_DECL_EXPORT void destory(Hd_AI_algo_jiXing_cam1 * ptr); + Q_DECL_EXPORT Hd_AI_algo_jiXing_T * create(); + Q_DECL_EXPORT void destory(Hd_AI_algo_jiXing_T * ptr); } //保存图片的结构体 struct saveImgStruct diff --git a/BaseModules/Hd_AI_algo_jiXing_cam2/base.h b/BaseModules/Hd_AI_algo_jiXing_T/base.h similarity index 100% rename from BaseModules/Hd_AI_algo_jiXing_cam2/base.h rename to BaseModules/Hd_AI_algo_jiXing_T/base.h