稳定版本备份

This commit is contained in:
2025-08-15 16:44:29 +08:00
parent d98592060d
commit ff97ea7898
9 changed files with 549 additions and 162 deletions
+20 -20
View File
@@ -58,28 +58,28 @@ void camera::run()
getCameraImg(data->oriImgs, data->imgAmountMin);
if (data->oriImgs.size() >= data->imgAmountMin) {
qDebug() << data->uuid << " Min:" << data->imgAmountMin << " Get:" << data->oriImgs.size();
if (lastUpdateTime.elapsed() > 200) {//显示在界面
lastUpdateTime.start(); // 记录本次更新时间
for (int i = 0; i < data->oriImgs.size(); i++) {
QPixmap pixmap;
cvMatToQPixMap(data->oriImgs[i], pixmap);
showImgPack* pack = new showImgPack(
cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first,
cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second
);
pack->img = pixmap;
emit bridge->displayWidget_sendImg(pack);
//if (lastUpdateTime.elapsed() > 200) {//显示在界面
// lastUpdateTime.start(); // 记录本次更新时间
// for (int i = 0; i < data->oriImgs.size(); i++) {
// QPixmap pixmap;
// cvMatToQPixMap(data->oriImgs[i], pixmap);
// showImgPack* pack = new showImgPack(
// cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].first,
// cameraModulePtr._cameraStruct.imageShowList[imgShowCnt].second
// );
// pack->img = pixmap;
// emit bridge->displayWidget_sendImg(pack);
imgShowCnt++;
if (imgShowCnt >= cameraModulePtr._cameraStruct.imageShowList.size())
imgShowCnt = 0;
}
// imgShowCnt++;
// if (imgShowCnt >= cameraModulePtr._cameraStruct.imageShowList.size())
// imgShowCnt = 0;
// }
}
else {
showLost++;
qDebug() << cameraModulePtr.dllPath << "Lost show";
}
//}
//else {
// showLost++;
// qDebug() << cameraModulePtr.dllPath << "Lost show";
//}
break;
}
QThread::msleep(1);
-1
View File
@@ -67,7 +67,6 @@ public:
gpuMutex->unlock();
return res;
}
private:
handdleAI::pClassification* clsPtr;
};
class handleAiModelDet{
BIN
View File
Binary file not shown.
+16 -14
View File
@@ -57,7 +57,7 @@ public:
std::string cameraName;
QString viewerName;
void init(std::string cameraNameIn, QString viewerNameIN,
ServiceManager * _serviceManagerIN,
ServiceManager* _serviceManagerIN,
nlohmann::ordered_json& _missionJson,
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
viewerName = viewerNameIN;
@@ -68,21 +68,22 @@ public:
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos,int triggerValue,int snPos,int dataPos,QByteArray& byteArray) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
}
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
@@ -94,6 +95,7 @@ private:
ServiceManager* _serviceManager = nullptr;
};
class _581_BaoMo : public mission {
public:
_581Baomo_trigger2ImgTemplate _station_1;
+190 -19
View File
@@ -2,11 +2,18 @@
struct _581_Result
{
bool result = true;
bool result = true;
std::vector < std::string> defects;
};
class detParams {
public:
};
class baoMoHouDaMianDetParams {
public:
handleAiModelSeg* seg;
handleAiModelCls* cls;
handleAiModelCls* cls2;
};
#pragma region 算法
#include <simpleAlgo.h>
@@ -28,7 +35,7 @@ static _581_Result _952_15_H_Algo(std::shared_ptr <detData> data, detParams* _de
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);
cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2);
return _581_Result();
}
@@ -43,13 +50,176 @@ static _581_Result _952_15_H_Algo(std::shared_ptr <detData> data, detParams* _de
cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR);
else
src1.copyTo(Paint);
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data-> resultImgs.push_back(Paint);
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data->resultImgs.push_back(Paint);
return _result;
}
_581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat& Paint,
baoMoHouDaMianDetParams* _detParams) {
_581_Result aireuslt;
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
bool huaShangNg = false;
cv::Mat segImg = ~_detParams->seg->segPtr->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(256, 256));
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
if (_detParams->cls->Evaluate(clsImg) == 1) { // 假设1表示NG
int clsResult = _detParams->cls2->Evaluate(clsImg);
if (clsResult == 1) {
clsIsNg = true;
huaShangNg = true;
//data->clsOriginImgs.push_back({ std::to_string(i),clsImg });
}
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isOK = false;
cv::drawContours(Paint, contours, i, color, 2);
textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), cv::Scalar(0, 255, 0));
}
//else {
// cv::Mat imgTmp;
// QMutexLocker locker(paintMutex);
// imgTmp.copyTo(Paint(rect));
// cv::rectangle(Paint, rect, color, 3);
//}
//putTextZH(Paint, "NG", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
if (huaShangNg == true)
aireuslt.defects.push_back("划伤");
return aireuslt;
}
static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams)
{
_581_Result _result;
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return _581_Result();
}
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 _581_Result();
}
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 <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, 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();
//_result = 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() / 2, out_Line[i * 4].D()) / 2,
// cv::Point(out_Line[i * 4 + 3].D() / 2, 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()), cv::Point(50, 150), cv::Scalar(0, 255, 0));
// textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[1].D()), cv::Point(50, 350), cv::Scalar(0, 255, 0));
// textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[2].D()), cv::Point(50, 550), cv::Scalar(0, 255, 0));
// textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[3].D()), cv::Point(50, 750), cv::Scalar(0, 255, 0));
// textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[4].D()), cv::Point(50, 950), cv::Scalar(0, 255, 0));
//}
//else {
// textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255));
//}
data->resultImgs.push_back(Paint);
return _result;
}
#pragma endregion
class _581Baomo_BaoMoHouShangDaMian {
public:
baoMoHouDaMianDetParams _detParams;
detCallbackChain<baoMoHouDaMianDetParams, _581_Result>* ganeralDet;
std::string cameraName;
QString viewerName;
void init(std::string cameraNameIn, QString viewerNameIN,
ServiceManager* _serviceManagerIN,
nlohmann::ordered_json& _missionJson,
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
viewerName = viewerNameIN;
cameraName = cameraNameIn;
_serviceManager = _serviceManagerIN;
_detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg");
_detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls");
_detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2");
ganeralDet = new detCallbackChain<baoMoHouDaMianDetParams, _581_Result>(_serviceManagerIN, &_detParams, bridgeIn);
ganeralDet->registerProcessAlgoCallback(BaoMoHouDaMian);
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouShangDaMian::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
//data->oriImgs.push_back(cv::imread("D://Image_20250809202445856.bmp", -1));
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
QThread::msleep(3000);
}
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位
_serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects);
}
private:
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
class _581Baomo_trigger2ImgTemplate {
public:
detParams _detParams;
@@ -69,20 +239,21 @@ public:
}
//9200 1
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
}
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
@@ -95,8 +266,8 @@ private:
};
class _581_BaoMo : public mission {
public:
_581Baomo_trigger2ImgTemplate _station_1;
_581Baomo_trigger2ImgTemplate _station_2;
_581Baomo_BaoMoHouShangDaMian _station_1;
_581Baomo_BaoMoHouShangDaMian _station_2;
_581Baomo_trigger2ImgTemplate _station_3;
_581Baomo_trigger2ImgTemplate _station_4;
summaryData<_581_Result> _summaryData;
+124 -80
View File
@@ -20,42 +20,7 @@ public:
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
static _581_Result _952_15_H_Algo(std::shared_ptr <detData> data, detParams* _detParams)
{
_581_Result _result;
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return _581_Result();
}
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 _581_Result();
}
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);
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data->resultImgs.push_back(Paint);
return _result;
}
_581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat& Paint,
_581_Result BaoMoHou_DaMianAi(std::shared_ptr <detData> data, cv::Mat src, cv::Mat& Paint,
baoMoHouDaMianDetParams* _detParams) {
_581_Result aireuslt;
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
@@ -66,11 +31,11 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat
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(256, 256));
if (rect.width < 100 || rect.height < 100) continue; // 过滤掉小轮廓
auto clsImgs = cutImg2ClsVec(rect, src, cv::Size(128, 128));
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
if (_detParams->cls->Evaluate(clsImg) == 1) { // 假设1表示NG
if (_detParams->cls->clsPtr->Evaluate(clsImg) == 1) { // 假设1表示NG
int clsResult = _detParams->cls2->Evaluate(clsImg);
if (clsResult == 1) {
clsIsNg = true;
@@ -79,12 +44,11 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat
}
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
cv::Scalar color = cv::Scalar(0, 0, 255);
isOK = false;
cv::drawContours(Paint, contours, i, color, 2);
textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), color);
}
//else {
// cv::Mat imgTmp;
@@ -99,7 +63,9 @@ _581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat
aireuslt.defects.push_back("划伤");
return aireuslt;
}
static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams)
#pragma endregion
#pragma region 上大面
static _581_Result BaoMoHou_ShangDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams)
{
_581_Result _result;
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
@@ -110,7 +76,7 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMian
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return _581_Result();
}
if (data->oriImgs[0].rows == 100) {
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);
@@ -130,7 +96,7 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMian
else
srcHalf.copyTo(Paint);
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
std::future <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, data, srcHalf, Paint, _detParams);
std::future <_581_Result> 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);
@@ -146,8 +112,8 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMian
_result = 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() / 2, out_Line[i * 4].D()) / 2,
cv::Point(out_Line[i * 4 + 3].D() / 2, out_Line[i * 4 + 2].D() / 2),
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>
@@ -155,13 +121,14 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMian
<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()), cv::Point(50, 150), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "中端盖到膜的距离:" + std::to_string(out_Distance[1].D()), cv::Point(50, 350), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "下端盖到膜的距离:" + std::to_string(out_Distance[2].D()), cv::Point(50, 550), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "电芯宽度:" + std::to_string(out_Distance[3].D()), cv::Point(50, 750), cv::Scalar(0, 255, 0));
textPainter.putText(Paint, "电芯高度:" + std::to_string(out_Distance[4].D()), cv::Point(50, 950), cv::Scalar(0, 255, 0));
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, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255));
}
@@ -169,7 +136,6 @@ static _581_Result BaoMoHouDaMian(std::shared_ptr <detData> data, baoMoHouDaMian
return _result;
}
#pragma endregion
class _581Baomo_BaoMoHouShangDaMian {
public:
baoMoHouDaMianDetParams _detParams;
@@ -183,18 +149,18 @@ public:
viewerName = viewerNameIN;
cameraName = cameraNameIn;
_serviceManager = _serviceManagerIN;
_detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg");
_detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls");
_detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2");
_detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg_gpu0");
_detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls_gpu0");
_detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2_gpu0");
ganeralDet = new detCallbackChain<baoMoHouDaMianDetParams, _581_Result>(_serviceManagerIN, &_detParams, bridgeIn);
ganeralDet->registerProcessAlgoCallback(BaoMoHouDaMian);
ganeralDet->registerProcessAlgoCallback(BaoMoHou_ShangDaMian);
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouShangDaMian::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
for (int i = 0; i < 2; i++) {
// for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
@@ -205,8 +171,7 @@ public:
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
QThread::msleep(3000);
}
//v }
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
@@ -220,10 +185,83 @@ private:
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
class _581Baomo_trigger2ImgTemplate {
#pragma endregion
#pragma region 下大面
static _581_Result BaoMoHou_XiaDaMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams)
{
_581_Result _result;
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return _581_Result();
}
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 _581_Result();
}
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);
_result = BaoMoHou_DaMianAi(data, srcHalf, Paint, _detParams);
//TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
//std::future <_581_Result> handleAiFuture = std::async(std::launch::async, BaoMoHou_XiaMianAi, 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();
//_result = 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 {
// textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255));
//}
data->resultImgs.push_back(Paint);
return _result;
}
class _581Baomo_BaoMoHouXiaDaMian {
public:
detParams _detParams;
detCallbackChain<detParams, _581_Result>* ganeralDet;
baoMoHouDaMianDetParams _detParams;
detCallbackChain<baoMoHouDaMianDetParams, _581_Result>* ganeralDet;
std::string cameraName;
QString viewerName;
void init(std::string cameraNameIn, QString viewerNameIN,
@@ -233,44 +271,50 @@ public:
viewerName = viewerNameIN;
cameraName = cameraNameIn;
_serviceManager = _serviceManagerIN;
ganeralDet = new detCallbackChain<detParams, _581_Result>(_serviceManagerIN, &_detParams, bridgeIn);
ganeralDet->registerProcessAlgoCallback(_952_15_H_Algo);
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2));
_detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg_gpu1");
_detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls_gpu1");
_detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2_gpu1");
ganeralDet = new detCallbackChain<baoMoHouDaMianDetParams, _581_Result>(_serviceManagerIN, &_detParams, bridgeIn);
ganeralDet->registerProcessAlgoCallback(BaoMoHou_XiaDaMian);
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouXiaDaMian::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
}
// for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
//data->oriImgs.push_back(cv::imread("D://Image_20250809202445856.bmp", -1));
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
//v }
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位
_serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects);
}
private:
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
#pragma endregion
class _581_BaoMo : public mission {
public:
_581Baomo_BaoMoHouShangDaMian _station_1;
_581Baomo_BaoMoHouShangDaMian _station_2;
_581Baomo_trigger2ImgTemplate _station_3;
_581Baomo_trigger2ImgTemplate _station_4;
_581Baomo_BaoMoHouXiaDaMian _station_2;
_581Baomo_BaoMoHouShangDaMian _station_3;
_581Baomo_BaoMoHouXiaDaMian _station_4;
summaryData<_581_Result> _summaryData;
detCallbackChain<detParams, _581_Result>* algo_liubai;
detParams _detParams;
+196 -26
View File
@@ -2,11 +2,18 @@
struct _581_Result
{
bool result = true;
bool result = false;
std::vector < std::string> defects;
};
class detParams {
public:
};
class baoMoHouDaMianDetParams {
public:
handleAiModelSeg* seg;
handleAiModelCls* cls;
handleAiModelCls* cls2;
};
#pragma region 算法
#include <simpleAlgo.h>
@@ -28,7 +35,7 @@ static _581_Result _952_15_H_Algo(std::shared_ptr <detData> data, detParams* _de
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);
cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2);
return _581_Result();
}
@@ -43,13 +50,173 @@ static _581_Result _952_15_H_Algo(std::shared_ptr <detData> data, detParams* _de
cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR);
else
src1.copyTo(Paint);
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data-> resultImgs.push_back(Paint);
cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2);
data->resultImgs.push_back(Paint);
return _result;
}
_581_Result _BaoMoHouDaMian(std::shared_ptr <detData> data, cv::Mat src, cv::Mat& Paint,
baoMoHouDaMianDetParams* _detParams) {
_581_Result aireuslt;
TextRendererZH textPainter(Paint.cols, Paint.rows, 150);
bool huaShangNg = false;
cv::Mat segImg = ~_detParams->seg->segPtr->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(256, 256));
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
if (_detParams->cls->Evaluate(clsImg) == 1) { // 假设1表示NG
int clsResult = _detParams->cls2->Evaluate(clsImg);
if (clsResult == 1) {
clsIsNg = true;
huaShangNg = true;
//data->clsOriginImgs.push_back({ std::to_string(i),clsImg });
}
}
}
cv::Scalar color = cv::Scalar(0, 255, 0);
if (clsIsNg == true) {
color = cv::Scalar(0, 0, 255);
isOK = false;
cv::drawContours(Paint, contours, i, color, 2);
textPainter.putText(Paint, "划伤", cv::Point(rect.x + 10, rect.y - 20), cv::Scalar(0, 255, 0));
}
//else {
// cv::Mat imgTmp;
// QMutexLocker locker(paintMutex);
// imgTmp.copyTo(Paint(rect));
// cv::rectangle(Paint, rect, color, 3);
//}
//putTextZH(Paint, "NG", cv::Point(rect.x + 10, rect.y - 20), 25, color);
}
if (huaShangNg == true)
aireuslt.defects.push_back("划伤");
return aireuslt;
}
static _581_Result BaoMoHouCeMian(std::shared_ptr <detData> data, baoMoHouDaMianDetParams* _detParams)
{
_581_Result _result;
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
if (data->oriImgs.size() != 1)
{
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return _581_Result();
}
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 _581_Result();
}
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 <_581_Result> handleAiFuture = std::async(std::launch::async, _BaoMoHouDaMian, data, srcHalf, Paint, _detParams);
HalconCpp::HObject in_Image = MatToHObject(src1);
HDevEngineCpp::HDevProcedure proc("_4_Cal_Short_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_Width = procedureCall.GetOutputCtrlParamTuple("out_Width");
HTuple out_Line = procedureCall.GetOutputCtrlParamTuple("out_Line");
HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
int outFlag = out_Flag.D();
//handleAiFuture.wait();
//_result = 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_Width.D()) + "mm", cv::Point(50, 150), cv::Scalar(0, 255, 0));
}
else {
textPainter.putText(Paint, "算法异常", cv::Point(50, 300), cv::Scalar(0, 0, 255));
_result.defects.push_back("算法不良");
}
data->resultImgs.push_back(Paint);
return _result;
}
#pragma endregion
class _581Baomo_BaoMoHouCeMian {
public:
baoMoHouDaMianDetParams _detParams;
detCallbackChain<baoMoHouDaMianDetParams, _581_Result>* ganeralDet;
std::string cameraName;
QString viewerName;
void init(std::string cameraNameIn, QString viewerNameIN,
ServiceManager* _serviceManagerIN,
nlohmann::ordered_json& _missionJson,
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
viewerName = viewerNameIN;
cameraName = cameraNameIn;
_serviceManager = _serviceManagerIN;
_detParams.seg = _serviceManager->_handleAiModelManager->getSegModel("seg");
_detParams.cls = _serviceManager->_handleAiModelManager->getClsModel("cls");
_detParams.cls2 = _serviceManager->_handleAiModelManager->getClsModel("cls2");
ganeralDet = new detCallbackChain<baoMoHouDaMianDetParams, _581_Result>(_serviceManagerIN, &_detParams, bridgeIn);
ganeralDet->registerProcessAlgoCallback(BaoMoHouCeMian);
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_BaoMoHouCeMian::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
//for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
//data->oriImgs.push_back(cv::imread("D://Image_20250809193611532.bmp", -1));
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
//QThread::msleep(3000);
//}
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["完成信号"].toInt()) + "_0");//完成信号复位
_serviceManager->_missonResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects);
}
private:
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
class _581Baomo_trigger2ImgTemplate {
public:
detParams _detParams;
@@ -57,7 +224,7 @@ public:
std::string cameraName;
QString viewerName;
void init(std::string cameraNameIn, QString viewerNameIN,
ServiceManager * _serviceManagerIN,
ServiceManager* _serviceManagerIN,
nlohmann::ordered_json& _missionJson,
SQLiteDB* _SQLiteDB, qtFuncBridge* bridgeIn) {
viewerName = viewerNameIN;
@@ -68,18 +235,22 @@ public:
ganeralDet->registerResultHandleCallback(std::bind(&_581Baomo_trigger2ImgTemplate::resultHandle, this, _1, _2));
}
//9200 1
void evaluate(int triggerPos,int triggerValue,int snPos,int finishSignalPos,QByteArray& byteArray) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(finishSignalPos) + "_1");//完成信号
void evaluate(int triggerPos, int triggerValue, int snPos, int dataPos, QByteArray& byteArray) {
std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, snPos, false, false, -1);
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = finishSignalPos;
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << data->uuid << "SN" << QString::fromStdString(sn);;
//for (int i = 0; i < 2; i++) {
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::number(triggerPos), sn, 1, camera->config.oriSaveFormat);//创建数据包
camera->captureImage(data);//拍照
ganeralDet->ansyncProcess(data, "");//处理算法
data->resultImgShowSet.push_back(new showImgPack(viewerName, "结果图"));
data->additional["触发地址"] = triggerPos;
data->additional["完成信号"] = triggerPos + 98;
data->additional["结果信号"] = triggerPos + 106;
data->additional["数据地址"] = dataPos;
//}
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(triggerPos + 98) + "_1");//完成信号
qDebug() << triggerPos << triggerValue << QString::fromUtf8("检测开始 uuid :") << "SN" << QString::fromStdString(sn);;
}
void resultHandle(std::shared_ptr <detData>data, _581_Result resultData) {
_serviceManager->_triggerManager->writeShort("D" + QByteArray::number(data->additional["触发地址"].toInt() + 106) + "_1");//发送结果
@@ -90,11 +261,10 @@ private:
qtFuncBridge* bridge;
ServiceManager* _serviceManager = nullptr;
};
class _581_BaoMo : public mission {
public:
_581Baomo_trigger2ImgTemplate _station_1;
_581Baomo_trigger2ImgTemplate _station_2;
_581Baomo_BaoMoHouCeMian _station_1;
_581Baomo_BaoMoHouCeMian _station_2;
_581Baomo_trigger2ImgTemplate _station_3;
summaryData<_581_Result> _summaryData;
detCallbackChain<detParams, _581_Result>* algo_liubai;
@@ -112,26 +282,26 @@ public:
#pragma region 初始化外部参数
parseJson(_missionJson);
HDevEngineCpp::HDevEngine myEngine;
//myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_952.hdpl");
myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl");
#pragma endregion
#pragma region 注册触发器回调
_station_1.init("Camera1","包膜后侧面贴胶错位检测相机9",_serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn);
_serviceManager->_triggerManager->registerCallback(19600, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_1.evaluate(triggerPos, triggerValue, 19610, 19698, byteArray); }, "D19600拍照触发");
{_station_1.evaluate(triggerPos, triggerValue, 19610, 19714, byteArray); }, "D19600拍照触发");
_serviceManager->_triggerManager->registerCallback(19602, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_1.evaluate(triggerPos, triggerValue, 19632, 19698, byteArray); }, "D19602拍照触发");
{_station_1.evaluate(triggerPos, triggerValue, 19632, 19734, byteArray); }, "D19602拍照触发");
_station_2.init("Camera2", "包膜后侧面贴胶错位检测相机10", _serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn);
_serviceManager->_triggerManager->registerCallback(19800, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_2.evaluate(triggerPos, triggerValue, 19810, 19898, byteArray); }, "D19800拍照触发");
{_station_2.evaluate(triggerPos, triggerValue, 19810, 19914, byteArray); }, "D19800拍照触发");
_serviceManager->_triggerManager->registerCallback(19802, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_2.evaluate(triggerPos, triggerValue, 19832, 19898, byteArray); }, "D19802拍照触发");
{_station_2.evaluate(triggerPos, triggerValue, 19832, 19934, byteArray); }, "D19802拍照触发");
_station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)", _serviceManagerIN, _missionJson, _SQLiteDB, bridgeIn);
_serviceManager->_triggerManager->registerCallback(20000, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_3.evaluate(triggerPos, triggerValue, 20010, 20098, byteArray); }, "D20000拍照触发");
{_station_3.evaluate(triggerPos, triggerValue, 20010, 20114, byteArray); }, "D20000拍照触发");
_serviceManager->_triggerManager->registerCallback(20002, 1, [this](int triggerPos, int triggerValue, QByteArray& byteArray)
{_station_3.evaluate(triggerPos, triggerValue, 20032, 20098, byteArray); }, "D20002拍照触发");
{_station_3.evaluate(triggerPos, triggerValue, 20032, 20134, byteArray); }, "D20002拍照触发");
#pragma endregion
return true;
}
@@ -40,8 +40,8 @@ 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)
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}
@@ -64,6 +64,7 @@ target_link_libraries(${CURRENT_FOLDER} PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Sql
)
BIN
View File
Binary file not shown.