修复赢合单触发地址类型无法触发的问题。

添加三协预焊焊前模板。
This commit is contained in:
2025-10-09 11:11:58 +08:00
parent db7f238d12
commit fe9e64b945
10 changed files with 3438 additions and 5 deletions
+142
View File
@@ -0,0 +1,142 @@
#pragma once
#include <missionBase.hpp>
#include <detCallbackChain.hpp>
#include <share.h>
#include <QObject>
#include <opencvPaintAlgo.hpp>
#pragma region 基础函数
#define CATCH_EXCEPTIONS \
catch (HDevEngineCpp::HDevEngineException& ex) { \
std::cout << "HDevEngineException: " << ex.Message() << std::endl; \
qDebug() << "HDevEngineException: " << ex.Message(); \
} \
catch (HalconCpp::HException& ex) { \
std::cout << "Halcon Exception Caught!" << std::endl; \
std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \
std::cout << "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::cout << "Caught exception: " << e.what() << std::endl; \
qDebug() << "Caught exception: " << e.what(); \
}
struct sx_581_address {
int triggerAddr = -1;
int triggerValue = -1;
int snAddr = -1;
QByteArray completeAddr = "-1";
QByteArray resultAddr = "-1";
int valueOffsetAddr = -1;
};
class detParams {
public:
};
#pragma endregion
//算法回调函数需要包含完整的算法流程以及发送信号,发送ui图表,捕获异常,处理异常等操作
//并且注意 异常可能会导致运行不到发送信号的函数,请在处理异常时发送异常结果
static bool generalAlgoTest(std::shared_ptr <detData> data, detParams* _detParams, sx_581_address address) {
try {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
std::vector < std::string> defects = {"测试"};
///////////////////取图//处理//////////////////
if (data->oriImgs.size() < 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
if (data->oriImgs[0].rows == 100) {
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2);
return false;
}
cv::Mat Paint;
QMutex paintMutex;
clock_t start, finish;
start = clock();
cv::Mat src1 = data->oriImgs[0];
if (src1.channels() != 3)
cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR);
else
src1.copyTo(Paint);
TextRendererZH textPainter(Paint.cols, Paint.rows, 15);
textPainter.putText(Paint, "划伤", cv::Point(10,10), cv::Scalar(0, 255, 0));
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
data->service->_missionResultHandle->handleAllResult(data->SNcode, !defects.size() > 0, defects);//发送图标操作
data->resultImgs.push_back(Paint);
return true;
}
CATCH_EXCEPTIONS
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果
return false;
}
template <typename paramTemplte>
//此类适用于单相机多触发地址单次判断的情况,比如密封钉,三协机台
//例触发地址有4个,输入信号为 1 0 0 1 则按顺序触发1和4的地址拍照检测,2和3不做处理
class _581_SX_Single_triggerTemplate {
public:
paramTemplte _detParams;
detCallbackChain<paramTemplte, sx_581_address>* generalDet;
std::string cameraName;
QString viewerName;
std::vector<sx_581_address>address;
/// <summary>
/// 初始化
/// </summary>
/// <param name="cameraNameIn">相机名</param>
/// <param name="viewerNameIN">窗口名</param>
/// <param name="startAddr">开始地址</param>
/// <param name="triggerCount">触发信号数</param>
/// <param name="oneTriggerCaptrueTimes">单次触发调用几次相机模块</param>
/// <param name="detParamsIn">参数输入</param>
/// <param name="_serviceManagerIn">默认</param>
/// <param name="bridgeIn">默认</param>
/// <param name="_processAlgoCallback">算法函数</param>
/// <param name="resultHandlerIn"></param>
void init(std::string cameraNameIn, QString viewerNameIN, std::vector<sx_581_address> addressIN, int oneTriggerCaptrueTimes,
paramTemplte& detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn,
typename detCallbackChain<paramTemplte, sx_581_address>::processAlgoCallback _processAlgoCallback,
QString saveObjectNameIN = "") {
viewerName = viewerNameIN;
cameraName = cameraNameIn;
_serviceManager = _serviceManagerIn;
_detParams = detParamsIn;
bridge = bridgeIn;
address = addressIN;
saveObjectName = saveObjectNameIN;
generalDet = new detCallbackChain<paramTemplte, sx_581_address>(_serviceManager, &_detParams, bridge);
generalDet->registerProcessAlgoCallback(_processAlgoCallback);
//单次触发器条件
for (int i = 0; i < addressIN.size(); i++) {
//注册单触发器 触发地址置1时触发
_serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 1, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) {
evaluate(i, byteArray);}, "");
}
}
//获取图片并进行检测
void evaluate(int batteryOffset, QByteArray& byteArray) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(address[0].triggerAddr) + "_0");//触发信号清零
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);//获取相机
camera->clearCache();//清除缓存
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(address[batteryOffset].triggerAddr), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
data->saveObjectName = saveObjectName;
generalDet->ansyncProcess(data, address[batteryOffset], ("D" + address[0].completeAddr + "_0"));//处理算法 并在取到图片后发送完成信号
data->resultImgShowSet.push_back(showImgPack(viewerName, "结果图"));
}
private:
QString saveObjectName = "";
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
+1 -1
View File
@@ -218,7 +218,7 @@ public:
//单次触发器条件
for (int i = 0; i < triggerCount; i++) {
//注册单触发器 触发地址置1时触发
_serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 0, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) {
_serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 1, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) {
evaluate(i, byteArray);}, "");
//注册清除完成信号触发器 任意触发地址归零时触发一次
_serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 0, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) {
+4 -3
View File
@@ -26,17 +26,18 @@ public:
}
//异步启动检测
void ansyncProcess(std::shared_ptr <detData> data, addressTemplate address = addressTemplate()) {
QFuture<void> future = QtConcurrent::run([this, data, address]() {
void ansyncProcess(std::shared_ptr <detData> data, addressTemplate address, QByteArray completeSignal = "") {
QFuture<void> future = QtConcurrent::run([this, data, address, completeSignal]() {
process(data, address);
});
}
//启动检测
void process(std::shared_ptr <detData> data, addressTemplate address = addressTemplate()) {
void process(std::shared_ptr <detData> data, addressTemplate address, QByteArray completeSignal = "") {
data->service = _serviceManager;
while (data->oriImgs.size() < data->imgAmountMin) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
_triggerManager->writeShort(completeSignal);
//等待图片满足要求后,储存原图,异步执行算法函数
auto resultData = algoEvaluate(data, _handleAiModels, address);
// 确保线程安全退出
+1 -1
View File
@@ -27,7 +27,7 @@
#include "front/pages/historyWidget.h"
#include <appConfig/appConfig.h>
#include "front/pages/pluginManagerWidget.hpp"
#include "front/pages/summary_data_page.h"
#include "front/pages/summaryDataPage.h"
#include <qtBridge.h>
#include <hardwareInfo.h>
#pragma execution_character_set("utf-8")
+46
View File
@@ -1,15 +1,59 @@
#include <missionBase.hpp>
#include <yhGlobal.h>
#include "cal_disJiao.h"
class mfd_detParams {
public:
int biaoding = 0;
};
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
# include "HalconCpp.h"
using namespace HDevEngineCpp;
using namespace HalconCpp;
static bool ManHan(std::shared_ptr <detData> data, mfd_detParams* _detParams, yh_581_address address){
HObject ho_in_image;
HTuple hv_out_standardPar;
HTuple hv_out_flat;
HTuple in_ProductType;
HTuple hv_out_disLeftVertical;
HTuple hv_out_LeftVerticalLinePar;
HTuple hv_out_disLeftLevel;
HTuple hv_out_LeftLevelLinePar;
HTuple hv_out_disRightVertical;
HTuple hv_out_RightVerticalLinePar;
HTuple hv_out_disRightLevel;
HTuple hv_out_RightLevelLinePar;
cv::Mat img = cv::imread("D:/CCD/2025-10-04-19-57-14-928_04QCB6CJ27501JFA40006167_camera4_3.bmp", -1);
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
cv::threshold(img, img, 60, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(img, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
if (contours.size() != 0)
{
for (int j = 0; j < contours.size(); j++)
{
cv::Rect rect = cv::boundingRect(contours[j]);
if (rect.width > 1000 && rect.height > 900 )
{
return true;
}
}
}
//cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
ho_in_image = MatToHObject(img);
in_ProductType = "181-2";
cal_distanceJiao_4(ho_in_image, in_ProductType, &hv_out_standardPar, &hv_out_flat,
&hv_out_disLeftVertical, &hv_out_LeftVerticalLinePar, &hv_out_disLeftLevel,
&hv_out_LeftLevelLinePar, &hv_out_disRightVertical, &hv_out_RightVerticalLinePar,
&hv_out_disRightLevel, &hv_out_RightLevelLinePar);
int falg = hv_out_flat.I();
return true;
std::map<QString, QVariant> sqlMapData;
sqlMapData["项目"] = "上钉";
sqlMapData["相机"] = "相机" + address.triggerAddr;
@@ -283,6 +327,8 @@ static bool YuHan(std::shared_ptr <detData> data, mfd_detParams* _detParams, yh_
return true;
}
#pragma endregion
class _581_Mfd : public mission {
public:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,8 @@
#include <581_YuHan_hanqian.h>
mission* createMission() {
return new _581_YuHan_hanqian();
}
void destroyMission(mission* _mission) {
delete _mission;
}
@@ -0,0 +1,255 @@
#include <missionBase.hpp>
#include <sxGlobal.h>
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
#pragma endregion
class yuHanHanQianParams {
public:
handleAiModelSeg* segDingWei = nullptr;
handleAiModelSeg* segJiErFanZhe = nullptr;
handleAiModelCls* clsJiErFanZhe = nullptr;
};
void halconProcess(cv::Mat& sourceImg, cv::Mat& Paint) {
try {
HDevEngineCpp::HDevProcedure proc("Inspection_YH_JE");
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
HObject in_Image = MatToHObject(sourceImg);
procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图像类变量
procedureCall.Execute();//执行halcon程序
HTuple out_X, out_Y, out_Flag;
out_X = procedureCall.GetOutputCtrlParamTuple("out_X");
out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y");
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
if (out_Flag.D() == 0) {
for (int i = 0; i < out_X.Length(); i++)
Paint.at<cv::Vec3b>(out_X[i].D(), out_Y[i].D()) = { 255,255,0 };
}
}
catch (HDevEngineCpp::HDevEngineException& ex) {
std::cout << "HDevEngineException: " << ex.Message() << std::endl; \
qDebug() << "HDevEngineException: " << ex.Message(); \
}
catch (HalconCpp::HException& ex) {
std::cout << "Halcon Exception Caught!" << std::endl; \
std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \
std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \
qDebug() << "Halcon Exception Caught!"; \
qDebug() << "Error Code: " << ex.ErrorCode(); \
qDebug() << "Error Message: " << ex.ErrorMessage(); \
}
}
cv::Rect getImageLocateRect(cv::Mat& src, handdleAI::pSegmentation* seg, double bounus = 0.1) {
cv::Mat tmpImg;
cv::resize(src, tmpImg, cv::Size(), bounus, bounus);
cv::Mat ouput = ~seg->Evaluate(tmpImg);
auto rect = findMaxAreaContour(ouput);
rect.x /= bounus; rect.y /= bounus;
rect.width /= bounus; rect.height /= bounus;
return rect;
}
bool handleAiProcess(cv::Mat& seg_detImg, cv::Mat& seg_Paint,
handdleAI::pSegmentation* segPtr, handdleAI::pClassification* clsPtr,
std::vector< std::pair <std::string, cv::Mat>>& clsImgs){
cv::Mat segResizeImg;
float resizeRate = 1.0;
cv::resize(seg_detImg, segResizeImg, cv::Size(), 1.0 / resizeRate, 1.0 / resizeRate);
cv::Mat seg_ResultImg = ~segPtr->Evaluate(segResizeImg);
cv::resize(seg_ResultImg, seg_ResultImg, cv::Size(), resizeRate, resizeRate);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(seg_ResultImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
bool finalNg = false;
for (int i = 0; i < contours.size(); i++)
{
cv::Rect cls_rect = cv::boundingRect(contours[i]);
if (cls_rect.width < 50 || cls_rect.height < 50)
continue;
#if 1
std::vector<cv::Mat> clsImgVec = cutImg2ClsVec(cls_rect, seg_detImg);
std::vector<int> clsRes;//true ok
bool isNg = false;
for (auto& cls : clsImgVec) {
cv::resize(cls, cls, cv::Size(128, 128));//根据需要设定大小
int Result = clsPtr->Evaluate(cls);
if (Result != 0)isNg = true;
clsRes.push_back(Result);
clsImgs.push_back({ std::to_string(Result) ,cls });
}
if (isNg == true) {
cv::Scalar color = cv::Scalar(0, 255, 255, 30);
cv::rectangle(seg_Paint, cls_rect, color, 4);
drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3);
finalNg = true;
}
else {
//drawContours(seg_Paint, contours, i, cv::Scalar(0, 255, 0, 30), 3);
}
#else
bool isNg = false;
cv::Mat clsImage = cutLabelImg(seg_detImg, 200, 200, cls_rect, 0, 1, 1);
int Result = clsPtr->Evaluate(clsImage);
if (Result != 0) {
isNg = true;
cv::Scalar color = cv::Scalar(0, 255, 255, 30);
cv::rectangle(seg_Paint, cls_rect, color, 4);
drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3);
finalNg = true;
}
else {
}
clsImgs.push_back({ Result , clsImage });
#endif
}
return finalNg;
}
bool jiErFanZhe(std::shared_ptr <detData> data, yuHanHanQianParams* _detParams, sx_581_address address) {
try{
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
cv::Mat resultImage = img2D.clone();
if (resultImage.channels() == 1) {
cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR);
}
QString okng_tag = "OK";
cv::Mat seg_detectImage;
cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1);
plcResult = "1";
bool isNG = false;
if (DOGLIVE) {
std::vector<std::pair <int, cv::Mat >>clsImgs;
bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs);
for (int i = 0; i < clsImgs.size(); i++) {
addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first));
}
}
if (isNG == false)//OK
{
putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200);
okng_tag = "OK";
}
else
{
putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200);
plcResult = "2";
}
cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5);
resMat.push_back(resultImage);
if (resMat.size() > 0)
{
addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图
}
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
//存图数据加保存队列,加锁,避免数据访问冲突
QByteArray plcResult = "2";
cv::Mat sourceImg;
data->oriImgs[0].copyTo(sourceImg);
cv::Mat Paint;
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
halconProcess(sourceImg, Paint);
float resizeRate = 5.0;
auto rect = getImageLocateRect(sourceImg, _detParams->segDingWei->segPtr, 1.0 / resizeRate);//定位
rect = rect & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows));//防止越界
bool isNG = false;
cv::Mat seg_saveImg;
if (rect.width > 500 || rect.height > 500) {
isNG = handleAiProcess(sourceImg(rect), Paint(rect), _detParams->segJiErFanZhe->segPtr, _detParams->clsJiErFanZhe->clsPtr, data->clsOriginImgs);
cv::rectangle(Paint, rect, cv::Scalar(0, 255, 255), 3);
cv::resize(sourceImg(rect), seg_saveImg, cv::Size(), 0.5, 0.5);
}
else {
isNG = true;
}
QString okNgSaveText = "NG";
TextRendererZH textPainter(Paint.cols, Paint.rows, 15);
if (isNG == false)//OK
{
textPainter.putText(Paint, "OK", cv::Point(1000, 50), cv::Scalar(0, 255, 0));
okNgSaveText = "OK";
}
else
{
textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0));
data->aiDetOK = false;
plcResult = "2";
}
plcResult = "1";//强制OK
data->resultImgs.push_back(Paint);
sourceImg.release();
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
#endif
}
CATCH_EXCEPTIONS
qDebug() << "[Error] " << QString::fromUtf8("检测失败!");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 15);
textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈
return true;
}
class _581_YuHan_hanqian : public mission {
public:
_581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_top_1;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_down_2;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_top_3;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_down_4;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_top_5;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_down_6;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_top_7;
_581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_down_8;
yuHanHanQianParams tongDetParams;
yuHanHanQianParams lvDetParams;
void onConfigReloaded() {
HDevEngineCpp::HDevEngine myEngine;
myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl");
tongDetParams.segDingWei = _serviceManager->_handleAiModelManager->getSegModel("segDingWei_GPU0");
tongDetParams.segJiErFanZhe = _serviceManager->_handleAiModelManager->getSegModel("segTongJiErFanZhe_GPU0");
tongDetParams.clsJiErFanZhe = _serviceManager->_handleAiModelManager->getClsModel("clsTongJiErFanZhe_GPU0");
lvDetParams.segDingWei = _serviceManager->_handleAiModelManager->getSegModel("clsLvJiErFanZhe_GPU1");
lvDetParams.segJiErFanZhe = _serviceManager->_handleAiModelManager->getSegModel("segLvJiErFanZhe_GPU1");
lvDetParams.clsJiErFanZhe = _serviceManager->_handleAiModelManager->getClsModel("clsLvJiErFanZhe_GPU1");
}
bool initCustom() {
#pragma region 注册触发器回调
in_lv_top_1.init("Camera1", "极耳翻折-铝-内-相机1(顶部)", { { 522, 1,540,"523","530",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe);
in_lv_down_2.init("Camera2", "极耳翻折-铝-内-相机2(底部)", { { 524, 1,620,"525","532",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe);
in_tong_top_3.init("Camera3", "极耳翻折-铜-内-相机3(顶部)", { { 526,1,540,"527","534",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe);
in_tong_down_4.init("Camera4", "极耳翻折-铜-内-相机4(底部)", { { 528, 1,620,"529","536",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe);
out_lv_top_5.init("Camera5", "极耳翻折-铝-外-相机5(顶部)", { { 562,1,580,"563","570",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe);
out_lv_down_6.init("Camera6", "极耳翻折-铝-外-相机6(底部)", { { 564, 1,660,"565","572",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe);
out_tong_top_7.init("Camera7", "极耳翻折-铜-外-相机7(顶部)", { { 566, 1,580,"567","574",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe);
out_tong_down_8.init("Camera8", "极耳翻折-铜-外-相机8(底部)", { { 568, 1,660,"569","576",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe);
#pragma endregion
return true;
}
};
#pragma once
@@ -0,0 +1,78 @@
# 获取获取当前目录名
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 Sql REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Sql 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
Qt${QT_VERSION_MAJOR}::Sql
)
# 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})