This commit is contained in:
rci
2024-10-23 11:01:16 +08:00
parent da29e77880
commit 8d76094353
5 changed files with 1506 additions and 22 deletions
@@ -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" "halcon" "halconAlgo" "myTools" "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(
${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)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS network 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
Qt${QT_VERSION_MAJOR}::Network
)
# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY)
string(TIMESTAMP RUN_TIME)
message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME})
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,116 @@
#ifndef Hd_AI_algo_hanHou_H
#define Hd_AI_algo_hanHou_H
#include <assert.h>
#include <atlstr.h>
#include <chrono>
#include <QtCore/qglobal.h>
#include <QByteArray>
#include <iostream>
#include <QDebug>
#include <qqueue.h>
#include <opencv2/imgproc.hpp>
#include <string.h>
#include <fstream>
#include <string>
#include <ctime>
#include <halconcpp/HalconCpp.h>
#include <opencv2/opencv.hpp>
#include "imgproc/imgproc_c.h"
#include "base.h"
#include "handleAI.h"
#pragma execution_character_set("utf-8")
//保存图片的结构体
struct saveImgStruct;
//{
// cv::Mat out_Mat;
// std::string saveKey; //关键字,用于LOG日志
// std::string savePath; //保存路径
//};
//初始化流程(一次):Hd_AI_algo_hanHou,initParas
//运行流程:writeData主线程把数据传过来,run,readData此线程把数据传主线程
class Hd_AI_algo_hanHou :public Base
{
Q_OBJECT
public:
Hd_AI_algo_hanHou();
virtual ~Hd_AI_algo_hanHou();
//从类中读数据到实例对象
bool readData(std::vector<cv::Mat>&,QByteArray&);
//实例对象把数据写入到类
bool writeData(std::vector<cv::Mat>&, QByteArray&);
bool initParas(QByteArray&);
//运行(Logic_taskthread.cpp)
bool run();
//线程状态
bool checkStatus();// { return true; };
bool encodeResultValue(QVector<std::string> append_value,QByteArray &resultByte);
bool decodeAiValue(QByteArray byte,QVector<QByteArray> &vec_ret);
//---------检测流程,根据实际项目修改---------
bool AIdetect(cv::Mat img2D, QString saveKey, QString Dir2D, QString SN, QString DataTime);
handdleAI::pSegmentation* seg_hanHouSiLie;
handdleAI::pSegmentation* seg_hanHouFanZhe;
private:
int allNum = 0;
int StationNo=0;
int img2D = 2;
bool moduleStatus = true;
//输入图片队列
QQueue<cv::Mat> HikMat;
//输入关键字队列
QString saveKey="saveKey";
//结果路径文件夹队列
QString Dir2D="Dir2D";
//产品SN队列
QString SN="SN";
//产品时间戳队列
QString DateTime1="DateTime1";
int paramNum;
//是否使用线程检测方式
bool ifThreadRunDetect = false;
//检测结果图
std::vector<cv::Mat> resMat;
//检测结果
bool resIfNg = false;
QQueue<QByteArray> resByte;
//检测线程
void detectThread();
//存图线程
void saveImgThread();
//保存图片队列
QQueue<saveImgStruct> saveStruct;
//判断文件夹是否存在,不存在则创建
void isDirExist(QString fullDirName);
//存图加入队列
void addImgToSaveStruct(cv::Mat img2D, QString saveKey, QString savePath);
};
extern "C"
{
Q_DECL_EXPORT Hd_AI_algo_hanHou * create();
Q_DECL_EXPORT void destory(Hd_AI_algo_hanHou * ptr);
}
//保存图片的结构体
struct saveImgStruct
{
cv::Mat out_Mat;
std::string saveKey; //关键字,用于LOG日志
std::string savePath; //保存路径
};
#endif // Hd_AI_927_2D_module_H
+69
View File
@@ -0,0 +1,69 @@
#ifndef __BASECLASS_H__
#define __BASECLASS_H__
#include <iostream>
#include <QObject>
#include <QByteArray>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonArray>
class Base :public QObject
{
Q_OBJECT
public:
bool init_flag; //是否初始化,false,true
bool status = true; //相机状态(判断相机是否断开连接)
std::string paras; //传输数据
std::vector<cv::Mat> m_mat; //传输图片
std::string moduleName; //模块名称
public:
Base(){}
virtual ~Base(){}
virtual bool readData(std::vector<cv::Mat>&,QByteArray&){return true;}
virtual bool writeData(std::vector<cv::Mat>&,QByteArray&){return true;}
virtual bool initParas(QByteArray&){return true;}
virtual bool run() {return true;}
virtual bool checkStatus() { return true; }
//signals:
//QByteArrayList,根据实际项目进行解析;因不确定每个参数的长度,固用队列的方式。每个QByteArray表示一个值,使用时先转换为QString
//参数,例:返回结果图;相机关键字(SN或userID)+保存路径+缺陷信息列表(缺陷名称,缺陷位置int(x,y,w,h),画框颜色Scalar(a,b,c),缺陷面积double)
//void sendResultData(cv::Mat resMat, QJsonObject resQbj);
};
/*
//QJsonObject 转QByteArray
{
QJsonDocument document;
QJsonObject obj;
obj.insert(password, "pwd");
obj.insert(userName, "usr");
document.setObject(obj);
QByteArray abyte = document.toJson(QJsonDocument::Compact);
}
//QByteArray转QJsonObject
{
QByteArray ba = reply->readAll();
QJsonDocument doc = QJsonDocument::fromJson(ba);
QJsonObject obj = doc.object();
}
*/
/*
//从类中读数据到实例对象
virtual bool readData(std::vector<cv::Mat>&,QByteArray&){return true;}
*/
#endif
@@ -543,7 +543,10 @@ bool Hd_AI_algo_hanHou::readData(std::vector<cv::Mat>&vec_mat,QByteArray &data)
//if (allNum++ % 2 == 0)
// data = "2*3*2";// resByte.dequeue();
//else
data = "1*&" + fanzheResultText + "&" + silieResultText
data = "1*" + silieResultText + +"*" + fanzheResultText
+ "*" + jiErWidth + "*" + jiErHeight
+ "*" + hanYin1 + "*" + hanYin2
+ "&" + fanzheResultText + "&" + silieResultText
+ "+" + fanzheResultText + "+" + silieResultText
+ "+" + jiErWidth + "+" + jiErHeight
+ "+" + hanYin1 + "+" + hanYin2
@@ -746,8 +749,8 @@ bool Hd_AI_algo_hanHou::initParas(QByteArray& byte)
//StationNo = vec_ret.at(0).toInt();
seg_hanHouSiLie = handdleAI::CreateSegObjS("./model/seg-yuHanhanHouSiLie.BHD");
seg_hanHouFanZhe = handdleAI::CreateSegObjS("./model/seg-yuHanhanFanZhe.BHD");
seg_hanHouSiLie = handdleAI::CreateSegObjS("./model/seg-yuHanhanHouSiLie.BHD", 32, 0);
seg_hanHouFanZhe = handdleAI::CreateSegObjS("./model/seg-yuHanhanFanZhe.BHD",32 , 0);
//InitThreads(StationNo, img2D);
//InitModels(StationNo, img2D);
@@ -860,13 +863,13 @@ void halconAlgoProcess(cv::Mat& img,cv::Mat &Paint)//算法先画
hanYin2 = QByteArray::number(leftEdge);
putTextHusky(Paint, utf8_to_gbk("极耳高" + std::to_string(height)).c_str(),
cv::Point(0, 0), cv::Scalar(0, 255, 0), 300);
cv::Point(0, 0), cv::Scalar(0, 255, 0), 200);
putTextHusky(Paint, utf8_to_gbk("极耳宽" + std::to_string(weight)).c_str(),
cv::Point(0, 250), cv::Scalar(0, 255, 0), 300);
cv::Point(0, 200), cv::Scalar(0, 255, 0), 200);
putTextHusky(Paint, utf8_to_gbk("上间距" + std::to_string(upEdge)).c_str(),
cv::Point(0, 500), cv::Scalar(0, 255, 0), 300);
putTextHusky(Paint, utf8_to_gbk("下间距" + std::to_string(leftEdge)).c_str(),
cv::Point(0, 750), cv::Scalar(0, 255, 0), 300);
cv::Point(0, 400), cv::Scalar(0, 255, 0), 200);
putTextHusky(Paint, utf8_to_gbk("左间距" + std::to_string(leftEdge)).c_str(),
cv::Point(0, 600), cv::Scalar(0, 255, 0), 200);
}
else
putTextHusky(Paint, utf8_to_gbk("算法异常1").c_str(), cv::Point(0, 0), cv::Scalar(0, 255, 0), 300);
@@ -886,7 +889,7 @@ void siLieProcess(cv::Mat& segRes, cv::Mat& Paint,bool& result)
//int clsRes = clsPtr->Evaluate(clsImg);
cv::Scalar color = cv::Scalar(0, 0, 255, 30);
cv::rectangle(Paint, originRect, color, 4);
putTextHusky(Paint, utf8_to_gbk("撕裂").c_str(), cv::Point(rect.x - rect.width / 2, rect.y - rect.height / 2), cv::Scalar(0, 255, 0), 100);
putTextHusky(Paint, utf8_to_gbk("撕裂").c_str(), cv::Point(rect.x - rect.width / 2, rect.y - rect.height / 2 - 50), cv::Scalar(0, 255, 0), 50);
result = false;
}
}
@@ -905,7 +908,7 @@ void fanZheProcess(cv::Mat& segRes, cv::Mat& Paint, bool& result)
//int clsRes = clsPtr->Evaluate(clsImg);
cv::Scalar color = cv::Scalar(0, 0, 255, 30);
cv::rectangle(Paint, originRect, color, 4);
putTextHusky(Paint, utf8_to_gbk("翻折").c_str(), cv::Point(rect.x- rect.width/2, rect.y-rect.height/2), cv::Scalar(0, 255, 0), 100);
putTextHusky(Paint, utf8_to_gbk("翻折").c_str(), cv::Point(rect.x- rect.width/2, rect.y-rect.height/2-50), cv::Scalar(0, 255, 0), 50);
result = false;
}
}
@@ -941,19 +944,20 @@ bool Hd_AI_algo_hanHou::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir
// csvName.close();
//}
//sourceImg = cv::imread("D:\\mySN15-46-33-86.bmp",-1);
sourceImg = cv::imread("D:/1/Image_20241017204025590.bmp", -1);
//sourceImg = cv::imread("D:/1/Image_20241017204025590.bmp", -1);
cv::Mat Paint;
sourceImg.copyTo(Paint);
if(Paint.channels() == 1)
cv::Mat segProcess;
cv::resize(sourceImg, segProcess, cv::Size(), 0.5, 0.5);
segProcess.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, COLOR_GRAY2BGR);
QQueue<defectInfo> defectInfoList;
detect_mutex->lock();
auto futrue = std::async(std::launch::async, halconAlgoProcess, sourceImg, Paint);//异步执行
cv::Mat segProcess;
cv::resize(sourceImg, segProcess, cv::Size(), 0.5, 0.5);
//撕裂检测
cv::Mat siLieSegRes = ~seg_hanHouSiLie->Evaluate(segProcess);//撕裂
cv::Mat fanZheSegRes = ~seg_hanHouFanZhe->Evaluate(segProcess);//翻折
@@ -964,14 +968,25 @@ bool Hd_AI_algo_hanHou::AIdetect(cv::Mat img2D, QString mysaveKey, QString myDir
if (silieOk == true)//OK
putTextHusky(Paint, utf8_to_gbk("撕裂OK").c_str(), cv::Point(4800, 50), cv::Scalar(0, 255, 0), 500);
{
putTextHusky(Paint, utf8_to_gbk("撕裂OK").c_str(), cv::Point(1800, 50), cv::Scalar(0, 255, 0), 250);
silieResultText = "1";
}
else
putTextHusky(Paint, utf8_to_gbk("撕裂NG").c_str(), cv::Point(4800, 50), cv::Scalar(0, 0, 255), 500);
{
putTextHusky(Paint, utf8_to_gbk("撕裂NG").c_str(), cv::Point(1800, 50), cv::Scalar(0, 0, 255), 250);
silieResultText = "2";
}
if (fanZheOk == true)//OK
putTextHusky(Paint, utf8_to_gbk("翻折OK").c_str(), cv::Point(4800, 300), cv::Scalar(0, 255, 0), 500);
{
putTextHusky(Paint, utf8_to_gbk("翻折OK").c_str(), cv::Point(1800, 300), cv::Scalar(0, 255, 0), 250);
fanzheResultText = "1";
}
else
putTextHusky(Paint, utf8_to_gbk("翻折NG").c_str(), cv::Point(4800, 300), cv::Scalar(0, 0, 255), 500);
{
putTextHusky(Paint, utf8_to_gbk("翻折NG").c_str(), cv::Point(1800, 300), cv::Scalar(0, 0, 255), 250);
fanzheResultText = "2";
}
resMat.push_back(Paint);
QJsonArray detaillists;