稳定版本备份
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -67,7 +67,6 @@ public:
|
||||
gpuMutex->unlock();
|
||||
return res;
|
||||
}
|
||||
private:
|
||||
handdleAI::pClassification* clsPtr;
|
||||
};
|
||||
class handleAiModelDet{
|
||||
|
||||
Binary file not shown.
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Binary file not shown.
Reference in New Issue
Block a user