备份
This commit is contained in:
@@ -102,12 +102,13 @@ public:
|
||||
QString totalCtStr = "algoCT->" + QString::number(data->algoTime) + "ms|SN" + QString::fromStdString(data->SNcode);
|
||||
qDebug() << totalCtStr;
|
||||
//std::cout << totalCtStr.toStdString() << std::endl;
|
||||
// 将耗时数据保存入数据库或日志
|
||||
data->sqlVec.push_back({ "SN", data->SNcode });
|
||||
data->sqlVec.push_back({ "totalCt", std::to_string(data->algoTime) + "ms" });
|
||||
// 将耗时数据等保存入数据库或日志
|
||||
data->sqlVec.insert({ "CT", QString::number(data->algoTime) + "ms" });
|
||||
data->sqlVec.insert({ "算法判定结果", data->halconOK == false ? "NG" : "OK" });
|
||||
data->sqlVec.insert({ "AI判定结果", data->aiDetOK == false ? "NG" : "OK" });
|
||||
data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), data->sqlVec);
|
||||
// 异步保存检测图像
|
||||
std::thread([this,data] {_imgSaveThreadManager->saveImage(data); }).detach();
|
||||
//std::thread([this,data] {_imgSaveThreadManager->saveRes(data); }).detach();
|
||||
}
|
||||
#pragma region 注册回调函数
|
||||
|
||||
|
||||
@@ -57,8 +57,8 @@ public:
|
||||
bool halconOK = true;
|
||||
//结果图展示预设
|
||||
std::vector< showImgPack>resultImgShowSet;
|
||||
//需要存入的SQL数据
|
||||
std::vector<std::pair<std::string, std::string>> sqlVec;
|
||||
//打包存入的SQL数据
|
||||
std::map<QString, QVariant> sqlVec;
|
||||
#pragma endregion
|
||||
QMap<QString, QVariant> additional;//自定义参数
|
||||
detData() {}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
//为了更集中方便的展示检测结果到主页面
|
||||
class missionResultHandle {
|
||||
public:
|
||||
missionResultHandle(bSignalHub* qtBridgeIn) {
|
||||
missionResultHandle(bSignalHub* qtBridgeIn){
|
||||
qtBridge = qtBridgeIn;
|
||||
}
|
||||
void toBarChart(std::string SN,bool isNG,std::vector<std::string> defectAndNum) {
|
||||
@@ -18,6 +18,9 @@ public:
|
||||
void toWaveForm(QString windowName, double value) {
|
||||
emit qtBridge->waveFormAddData(windowName, value);
|
||||
}
|
||||
void addSqlData(QString snCode, std::map<QString, QVariant> data) {
|
||||
_csvWriter->addData(snCode, data);
|
||||
}
|
||||
void test() {
|
||||
QThread::msleep(1000);
|
||||
emit qtBridge->pieWidgetAddNG();
|
||||
@@ -35,5 +38,6 @@ public:
|
||||
}
|
||||
private:
|
||||
bSignalHub* qtBridge;
|
||||
CsvWriter* _csvWriter;
|
||||
};
|
||||
#pragma once
|
||||
@@ -11,7 +11,6 @@ public:
|
||||
detDataManager* _detDataManager = nullptr;// 检测数据管理器 需要初始化
|
||||
imgSaveThreadManager* _imgSaveThreadManager = nullptr;// 保存图像线程 需要初始化
|
||||
triggerManager* _triggerManager = nullptr;// 触发管理器
|
||||
//handleAiModelManager* _handleAiModelManager = nullptr;// 模型管理器
|
||||
cameraManager* _cameraManager = nullptr;
|
||||
SQLiteDB* dataBase = nullptr;
|
||||
CsvWriter* _csvWriter = nullptr;
|
||||
|
||||
@@ -176,7 +176,6 @@ static bool YuHan(std::shared_ptr <detData> data, mfd_detParams* _detParams, yh_
|
||||
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
|
||||
return false;
|
||||
}
|
||||
data->sqlVec.push_back({ "测试数据","1" });
|
||||
cv::Mat Paint;
|
||||
cv::Mat src1 = data->oriImgs[0];
|
||||
//src1 = cv::imread("D://ceshi/15H/1/333.bmp",-1);
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <602_RuanLianJie_dinggai.h>
|
||||
|
||||
mission* createMission() {
|
||||
return new _581_YuHan_hanqian();
|
||||
}
|
||||
|
||||
void destroyMission(mission* _mission) {
|
||||
delete _mission;
|
||||
}
|
||||
@@ -0,0 +1,394 @@
|
||||
#include <missionBase.hpp>
|
||||
#include <sxGlobal.h>
|
||||
#pragma region 算法
|
||||
#include <simpleAlgo.h>
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
using namespace HDevEngineCpp;
|
||||
#pragma endregion
|
||||
class RuanLianJie_dinnggai {
|
||||
public:
|
||||
handdleAI::pSegmentation* segDingwei1 = nullptr;
|
||||
handdleAI::pSegmentation* seg = nullptr;
|
||||
handdleAI::pClassification* cls = nullptr;
|
||||
cv::Mat TP1IMG, TP2Paint;
|
||||
};
|
||||
QByteArray keMaResult = "0";
|
||||
QByteArray okNgSaveText = "OK";
|
||||
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);
|
||||
cv::Rect rect = findMaxAreaContour(ouput);
|
||||
rect.x /= bounus; rect.y /= bounus;
|
||||
rect.width /= bounus; rect.height /= bounus;
|
||||
return rect;
|
||||
}
|
||||
|
||||
bool dinggaijiance(std::shared_ptr <detData> data, RuanLianJie_dinnggai* _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
|
||||
if(address.triggerValue == 1)
|
||||
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", - 1);
|
||||
if (address.triggerValue == 2)
|
||||
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-32.bmp", -1);
|
||||
if (address.triggerValue == 3)
|
||||
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", -1);
|
||||
//存图数据加保存队列,加锁,避免数据访问冲突
|
||||
QByteArray plcResult = "2";
|
||||
double Resolution = 0.01424;
|
||||
cv::Mat sourceImg;
|
||||
data->oriImgs[0].copyTo(sourceImg);
|
||||
cv::Mat Paint;
|
||||
sourceImg.copyTo(Paint);
|
||||
if (Paint.channels() == 1)
|
||||
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
|
||||
if (address.triggerValue == 2)
|
||||
{
|
||||
HDevEngineCpp::HDevProcedure proc("_3_Cal_FBF_Distance");;
|
||||
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
|
||||
sourceImg.copyTo(Paint);
|
||||
if (Paint.channels() == 1)
|
||||
cvtColor(Paint, Paint, 8);
|
||||
HObject in_Image = MatToHObject(sourceImg);
|
||||
HalconCpp::HTuple in_Resolution(Resolution), in_FilePath("./halconFiles/");
|
||||
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
|
||||
procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution);
|
||||
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
|
||||
procedureCall.Execute();//执行halcon程序
|
||||
HalconCpp::HTuple out_LinePoint, out_Circle, out_Flag, out_Distance,out_NgTails;
|
||||
out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量
|
||||
out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量
|
||||
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量
|
||||
out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量
|
||||
out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails");//获取输出控制类变量
|
||||
keMaResult = "1";
|
||||
if (out_Flag.D() == 1)
|
||||
{
|
||||
int crossLineLength = 50;
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 140);
|
||||
for (int i = 0; i < out_LinePoint.Length() / 4; i++)
|
||||
{
|
||||
cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
|
||||
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
|
||||
cv::Scalar(0, 255, 0), 10);
|
||||
}
|
||||
double distance = out_Distance[0].D();
|
||||
distance -= out_Circle[2].D() * Resolution;//CHEAT!!!
|
||||
circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5);
|
||||
{
|
||||
//data1 = QByteArray::number(distance);
|
||||
std::string text = "二维码与防爆阀相对位置:" + std::to_string(distance);
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
|
||||
textPainter.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(100, 500), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
double distance2 = out_Distance[1].D();//二维码的宽度值
|
||||
{
|
||||
QByteArray::number(distance2);
|
||||
std::string text = "二维码与防爆阀间距:" + std::to_string(distance2);
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(100, 650), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
double distance3 = out_Distance[2].D();//二维码下方字符串的宽度值
|
||||
{
|
||||
std::string text = "二维码的宽度值:" + std::to_string(distance3);
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(100, 800), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
//double distance4 = out_Distance[3].D();//二维码左侧字符串的高度值
|
||||
//{
|
||||
// std::string text = "二维码左字符水平宽度:" + std::to_string(distance4);
|
||||
// text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
// putTextHusky(Paint,
|
||||
// utf8_to_gbk(text).c_str(),
|
||||
// cv::Point(100, 950), cv::Scalar(0, 255, 0), 140);
|
||||
//}
|
||||
//double distance5 = out_Distance[4].D();//二维码右侧到电芯右侧边缘距离
|
||||
//{
|
||||
// data2 = QByteArray::number(distance2);
|
||||
// std::string text = "右间距:" + std::to_string(distance5);
|
||||
// text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
// putTextHusky(Paint,
|
||||
// utf8_to_gbk(text).c_str(),
|
||||
// cv::Point(50, 350), cv::Scalar(0, 255, 0), 280);
|
||||
//}
|
||||
if (distance > 11.9 || distance < 5.9)
|
||||
{
|
||||
std::string text = "上间距NG";
|
||||
TextRendererZH textPainter1(Paint.cols, Paint.rows, 280);
|
||||
textPainter1.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(50, 50), cv::Scalar(0, 0, 255));
|
||||
keMaResult = "2";
|
||||
okNgSaveText = "NG";
|
||||
}
|
||||
/* if (distance5 > 33.2 || distance5 < 27.2)
|
||||
{
|
||||
std::string text = "右间距NG";
|
||||
putTextHusky(Paint,
|
||||
utf8_to_gbk(text).c_str(),
|
||||
cv::Point(2500, 350), cv::Scalar(0, 0, 255), 280);
|
||||
keMaResult = "2";
|
||||
okNgSaveText = "NG";
|
||||
}*/
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << __FUNCTION__ << "line:" << __LINE__ << "二维码error";
|
||||
TextRendererZH textPainter2(Paint.cols, Paint.rows, 500);
|
||||
auto ngDetail = gbkToUtf8(out_NgTails.ToString().Text());
|
||||
textPainter2.putText(Paint, ngDetail, cv::Point(0, 50), cv::Scalar(0, 0, 255));
|
||||
keMaResult = "2";
|
||||
okNgSaveText = "NG";
|
||||
}
|
||||
//#endif
|
||||
Paint.copyTo(_detParams->TP2Paint);
|
||||
}
|
||||
|
||||
else if (address.triggerValue == 1)
|
||||
{
|
||||
okNgSaveText = "OK";
|
||||
keMaResult = "1";
|
||||
sourceImg.copyTo(_detParams->TP1IMG);
|
||||
}
|
||||
|
||||
else if (address.triggerValue == 3)
|
||||
{
|
||||
Paint = cv::Mat(_detParams->TP1IMG.rows, _detParams->TP1IMG.cols * 3, CV_8UC1);
|
||||
_detParams->TP1IMG.copyTo(Paint(cv::Rect(0, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
|
||||
sourceImg.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
|
||||
if (Paint.channels() == 1)
|
||||
cvtColor(Paint, Paint, 8);
|
||||
_detParams->TP2Paint.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols * 2, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
|
||||
cv::Mat PaintPart2 = Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows));
|
||||
HDevEngineCpp::HDevProcedure proc("_3_Cal_JZ_Distance");;
|
||||
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
|
||||
HObject in_Image1, in_Image2;
|
||||
in_Image1 = MatToHObject(_detParams->TP1IMG);
|
||||
in_Image2 = MatToHObject(sourceImg);
|
||||
HalconCpp::HTuple in_FilePath(" "), in_Resolution(Resolution);
|
||||
procedureCall.SetInputIconicParamObject("in_Image1", in_Image1);
|
||||
procedureCall.SetInputIconicParamObject("in_Image2", in_Image2);
|
||||
procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution);
|
||||
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
|
||||
procedureCall.Execute();//执行halcon程序
|
||||
HalconCpp::HTuple out_Edgedistance, out_Distance, out_LinePoint, out_Flag;
|
||||
out_Edgedistance = procedureCall.GetOutputCtrlParamTuple("out_Edgedistance");//获取输出控制类变量
|
||||
out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量
|
||||
out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量
|
||||
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量
|
||||
if (out_Flag.D() == 1)
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
|
||||
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
|
||||
cv::Scalar(0, 255, 0), 15);
|
||||
}
|
||||
for (int i = 4; i < 8; i++)
|
||||
{
|
||||
cv::line(PaintPart2, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
|
||||
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
|
||||
cv::Scalar(0, 255, 0), 15);
|
||||
}
|
||||
double Distance = out_Distance.D();
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 280);
|
||||
//Paint
|
||||
{
|
||||
std::string text = "垂直间距:" + std::to_string(out_Edgedistance[0].D());
|
||||
//data3 = QByteArray::number(out_Edgedistance[0].D());
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
{
|
||||
//data4 = QByteArray::number(out_Edgedistance[1].D());
|
||||
std::string text = "水平间距:" + std::to_string(out_Edgedistance[1].D());
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(Paint,
|
||||
(text).c_str(),
|
||||
cv::Point(50, 300), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
{
|
||||
//data5 = QByteArray::number(out_Edgedistance[2].D());
|
||||
std::string text = "垂直间距:" + std::to_string(out_Edgedistance[2].D());
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(PaintPart2,
|
||||
(text).c_str(),
|
||||
cv::Point(50, 50), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
{
|
||||
//data6 = QByteArray::number(out_Edgedistance[3].D());
|
||||
std::string text = "水平间距:" + std::to_string(out_Edgedistance[3].D());
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
textPainter.putText(PaintPart2,
|
||||
(text).c_str(),
|
||||
cv::Point(50, 300), cv::Scalar(0, 255, 0));
|
||||
}
|
||||
/*{
|
||||
std::string text = "极柱间距:" + std::to_string(Distance);
|
||||
text = text.substr(0, text.find(".") + 4) + "mm";
|
||||
putTextHusky(Paint,
|
||||
utf8_to_gbk(text).c_str(),
|
||||
cv::Point(50, 550), cv::Scalar(0, 0, 255), 280);
|
||||
putTextHusky(PaintPart2,
|
||||
utf8_to_gbk(text).c_str(),
|
||||
cv::Point(50, 550), cv::Scalar(0, 0, 255), 280);
|
||||
}*/
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
TextRendererZH textPainter1(Paint.cols, Paint.rows, 500);
|
||||
textPainter1.putText(Paint, "NG,vv", cv::Point(0, 50), cv::Scalar(0, 0, 255));
|
||||
okNgSaveText = "NG";
|
||||
}
|
||||
plcResult = keMaResult;
|
||||
plcResult = "1";//强制OK
|
||||
data->resultImgs.push_back(Paint);
|
||||
return true;
|
||||
}
|
||||
sourceImg.release();
|
||||
plcResult = "1";
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
|
||||
return true;
|
||||
#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, 500);
|
||||
textPainter.putText(Paint, "NG", cv::Point(0, 0), 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 + "_1");//结果反馈
|
||||
return true;
|
||||
}
|
||||
bool majiarerong(std::shared_ptr <detData> data, RuanLianJie_dinnggai * _detParams, sx_581_address address) {
|
||||
try {
|
||||
#if 0
|
||||
|
||||
#else
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
if (Paint.channels() == 1)
|
||||
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
|
||||
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
|
||||
textPainter.putText(Paint, "NG", cv::Point(0, 0), 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 + "_1");//结果反馈
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4)+ "_1");//铝热熔面积
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数
|
||||
return true;
|
||||
#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, 500);
|
||||
textPainter.putText(Paint, "NG", cv::Point(0, 0), 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 + "_1");//结果反馈
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//铝热熔面积
|
||||
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数
|
||||
return true;
|
||||
}
|
||||
|
||||
class _581_YuHan_hanqian : public mission {
|
||||
public:
|
||||
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_1;
|
||||
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_2;
|
||||
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_3;
|
||||
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_4;
|
||||
|
||||
|
||||
|
||||
RuanLianJie_dinnggai DetParams1;
|
||||
RuanLianJie_dinnggai DetParams2;
|
||||
RuanLianJie_dinnggai DetParams3;
|
||||
RuanLianJie_dinnggai DetParams4;
|
||||
|
||||
|
||||
void onConfigReloaded() {
|
||||
HDevEngineCpp::HDevEngine myEngine;
|
||||
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
|
||||
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
dibu_1.init("Camera1", "顶盖检测刻码后-相机1", { { 5000, 1,{5010},"5002","5004",-1},{ 5000, 2,{5010},"5002","5004",-1},{ 5000, 3,{5010},"5002","5004",5030} }, 1, &DetParams1, _serviceManager, bridge, dinggaijiance, "防爆阀CCD");
|
||||
dibu_2.init("Camera2", "顶盖检测刻码后-相机2", { { 5100, 1,{5110},"5102","5104",-1},{ 5100, 2,{5110},"5102","5104",-1},{ 5100, 3,{5110},"5102","5104",5130} }, 1, &DetParams2, _serviceManager, bridge, dinggaijiance, "防爆阀CCD");
|
||||
dibu_3.init("Camera3", "马甲热熔检测-相机1", { { 5200, 1,{5210},"5202","5204",5230 }}, 1, &DetParams3, _serviceManager, bridge, majiarerong, "马甲热熔CCD");
|
||||
dibu_4.init("Camera4", "马甲热熔检测-相机2", { { 5300, 1,{5310},"5302","5304",5330} }, 1, &DetParams4, _serviceManager, bridge, majiarerong, "马甲热熔CCD");
|
||||
#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/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 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/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
|
||||
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})
|
||||
Reference in New Issue
Block a user