This commit is contained in:
2025-01-16 09:16:35 +08:00
parent b6dede0622
commit deb6efaf5f
4 changed files with 1387 additions and 0 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,166 @@
#ifndef Hd_AI_algo_fanMianTieJiao_H
#define Hd_AI_algo_fanMianTieJiao_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")
using namespace handdleAI;
//保存图片的结构体
struct saveImgStruct;
//{
// cv::Mat out_Mat;
// std::string saveKey; //关键字,用于LOG日志
// std::string savePath; //保存路径
//};
//初始化流程(一次):Hd_AI_algo_fanMianTieJiao,initParas
//运行流程:writeData主线程把数据传过来,run,readData此线程把数据传主线程
class Hd_AI_algo_fanMianTieJiao :public Base
{
Q_OBJECT
public:
Hd_AI_algo_fanMianTieJiao();
virtual ~Hd_AI_algo_fanMianTieJiao();
//从类中读数据到实例对象
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(std::vector<cv::Mat>& img2D, QString saveKey, QString Dir2D, QString SN, QString DataTime);
private:
pSegmentation* seg_yicizhuyeCanye;
pClassification* cls_yicizhuyeCanye;
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_fanMianTieJiao * create();
Q_DECL_EXPORT void destory(Hd_AI_algo_fanMianTieJiao * ptr);
}
//保存图片的结构体
struct saveImgStruct
{
cv::Mat out_Mat;
std::string saveKey; //关键字,用于LOG日志
std::string savePath; //保存路径
};
static cv::Mat LocalCutImg_DET(pDetection* pDet, cv::Mat src, float zoom, int checkNameId, cv::Rect& cutRoi)
{
cv::Mat dst;
cv::resize(src, dst, cv::Size(src.cols / zoom, src.rows / zoom));
vector<Bbox> resultBox = pDet->Evaluate(dst); //结果为中心点+宽高
cv::Mat contourImg;
std::vector<std::vector<cv::Point>> contours;
//cv::threshold(dstImg, contourImg, pSeg->m_classes, 255, cv::THRESH_BINARY_INV);
//cv::findContours(contourImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
cv::Mat roiImg;
if (resultBox.size() <= 0)
{
cv::Mat rstMat = cv::Mat(100, 100, CV_8UC1, cv::Scalar(0, 0, 0));
cutRoi = cv::Rect(0, 0, 100, 100);
return rstMat;
}
double maxArea = 0;
int index = -1;
for (int j = 0; j < resultBox.size(); j++)
{
double area = resultBox[j].w * resultBox[j].h;
if (area >= maxArea)
{
maxArea = area;
index = j;
}
}
//cv::Rect rect = cv::boundingRect(contours[index]);
int addpixel = 15;
cutRoi.x = ((resultBox[index].x - resultBox[index].w / 2) * zoom);
cutRoi.y = ((resultBox[index].y - resultBox[index].h / 2) * zoom);
cutRoi.width = (resultBox[index].w * zoom);
cutRoi.height = (resultBox[index].h * zoom);
//cv::rectangle(src, cutRoi, cv::Scalar(0, 0, 255), 2, 8);
//cutRoi.x = rect.x * zoom;
//cutRoi.y = rect.y * zoom;
//cutRoi.width = rect.width * zoom;
//cutRoi.height = rect.height * zoom;
src(cutRoi).copyTo(roiImg);
return roiImg;
}
#endif // Hd_AI_927_2D_module_H
@@ -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