备份
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <nlohmannJson.hpp>
|
||||
#pragma once
|
||||
#include <nlohmannJson.hpp>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
@@ -122,14 +123,4 @@ static void printNlohmannJson(nlohmann::json input, int depth = 0)
|
||||
else if (input.is_null()) {
|
||||
std::cout << indent_str << "null\n";
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T getOrInit(nlohmann::json& j, const std::string& key, const T& def) {
|
||||
if (!j.contains(key) || j[key].is_null()) {
|
||||
j[key] = def; // 如果键不存在或值为 null,初始化为默认值
|
||||
return def;
|
||||
}
|
||||
return j[key].get<T>(); // 返回键对应的值
|
||||
}
|
||||
#pragma once
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <handleAI.h>
|
||||
#include <QString>
|
||||
#include <QByteArray>
|
||||
#include <chrono>
|
||||
#include <QTextCodec>
|
||||
#pragma once
|
||||
using namespace HalconCpp;
|
||||
|
||||
+22
-4
@@ -55,6 +55,24 @@ public:
|
||||
|
||||
//算法回调函数需要包含完整的算法流程以及发送信号,发送ui图表,捕获异常,处理异常等操作
|
||||
//并且注意 异常可能会导致运行不到发送信号的函数,请在处理异常时发送异常结果
|
||||
|
||||
|
||||
void generalExceptionResume(std::shared_ptr<detData> data, yh_581_address address, QString why = "") {
|
||||
qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why;
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
if (Paint.channels() == 1)
|
||||
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
|
||||
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
|
||||
textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0));
|
||||
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
|
||||
data->resultImgs.push_back(Paint);
|
||||
if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool())
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
|
||||
else
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈
|
||||
}
|
||||
static bool generalAlgoTest(std::shared_ptr <detData> data, detParams* _detParams, yh_581_address address) {
|
||||
try {
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
@@ -82,9 +100,9 @@ static bool generalAlgoTest(std::shared_ptr <detData> data, detParams* _detParam
|
||||
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);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
|
||||
textPainter.putText(Paint, "OK", cv::Point(10,10), cv::Scalar(0, 255, 0));
|
||||
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.123");//发送数据1
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2)+ "_0.456");//发送数据2
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
@@ -96,8 +114,8 @@ static bool generalAlgoTest(std::shared_ptr <detData> data, detParams* _detParam
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果
|
||||
return false;
|
||||
}
|
||||
template <typename paramTemplte>
|
||||
|
||||
template <typename paramTemplte>
|
||||
//此类适用于单相机多触发地址需要联合判断的情况的情况 比如顶盖焊,包膜,入壳机台
|
||||
//例触发地址有4个,输入信号为 1 0 0 1 则触发1和4的地址拍照检测,2和3拍照取图并废弃
|
||||
class _581_Union_triggerTemplate {
|
||||
|
||||
@@ -99,7 +99,7 @@ public:
|
||||
// 通用的检测结果处理
|
||||
void detectionResultHandle(std::shared_ptr<detData> data) {
|
||||
//计算处理总耗时(CT)
|
||||
QString totalCtStr = "algoCT->" + QString::number(data->algoTime) + "ms|SN" + QString::fromStdString(data->SNcode);
|
||||
QString totalCtStr = data->uuid + QString::fromStdString(data->SNcode) + "algoCT->" + QString::number(data->algoTime) + "ms|SN" + QString::fromStdString(data->SNcode);
|
||||
qDebug() << totalCtStr;
|
||||
//std::cout << totalCtStr.toStdString() << std::endl;
|
||||
// 将耗时数据等保存入数据库或日志
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <QDebug>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
|
||||
#include <interface.h>
|
||||
|
||||
|
||||
class paramSyncManager :public QObject{
|
||||
@@ -155,9 +155,9 @@ public:
|
||||
updateJsonFromMap();
|
||||
return json;
|
||||
}
|
||||
|
||||
//遍历 map,重新构建嵌套的 JSON 结构
|
||||
void updateJsonFromMap() {
|
||||
//遍历 map,重新构建嵌套的 JSON 结构
|
||||
nlohmann::ordered_json newJson;
|
||||
for (auto it = map.begin(); it != map.end(); ++it) {
|
||||
QString key = it.key();
|
||||
|
||||
@@ -168,20 +168,21 @@ public:
|
||||
QString paramName = parts.mid(1).join('.');
|
||||
|
||||
//确保组存在
|
||||
if (json.find(group.toStdString()) == json.end()) {
|
||||
json[group.toStdString()] = nlohmann::ordered_json::object();
|
||||
if (newJson.find(group.toStdString()) == newJson.end()) {
|
||||
newJson[group.toStdString()] = nlohmann::ordered_json::object();
|
||||
}
|
||||
//添加参数到组
|
||||
json[group.toStdString()][paramName.toStdString()] = qVariantToJson(it.value());
|
||||
newJson[group.toStdString()][paramName.toStdString()] = qVariantToJson(it.value());
|
||||
}
|
||||
else {
|
||||
json[key.toStdString()] = qVariantToJson(it.value());
|
||||
newJson[key.toStdString()] = qVariantToJson(it.value());
|
||||
}
|
||||
}
|
||||
missionKey.clear();
|
||||
for (auto it = json.begin(); it != json.end(); ++it) {
|
||||
for (auto it = newJson.begin(); it != newJson.end(); ++it) {
|
||||
missionKey.push_back(QString::fromStdString(it.key()));
|
||||
}
|
||||
json = newJson;
|
||||
}
|
||||
|
||||
// 清空所有参数
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
#include <detData.h>
|
||||
#include <cameraManager.h>
|
||||
#include <backendInterface.h>
|
||||
#include <generalJsonParsing.hpp>
|
||||
triggerManager::triggerManager(ServiceManager* _serviceManager, bSignalHub* bridgeIn,nlohmann::ordered_json& triggerJson){
|
||||
|
||||
triggerManager::triggerManager(ServiceManager* _serviceManager, bSignalHub* bridgeIn,nlohmann::ordered_json& triggerJson)
|
||||
{
|
||||
bridge = bridgeIn;
|
||||
dManager = _serviceManager->_detDataManager;
|
||||
_cameraManager = _serviceManager->_cameraManager;
|
||||
@@ -19,8 +19,10 @@ triggerManager::triggerManager(ServiceManager* _serviceManager, bSignalHub* brid
|
||||
|
||||
triggerFileName = QString::fromStdString(triggerJson["moduleName"]);
|
||||
IpAndPort = QString::fromStdString(triggerJson["initStr"]);
|
||||
heartBeatIntervalMS = triggerJson["heartBeatIntervalMS"];
|
||||
sleepIntervalMS = triggerJson["sleepIntervalMS"];
|
||||
|
||||
heartBeatIntervalMS = triggerJson.value("heartBeatIntervalMS",1);
|
||||
sleepIntervalMS = triggerJson.value("sleepIntervalMS", 1);
|
||||
|
||||
std::vector<std::string> heartbeats = triggerJson["heartBeatCmd"];
|
||||
for (auto& cmd : heartbeats) {
|
||||
heartBeatCmds.push_back(QString::fromStdString(cmd));
|
||||
@@ -152,7 +154,6 @@ void triggerManager::decodeCameraCMD(readAllStruct& _struct, QByteArray byte)
|
||||
checkPlcValueViewer(_struct, byte);
|
||||
}
|
||||
|
||||
|
||||
void triggerManager::checkCallback(readAllStruct _struct, QByteArray& byteArray) {//检查是否符合回调函数的触发条件
|
||||
QMutexLocker locer(&mutex);
|
||||
for (auto callback : triggerCallbackFuncs[_struct.readAllCmd])
|
||||
@@ -249,7 +250,7 @@ void triggerManager::checkPlcValueViewer(readAllStruct& _struct, QByteArray& byt
|
||||
|
||||
if (newValue != data.value) {
|
||||
data.value = newValue;
|
||||
if (data.type == finsFloat)
|
||||
if (data.type == finsFloat)
|
||||
emit bridge->runCommand_refeshPlcValueViewer(data.valueAddr,
|
||||
QString::number(data.value.toDouble(), 'f', 4));
|
||||
else
|
||||
@@ -258,4 +259,5 @@ void triggerManager::checkPlcValueViewer(readAllStruct& _struct, QByteArray& byt
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class detDataManager;
|
||||
class lightSourceManager;
|
||||
class ServiceManager;
|
||||
|
||||
// 将此静态函数加入到类 triggerManager 的合适位置(如 private 部分)
|
||||
//从fins中读取浮点型
|
||||
static float readFinsFloatFromQByteArray(const QByteArray& buf, int startByteIndex, bool highLowConversion) {
|
||||
if (buf.isEmpty()) {
|
||||
return 0.0f;
|
||||
@@ -54,6 +54,18 @@ static float readFinsFloatFromQByteArray(const QByteArray& buf, int startByteInd
|
||||
std::memcpy(&value, &raw, sizeof(float));
|
||||
return value;
|
||||
}
|
||||
//将字符串转换为供发送的语句
|
||||
static QByteArray convertStringForFins(const QString& text) {
|
||||
QByteArray sendText;
|
||||
for (int i = 0; i < text.size() / 2; i ++)
|
||||
sendText += QByteArray::number(text[i * 2].unicode() + text[i * 2 + 1].unicode() * 256) + ",";
|
||||
|
||||
if (text.size() % 2 == 1)
|
||||
sendText += QByteArray::number(text[text.size() - 1].unicode());
|
||||
else
|
||||
sendText.chop(1);
|
||||
return sendText;
|
||||
}
|
||||
//防止重复触发
|
||||
class triggerLockerT {
|
||||
public:
|
||||
@@ -320,9 +332,7 @@ public:
|
||||
std::map<QByteArray, std::vector<triggerCallbackStruct>> triggerCallbackFuncs;
|
||||
|
||||
//联合条件的触发器注册
|
||||
bool registerUnionCallback(std::vector<std::pair<int, int>> triggerAddressAndValue,
|
||||
conditionMode mode,
|
||||
uniontriggerCallback func, std::string funcName) {
|
||||
bool registerUnionCallback(std::vector<std::pair<int, int>> triggerAddressAndValue,conditionMode mode,uniontriggerCallback func, std::string funcName) {
|
||||
QMutexLocker locer(&mutex);
|
||||
if (triggerAddressAndValue.size() < 2) {
|
||||
qCritical() << "联合触发器至少需要两个条件";
|
||||
|
||||
+35
-12
@@ -1,21 +1,44 @@
|
||||
#include <iostream>
|
||||
#include <opencv.hpp>
|
||||
#include <handleAI.h>
|
||||
#include <simpleAlgo.h>
|
||||
#include <global.h>
|
||||
using namespace std;
|
||||
|
||||
|
||||
void baomoXiaDMianCut(const std::string path, const std::string format, const std::string outputPath) {
|
||||
void baomoXiaDMianCut(const std::string path, const std::string format, const std::string outputPath,cv::Size fillter) {
|
||||
//int
|
||||
//handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImgFiles/baoMoXiaDaMian_seg.BHD", 1, 0);
|
||||
//std::vector<std::string> images;
|
||||
//cv::glob(path + "/*." + format, images, false);
|
||||
//for (size_t i = 0; i < images.size(); i++) {
|
||||
// cv::Mat srcImage = cv::imread(images[i],-1);
|
||||
// if (srcImage.empty()) {
|
||||
// std::cout << "ͼƬΪ¿Õ£¡" << std::endl;
|
||||
// continue;
|
||||
// }
|
||||
// auto SegResult = ~seg->Evaluate(srcImage);
|
||||
handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImgFiles/baoMoXiaDaMian_seg.BHD", 1, 0);
|
||||
std::vector<std::string> images;
|
||||
cv::glob(path + "/*." + format, images, false);
|
||||
for (size_t i = 0; i < images.size(); i++) {
|
||||
std::string filePath = outputPath + "/" + std::to_string(i) + "/";
|
||||
createDirectoryIfNotExists(QString::fromStdString(filePath));
|
||||
cv::Mat srcImage = cv::imread(images[i], -1);
|
||||
cv::Mat Paint;
|
||||
if (srcImage.cols == 1)
|
||||
cv::cvtColor(srcImage, Paint, cv::COLOR_GRAY2BGR);
|
||||
else
|
||||
srcImage.copyTo(Paint);
|
||||
|
||||
//}
|
||||
if (srcImage.empty()) {
|
||||
std::cout << "ͼƬΪ¿Õ£¡" << std::endl;
|
||||
continue;
|
||||
}
|
||||
auto SegResult = ~seg->Evaluate(srcImage);
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
cv::findContours(SegResult,contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
for (int ii = 0; ii < contours.size(); ii++) {
|
||||
cv::Rect rect = cv::boundingRect(contours[i]);
|
||||
if (rect.width > fillter.width || rect.height > fillter.height) {
|
||||
cv::putText(Paint, std::to_string(i), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(255, 255, 255), 5);
|
||||
cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3);
|
||||
auto imgs = cutImg2ClsVec(rect, srcImage);
|
||||
for (int o = 0; o < imgs.size(); o++) {
|
||||
cv::imwrite(filePath + "/" + std::to_string(ii) + "_" + std::to_string(o) + "CLS.bmp",imgs[o]);
|
||||
}
|
||||
}
|
||||
}
|
||||
cv::imwrite(filePath + "/Paint.bmp", Paint);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
std::cout << "hello world" << std::endl;
|
||||
//baomoXiaDMianCut(
|
||||
return 1;
|
||||
}
|
||||
@@ -318,7 +318,7 @@ namespace Auth {
|
||||
// 显示权限不足的弹窗
|
||||
QMessageBox::warning(nullptr,
|
||||
TR("Insufficient permissions"),
|
||||
QString(TR("您没有足够的权限执行此操作。\n\n需要权限级别: %1\n当前权限级别: %2"))
|
||||
QString(TR("You do not have sufficient permissions to perform this action.\n\nRequired level: %1\nCurrent level: %2"))
|
||||
.arg(QString::fromStdString(userLevelToString(requiredLevel)))
|
||||
.arg(QString::fromStdString(userLevelToString(currentUserLevel))));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
#include <581-BaoMo-Cam1213.h>
|
||||
|
||||
struct halconResult {
|
||||
double resultX = -99;
|
||||
double resultY = -99;
|
||||
};
|
||||
halconResult dituo(std::shared_ptr <detData> data,cv::Mat& src, cv::Mat& Paint,bool isLeft) {
|
||||
halconResult result;
|
||||
try {
|
||||
cv::Mat srcHalf;
|
||||
cv::resize(src, srcHalf, cv::Size(0, 0), 0.5, 0.5);
|
||||
if (srcHalf.channels() != 3)
|
||||
cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR);
|
||||
else
|
||||
srcHalf.copyTo(Paint);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 50);
|
||||
|
||||
HalconCpp::HObject in_Image = MatToHObject(src);
|
||||
HDevEngineCpp::HDevProcedure proc("_4_TD_BlueCover_Inspection");
|
||||
HDevProcedureCall procedureCall(proc);
|
||||
|
||||
//vs+halcon联调debug
|
||||
/*HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.StartDebugServer();
|
||||
procedureCall.SetWaitForDebugConnection(true);*/
|
||||
|
||||
HTuple in_Par, in_FilePath("./halconFiles/");
|
||||
in_Par[0] = data->service->_paramSyncManager->get("底托检测", "宽度阈值(mm)", 150).toInt();
|
||||
in_Par[1] = data->service->_paramSyncManager->get("底托检测", "高度阈值(mm)", 150).toInt();
|
||||
in_Par[2] = data->service->_paramSyncManager->get("底托检测", "面积阈值(mm)", 300).toInt();
|
||||
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
|
||||
procedureCall.SetInputCtrlParamTuple("in_Par", in_Par);
|
||||
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
|
||||
procedureCall.Execute();
|
||||
HTuple out_X = procedureCall.GetOutputCtrlParamTuple("out_X");
|
||||
HTuple out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y");
|
||||
HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
|
||||
HTuple out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails");
|
||||
int outFlag = out_Flag.D();
|
||||
//handleAiFuture.wait();
|
||||
//_result = handleAiFuture.get();
|
||||
if (outFlag == 1) {
|
||||
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
else {
|
||||
data->halconOK = false;
|
||||
for (int i = 0; i < out_Y.Length() / 2 - 1; i++) {
|
||||
cv::circle(Paint, cv::Point(out_X[i * 2 + 1].D(), out_Y[i * 2].D()) / 2, 1,
|
||||
cv::Scalar(0, 0, 255), 1);
|
||||
}
|
||||
std::string ngDetails = out_NgDetails.ToString().Text();
|
||||
result.resultX = out_X.D();
|
||||
result.resultY = out_Y.D();
|
||||
if (isLeft == true) {
|
||||
textPainter.putText(Paint, "缺陷长度:" + std::to_string(result.resultX) + "mm", cv::Point(700, 800), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "缺陷宽度:" + std::to_string(result.resultY) + "mm", cv::Point(700, 850), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(700, 900), cv::Scalar(0, 0, 255));
|
||||
}
|
||||
else {
|
||||
textPainter.putText(Paint, "缺陷长度:" + std::to_string(result.resultX) + "mm", cv::Point(50, 800), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "缺陷宽度:" + std::to_string(result.resultY) + "mm", cv::Point(50, 850), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(50, 900), cv::Scalar(0, 0, 255));
|
||||
}
|
||||
}
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
return result;
|
||||
}
|
||||
bool ALGO_BaoMoHouDiBu_test(std::shared_ptr <detData> data, baoMoHouDiBuDetParams* _detParams, yh_581_address address) {
|
||||
try {
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
std::vector < std::string> defects;
|
||||
|
||||
//data->oriImgs.clear();
|
||||
//data->oriImgs.push_back(cv::imread("D://testImage/dituo_1.bmp", -1));
|
||||
//data->oriImgs.push_back(cv::imread("D://testImage/dituo_2.bmp", -1));
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() < 2)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
data->resultImgs.push_back(Paint);
|
||||
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);
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
return false;
|
||||
}
|
||||
|
||||
cv::Mat Paint,Paint1,Paint2;
|
||||
bool leftFirst = address.triggerAddr == 20200;
|
||||
auto feature1 = std::async(std::launch::async,dituo, data, std::ref(data->oriImgs[0]), std::ref(Paint1),leftFirst);
|
||||
auto feature2 = std::async(std::launch::async, dituo, data, std::ref(data->oriImgs[1]), std::ref(Paint2),~leftFirst);
|
||||
feature1.wait();
|
||||
halconResult hResult1 = feature1.get();
|
||||
|
||||
feature2.wait();
|
||||
halconResult hResult2 = feature2.get();
|
||||
cv::hconcat(Paint1, Paint2, Paint);
|
||||
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(hResult1.resultX));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(hResult1.resultY));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(hResult2.resultX));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(hResult2.resultY));//发送结果
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果
|
||||
data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);
|
||||
data->resultImgs.push_back(Paint);
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
data->resultImgs.push_back(Paint);
|
||||
return true;
|
||||
}
|
||||
bool ALGO_BaoMoHouDiBu(std::shared_ptr <detData> data, baoMoHouDiBuDetParams* _detParams, yh_581_address address) {
|
||||
try {
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
std::vector < std::string> defects;
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() < 2)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
data->resultImgs.push_back(Paint);
|
||||
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);
|
||||
data->resultImgs.push_back(Paint);
|
||||
return false;
|
||||
}
|
||||
|
||||
cv::Mat Paint;
|
||||
clock_t start, finish;
|
||||
start = clock();
|
||||
|
||||
cv::Mat src1 = data->oriImgs[0];
|
||||
cv::Mat srcHalf;
|
||||
cv::resize(src1, srcHalf, cv::Size(0, 0), 0.5, 0.5);
|
||||
if (srcHalf.channels() != 3)
|
||||
cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR);
|
||||
else
|
||||
srcHalf.copyTo(Paint);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 50);
|
||||
HalconCpp::HObject in_Image = MatToHObject(src1);
|
||||
//vs+halcon联调debug
|
||||
HDevEngineCpp::HDevProcedure proc("_4_TD_BlueCover_Inspection");
|
||||
HDevProcedureCall procedureCall(proc);
|
||||
|
||||
/*HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.StartDebugServer();
|
||||
procedureCall.SetWaitForDebugConnection(true);*/
|
||||
|
||||
HTuple in_Par, in_FilePath("./halconFiles/");
|
||||
in_Par[0] = data->service->_paramSyncManager->get("底托检测","宽度阈值(mm)", 150).toInt();
|
||||
in_Par[1] = data->service->_paramSyncManager->get("底托检测", "高度阈值(mm)", 150).toInt();
|
||||
in_Par[2] = data->service->_paramSyncManager->get("底托检测", "面积阈值(mm)", 300).toInt();
|
||||
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
|
||||
procedureCall.SetInputCtrlParamTuple("in_Par", in_Par);
|
||||
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
|
||||
procedureCall.Execute();
|
||||
HTuple out_X = procedureCall.GetOutputCtrlParamTuple("out_X");
|
||||
HTuple out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y");
|
||||
HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
|
||||
HTuple out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails");
|
||||
int outFlag = out_Flag.D();
|
||||
//handleAiFuture.wait();
|
||||
//_result = handleAiFuture.get();
|
||||
double resultX = -99, resultY = -99;
|
||||
if (outFlag == 1) {
|
||||
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
else {
|
||||
data->halconOK = false;
|
||||
for (int i = 0; i < out_Y.Length() / 2 - 1; i++) {
|
||||
cv::circle(Paint, cv::Point(out_X[i * 2 + 1].D(), out_Y[i * 2].D()) / 2, 1,
|
||||
cv::Scalar(0, 0, 255), 1);
|
||||
}
|
||||
std::string ngDetails = out_NgDetails.ToString().Text();
|
||||
resultX = out_X.D();
|
||||
resultY = out_Y.D();
|
||||
if (address.triggerAddr == 20200 || address.triggerAddr == 20402) {
|
||||
textPainter.putText(Paint, "缺陷长度:" + std::to_string(resultX) + "mm", cv::Point(700, 800), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "缺陷宽度:" + std::to_string(resultY) + "mm", cv::Point(700, 850), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(700, 900), cv::Scalar(0, 0, 255));
|
||||
}
|
||||
else {
|
||||
textPainter.putText(Paint, "缺陷长度:" + std::to_string(resultX) + "mm", cv::Point(50, 800), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "缺陷宽度:" + std::to_string(resultY) + "mm", cv::Point(50, 850), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, ngDetails.substr(1, ngDetails.length() - 2), cv::Point(50, 900), cv::Scalar(0, 0, 255));
|
||||
}
|
||||
}
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(resultX));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(resultY));//发送结果
|
||||
data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);
|
||||
data->resultImgs.push_back(Paint);
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(-99));//发送结果
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1,0,1");//发送结果
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
data->resultImgs.push_back(Paint);
|
||||
return true;
|
||||
}
|
||||
|
||||
mission* createMission() {
|
||||
return new _581_BaoMo();
|
||||
}
|
||||
void destroyMission(mission* _mission) {
|
||||
delete _mission;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
#include <missionBase.hpp>
|
||||
#include <yhGlobal.h>
|
||||
#include <simpleAlgo.h>
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
using namespace HDevEngineCpp;
|
||||
|
||||
class baoMoHouDiBuDetParams {
|
||||
public:
|
||||
|
||||
};
|
||||
static bool ALGO_BaoMoHouDiBu_test(std::shared_ptr <detData> data, baoMoHouDiBuDetParams* _detParams, yh_581_address address);
|
||||
static bool ALGO_BaoMoHouDiBu(std::shared_ptr <detData> data, baoMoHouDiBuDetParams* _detParams, yh_581_address address);
|
||||
|
||||
|
||||
class _581_BaoMo : public mission {
|
||||
public:
|
||||
using baoMoHouDiBuTrigger = _581_Single_triggerTemplate<baoMoHouDiBuDetParams>;
|
||||
baoMoHouDiBuTrigger _station_1;
|
||||
baoMoHouDiBuTrigger _station_2;
|
||||
|
||||
baoMoHouDiBuDetParams _baoMoHouDiBuDetParams;
|
||||
void onConfigReloaded() {
|
||||
HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
|
||||
_station_1.init("Camera1","包膜后底托位置度检测-左-相机12",20200,1,2, &_baoMoHouDiBuDetParams,_serviceManager,bridge, ALGO_BaoMoHouDiBu_test);
|
||||
_station_2.init("Camera2", "包膜后底托位置度检测-右-相机13",20400,1,2,&_baoMoHouDiBuDetParams, _serviceManager, bridge, ALGO_BaoMoHouDiBu_test);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//9600
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#pragma once
|
||||
@@ -0,0 +1,160 @@
|
||||
#include <581-BaoMo-Cam1234.h>
|
||||
|
||||
cv::Rect extractRegion(cv::Mat& src,int binary_threshold = 50) {
|
||||
cv::Mat binary;
|
||||
threshold(src, binary, binary_threshold, 255, cv::THRESH_BINARY);
|
||||
cv::dilate(binary, binary, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5)));
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
findContours(binary, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
|
||||
double maxArea = 0;
|
||||
int maxAreaIdx = -1;
|
||||
for (size_t i = 0; i < contours.size(); i++) {
|
||||
double area = contourArea(contours[i]);
|
||||
if (area > maxArea) {
|
||||
maxArea = area;
|
||||
maxAreaIdx = i;
|
||||
}
|
||||
}
|
||||
cv::Rect boundingRect = cv::boundingRect(contours[maxAreaIdx]);
|
||||
return boundingRect;
|
||||
}
|
||||
int index = 0;
|
||||
bool BaoMoQianShangDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() != 1) {
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
//cv::Mat segImg;
|
||||
//cv::resize(data->oriImgs[0], segImg, cv::Size(), 0.5, 0.5);
|
||||
//cv::Rect ROI = extractRegion(segImg);
|
||||
//segImg(ROI).copyTo(segImg);
|
||||
cv::Mat Paint;
|
||||
if (data->oriImgs[0].channels() == 1)
|
||||
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB);
|
||||
else
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
//TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
|
||||
//textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255));
|
||||
//segImg = ~_detParams->seg_baomodamian->Evaluate(segImg);
|
||||
//std::vector<std::vector<cv::Point>>contours;
|
||||
//cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int clsIndex = 0;
|
||||
//bool isNG = false;
|
||||
//for (auto& contour : contours) {
|
||||
// cv::Rect rect = cv::boundingRect(contour);
|
||||
// if (rect.width < 60 || rect.height < 60)
|
||||
// continue;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, data->oriImgs[0]);
|
||||
// data->clsOriginImgs.push_back({ std::to_string(clsIndex),clsImg});
|
||||
// int clsResult = _detParams->cls_baomodamian->Evaluate(clsImg);
|
||||
// if (clsResult == 1 || clsResult == 2) {
|
||||
// cv::drawContours(Paint, contours, clsIndex, cv::Scalar(0, 0, 255), 3);
|
||||
// //isNG = true;
|
||||
// }
|
||||
// clsIndex++;
|
||||
//}
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
|
||||
//if (isNG == true) {
|
||||
// textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255));
|
||||
// if (data->service->_paramSyncManager->get("强制OK", false).toBool())
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");
|
||||
// else
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
//}
|
||||
//else {
|
||||
// textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
//}
|
||||
//data->segOriginImgs.push_back(segImg);
|
||||
data->resultImgs.push_back(Paint);
|
||||
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
return true;
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
generalExceptionResume(data, address, "检测异常");
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
|
||||
|
||||
QString date = QDateTime::currentDateTime().toString("yyyy_MM_dd_HH_mm_ss_").toUtf8() + QString::number(index);
|
||||
//data->service->_triggerManager->writeShort("D" + QByteArray::number(address.snAddr) + "_" + convertStringForFins(date));
|
||||
data->SNcode = date.toStdString();
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
index++;
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() != 1) {
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
}
|
||||
if (data->oriImgs[0].rows == 200) {
|
||||
generalExceptionResume(data, address, "检测异常");
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
cv::Mat segImg;
|
||||
cv::resize(data->oriImgs[0], segImg, cv::Size(), 0.5, 0.5);
|
||||
cv::Rect ROI = extractRegion(segImg);
|
||||
segImg(ROI).copyTo(segImg);
|
||||
cv::Mat Paint;
|
||||
if (data->oriImgs[0].channels() == 1)
|
||||
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB);
|
||||
else
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
//TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
|
||||
//textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255));
|
||||
segImg = ~_detParams->seg_baomodamian->Evaluate(segImg);
|
||||
std::vector<std::vector<cv::Point>>contours;
|
||||
cv::findContours(segImg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
int clsIndex = 0;
|
||||
bool isNG = false;
|
||||
for (auto& contour : contours) {
|
||||
cv::Rect rect = cv::boundingRect(contour);
|
||||
if (rect.width < 60 || rect.height < 60)
|
||||
continue;
|
||||
cv::Mat clsImg = cutImg2Cls(rect, data->oriImgs[0]);
|
||||
data->clsOriginImgs.push_back({ std::to_string(clsIndex),clsImg});
|
||||
int clsResult = _detParams->cls_baomodamian->Evaluate(clsImg);
|
||||
if (clsResult == 1 || clsResult == 2) {
|
||||
cv::drawContours(Paint, contours, clsIndex, cv::Scalar(0, 0, 255), 3);
|
||||
//isNG = true;
|
||||
}
|
||||
clsIndex++;
|
||||
}
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
|
||||
//if (isNG == true) {
|
||||
// textPainter.putText(Paint, "NG", cv::Point(50, 50), cv::Scalar(0, 0, 255));
|
||||
// if (data->service->_paramSyncManager->get("强制OK", false).toBool())
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");
|
||||
// else
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
//}
|
||||
//else {
|
||||
// textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
// data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
//}
|
||||
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
data->segOriginImgs.push_back(segImg);
|
||||
data->resultImgs.push_back(Paint);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
generalExceptionResume(data, address, "检测异常");
|
||||
return true;
|
||||
|
||||
}
|
||||
mission* createMission() {
|
||||
return new _581_BaoMo_Cam1234();
|
||||
}
|
||||
void destroyMission(mission* _mission) {
|
||||
delete _mission;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
#include <yhGlobal.h>
|
||||
#include <simpleAlgo.h>
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
using namespace HDevEngineCpp;
|
||||
|
||||
class baoMoQianDaMianDetParams {
|
||||
public:
|
||||
handdleAI::pSegmentation* seg_baomodamian = nullptr;
|
||||
handdleAI::pClassification* cls_baomodamian = nullptr;
|
||||
};
|
||||
|
||||
|
||||
bool BaoMoQianShangDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address);
|
||||
bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address);
|
||||
class _581_BaoMo_Cam1234 : public mission {
|
||||
public:
|
||||
using baoMoQianDaMianTrigger = _581_Union_triggerTemplate<baoMoQianDaMianDetParams>;
|
||||
baoMoQianDaMianTrigger _shangdamian_1;
|
||||
baoMoQianDaMianTrigger _xiadamian_2;
|
||||
std::vector<baoMoQianDaMianDetParams> _baoMoQianDaMianDetParams = std::vector< baoMoQianDaMianDetParams>(2);
|
||||
|
||||
using generalTrigger = _581_Union_triggerTemplate<detParams>;
|
||||
generalTrigger _station_3;
|
||||
generalTrigger _station_4;
|
||||
detParams _detParams;
|
||||
bool initOnce = false;
|
||||
void onConfigReloaded() {
|
||||
HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
|
||||
|
||||
if (initOnce == false) {
|
||||
|
||||
/* _baoMoQianDaMianDetParams[0].seg_baomodamian = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 0);
|
||||
_baoMoQianDaMianDetParams[0].cls_baomodamian = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 0, 1);
|
||||
|
||||
_baoMoQianDaMianDetParams[1].seg_baomodamian = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 1);
|
||||
_baoMoQianDaMianDetParams[1].cls_baomodamian = handdleAI::CreateClsObjV3("./handleAiModels/BaoMoQianDaMian_Cls.BHD", 1, 1);*/
|
||||
|
||||
initOnce = true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
_shangdamian_1.init("Camera1","包膜前外观检测大面相机1(上大面)", 18000,2, 1, &_baoMoQianDaMianDetParams[0], _serviceManager, bridge, BaoMoQianShangDaMian);
|
||||
_xiadamian_2.init("Camera2", "包膜前外观检测大面相机2(下大面)", 18200,2, 1, &_baoMoQianDaMianDetParams[1], _serviceManager, bridge, BaoMoQianXiaDaMian);
|
||||
|
||||
_station_3.init("Camera3", "包膜前产品边缘检测大面-外-相机3(下大面顶盖侧)", 18400,2, 2, &_detParams,_serviceManager,bridge, generalAlgoTest);
|
||||
_station_4.init("Camera4", "包膜前产品边缘检测大面-内-相机4(下大面底部侧)", 18600 ,2, 2, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
void reloadAlgo(QByteArray& byteArray) {
|
||||
|
||||
}
|
||||
|
||||
//9600
|
||||
};
|
||||
|
||||
|
||||
|
||||
#pragma once
|
||||
@@ -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/service
|
||||
${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 OFF)
|
||||
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/interface.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})
|
||||
@@ -0,0 +1,8 @@
|
||||
#include <581-BaoMo-Cam5678.h>
|
||||
|
||||
mission* createMission() {
|
||||
return new _581_BaoMo();
|
||||
}
|
||||
void destroyMission(mission* _mission) {
|
||||
delete _mission;
|
||||
}
|
||||
@@ -0,0 +1,221 @@
|
||||
#include <missionBase.hpp>
|
||||
#include <yhGlobal.h>
|
||||
|
||||
struct _581_BaoMoResult
|
||||
{
|
||||
bool result = true;
|
||||
std::vector < std::string> defects;
|
||||
};
|
||||
class baoMoHouDaMianDetParams {
|
||||
public:
|
||||
handdleAI::pSegmentation* dingwei = nullptr;
|
||||
handdleAI::pSegmentation* seg = nullptr;
|
||||
handdleAI::pClassification* cls = nullptr;
|
||||
};
|
||||
#pragma region 算法
|
||||
#include <simpleAlgo.h>
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
using namespace HDevEngineCpp;
|
||||
#pragma endregion
|
||||
#pragma region 算法
|
||||
|
||||
std::vector<std::string> BaoMoHou_DaMianAi(std::shared_ptr <detData> data, cv::Mat src, cv::Mat& Paint,
|
||||
baoMoHouDaMianDetParams* _detParams) {
|
||||
if (_detParams->seg == nullptr || _detParams->cls == nullptr)
|
||||
return {};
|
||||
std::vector<std::string> defects;
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
|
||||
bool huaShangNg = false;
|
||||
cv::Mat segImg = ~_detParams->seg->Evaluate(src);
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
cv::findContours(segImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
|
||||
bool isOK = true;
|
||||
for (int i = 0; i < contours.size(); i++) {
|
||||
cv::Rect rect = cv::boundingRect(contours[i]);
|
||||
if (rect.width < 100 || rect.height < 100) continue; // 过滤掉小轮廓
|
||||
auto clsImgs = cutImg2ClsVec(rect, src, cv::Size(128, 128));
|
||||
bool clsIsNg = false;
|
||||
for (auto& clsImg : clsImgs) {
|
||||
int clsResult = _detParams->cls->Evaluate(clsImg);
|
||||
if (clsResult == 1) {
|
||||
clsIsNg = true;
|
||||
huaShangNg = true;
|
||||
}
|
||||
data->clsOriginImgs.push_back({ "CLS",clsImg });
|
||||
}
|
||||
if (clsIsNg == true) {
|
||||
cv::Scalar color = cv::Scalar(0, 0, 255);
|
||||
isOK = false;
|
||||
cv::drawContours(Paint, contours, i, color, 2);
|
||||
textPainter.putText(Paint, "NG", cv::Point(rect.x + 10, rect.y - 20), color);
|
||||
}
|
||||
}
|
||||
if (huaShangNg == true)
|
||||
defects.push_back("划伤");
|
||||
return defects;
|
||||
}
|
||||
static bool BaoMoHou_ShangDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams, yh_581_address address)
|
||||
{
|
||||
try {
|
||||
//data->oriImgs[0] = cv::imread("D://testImage//Camera1.bmp", -1);
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() != 1)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
}
|
||||
/*if (data->oriImgs[0].rows == 150) {
|
||||
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];
|
||||
cv::Mat srcHalf;
|
||||
cv::resize(src1, srcHalf, cv::Size(0, 0), 0.5, 0.5);
|
||||
if (srcHalf.channels() != 3)
|
||||
cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR);
|
||||
else
|
||||
srcHalf.copyTo(Paint);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
|
||||
//std::future <std::vector<std::string>> handleAiFuture = std::async(std::launch::async, BaoMoHou_DaMianAi, data, srcHalf, Paint, _detParams);
|
||||
HalconCpp::HObject in_Image = MatToHObject(src1);
|
||||
HDevEngineCpp::HDevProcedure proc("_4_Cal_Long_Coatingcover_Dist");
|
||||
HDevProcedureCall procedureCall(proc);
|
||||
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
|
||||
procedureCall.SetInputCtrlParamTuple("in_xResolution", HTuple(0.0308812));
|
||||
procedureCall.SetInputCtrlParamTuple("in_yResolution", HTuple(0.029527));
|
||||
procedureCall.Execute();
|
||||
HTuple out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");
|
||||
HTuple out_Line = procedureCall.GetOutputCtrlParamTuple("out_Line");
|
||||
HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
|
||||
int outFlag = out_Flag.D();
|
||||
// handleAiFuture.wait();
|
||||
//auto defects = handleAiFuture.get();
|
||||
if (outFlag == 1) {
|
||||
for (int i = 0; i < out_Line.Length() / 4; i++) {
|
||||
cv::line(Paint, cv::Point(out_Line[i * 4 + 1].D(), out_Line[i * 4].D()) / 2,
|
||||
cv::Point(out_Line[i * 4 + 3].D(), out_Line[i * 4 + 2].D()) / 2,
|
||||
cv::Scalar(0, 255, 0), 5);
|
||||
}
|
||||
/*out_Distance[0]: 上端盖到膜的距离< / c>
|
||||
<c>* out_Distance[1] : 中端盖到膜的距离< / c>
|
||||
<c>* out_Distance[2] : 下端盖到膜的距离< / c>
|
||||
<c>* out_Distance[3] : 电芯宽度 < / c>
|
||||
<c>* out_Distance[4] : 电芯高度< / c>*/
|
||||
textPainter.putText(Paint, "上端盖到膜的距离:" + std::to_string(out_Distance[0].D()) + "mm", cv::Point(50, 150), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[1].D()) + "mm", cv::Point(50, 350), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[2].D()) + "mm", cv::Point(50, 550), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[3].D()) + "mm", cv::Point(50, 750), cv::Scalar(0, 255, 0));
|
||||
textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[4].D()) + "mm", cv::Point(50, 950), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
else {
|
||||
data->halconOK = false;
|
||||
textPainter.putText(Paint, "OK", cv::Point(50, 300), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
|
||||
data->resultImgs.push_back(Paint);
|
||||
//data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
return true;
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
generalExceptionResume(data, address, "NG");
|
||||
}
|
||||
|
||||
static bool BaoMoHou_XiaDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams, yh_581_address address)
|
||||
{
|
||||
try {
|
||||
//data->oriImgs[0] = cv::imread("D://testImage//Camera2.bmp", -1);
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
|
||||
///////////////////取图//处理//////////////////
|
||||
if (data->oriImgs.size() != 1)
|
||||
{
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
}
|
||||
/*if (data->oriImgs[0].rows == 150) {
|
||||
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];
|
||||
cv::Mat srcHalf;
|
||||
cv::resize(src1, srcHalf, cv::Size(0, 0), 0.5, 0.5);
|
||||
if (srcHalf.channels() != 3)
|
||||
cv::cvtColor(srcHalf, Paint, cv::COLOR_GRAY2BGR);
|
||||
else
|
||||
srcHalf.copyTo(Paint);
|
||||
//切图
|
||||
//cv::Mat segResult = _detParams->dingwei->Evaluate(srcHalf);
|
||||
|
||||
//auto _result = BaoMoHou_DaMianAi(data, srcHalf, Paint, _detParams);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 300);
|
||||
textPainter.putText(Paint, "OK", cv::Point(500, 50), cv::Scalar(0, 255, 0));
|
||||
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_0.0123");
|
||||
data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_0.0123");
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
|
||||
return true;
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
generalExceptionResume(data, address, "OK");
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
class _581_BaoMo : public mission {
|
||||
public:
|
||||
using baoMoHouShangDaMianTrigger = _581_Single_triggerTemplate<baoMoHouDaMianDetParams>;
|
||||
baoMoHouShangDaMianTrigger _station_1;//shangdamian
|
||||
baoMoHouShangDaMianTrigger _station_3;//shangdamian
|
||||
|
||||
using baoMoHouXiaDaMianTrigger = _581_Single_triggerTemplate<baoMoHouDaMianDetParams>;
|
||||
baoMoHouXiaDaMianTrigger _station_2;//xiadamian
|
||||
baoMoHouXiaDaMianTrigger _station_4;//xiadamian
|
||||
|
||||
std::vector<baoMoHouDaMianDetParams> _baoMoHouDaMianDetParams = std::vector< baoMoHouDaMianDetParams>(4);
|
||||
detParams _detParams;
|
||||
void onConfigReloaded() {
|
||||
HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
|
||||
}
|
||||
bool initCustom() {
|
||||
|
||||
#pragma region 注册触发器回调
|
||||
|
||||
_station_1.init("Camera1", "包膜后大面外观检测-左上-相机5(上大面1)",18800,1,1, &_baoMoHouDaMianDetParams[0], _serviceManager, bridge, BaoMoHou_ShangDaMian);
|
||||
_station_3.init("Camera3", "包膜后大面外观检测-右上-相机7(上大面2)", 19200, 1, 1, &_baoMoHouDaMianDetParams[1], _serviceManager, bridge, BaoMoHou_ShangDaMian);
|
||||
|
||||
_station_2.init("Camera2", "包膜后大面外观检测-左下-相机6(下大面四角1)", 19000, 1, 1, &_baoMoHouDaMianDetParams[2], _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
_station_4.init("Camera4", "包膜后大面外观检测-右下-相机8(下大面四角2)",19400, 1,1, &_baoMoHouDaMianDetParams[3], _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#pragma once
|
||||
@@ -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/service
|
||||
${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 OFF)
|
||||
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/interface.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})
|
||||
+4
-13
@@ -18,12 +18,10 @@ static bool ALGO_BaoMoHouCeMian(std::shared_ptr <detData> data, baoMoHouDaMianDe
|
||||
|
||||
class _581_BaoMo : public mission {
|
||||
public:
|
||||
using baoMoHouDaMianTrigger = _581_Union_triggerTemplate<baoMoHouDaMianDetParams>;
|
||||
baoMoHouDaMianTrigger _station_1;
|
||||
baoMoHouDaMianTrigger _station_2;
|
||||
_581_Union_triggerTemplate <baoMoHouDaMianDetParams> _station_1;
|
||||
_581_Union_triggerTemplate <baoMoHouDaMianDetParams> _station_2;
|
||||
|
||||
using generalTrigger = _581_Union_triggerTemplate<detParams>;
|
||||
generalTrigger _station_3;
|
||||
_581_Union_triggerTemplate<detParams> _station_3;
|
||||
|
||||
std::vector < baoMoHouDaMianDetParams> _baoMoHouDaMianDetParams = std::vector < baoMoHouDaMianDetParams>(2);
|
||||
detParams _detParams;
|
||||
@@ -43,17 +41,10 @@ public:
|
||||
bool initCustom() {
|
||||
|
||||
#pragma region 注册触发器回调
|
||||
//baoMoHouDaMianTrigger::resultHandleCallback resultCallback_BaoMoHouCeMian =
|
||||
// ([=](yh_581_address address, _581_BaoMoResult, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
|
||||
_station_1.init("Camera1","包膜后侧面贴胶错位检测-外-相机9",19600,2,1,&_baoMoHouDaMianDetParams[0], _serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
_station_2.init("Camera2", "包膜后侧面贴胶错位检测-内-相机10",19800,2,1, &_baoMoHouDaMianDetParams[1], _serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
|
||||
//generalTrigger::resultHandleCallback resultCallback_general =
|
||||
// ([=](yh_581_address address, _581_Result, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
_station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)",20000,2,1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
@@ -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/service
|
||||
${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 OFF)
|
||||
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/interface.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})
|
||||
@@ -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 ${})
|
||||
Reference in New Issue
Block a user