V20251118-2.2.2

优化CLS切图算法。
优化PCIE相机无法找到设备的问题。
This commit is contained in:
2025-11-18 00:30:17 +08:00
parent 789b71b815
commit c586dd932c
9 changed files with 500 additions and 83 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
#include <QDir>
#pragma execution_character_set("utf-8")
const std::string softwareVersion = "20251117-2.2.1";
const std::string softwareVersion = "20251118-2.2.2";
const std::string euiJsonVersion = "1.0.6";
#define globalDatabasePth "./sqlDatabase/eui_db.db" //全局数据库路径
#define saveImgEnable 1
+6 -4
View File
@@ -116,8 +116,8 @@ static cv::Mat cutImg2Cls(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targe
return squareImage;
}
static std::vector<cv::Mat> cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128))
{
static std::vector<cv::Mat> cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)){
std::vector<cv::Mat> result;
if (boundingBox.width <= 0 || boundingBox.height <= 0 || imgInput.empty()) {
@@ -127,7 +127,9 @@ static std::vector<cv::Mat> cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput
const int w = boundingBox.width;
const int h = boundingBox.height;
const int minSide = std::min(w, h);
const int targetMinSide = std::max(1, std::min(targetSize.width, targetSize.height));
int minSide = std::min(w, h);
minSide = std::max(minSide, targetMinSide);
if (minSide <= 0) {
std::cerr << "Bounding box has zero width or height." << std::endl;
return result;
@@ -147,7 +149,7 @@ static std::vector<cv::Mat> cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput
starts.emplace_back(s);
}
// 确保包含末端(避免遗漏),同时避免与最后一个重复
const int lastStart = endCoord - step;
const int lastStart = std::max(beginCoord, endCoord - step);
if (starts.empty() || starts.back() != lastStart) {
starts.emplace_back(lastStart);
}
+41 -72
View File
@@ -269,65 +269,48 @@ public:
saveCls = _paramSyncManager->get("通用设置", "存储Cls图", true).toBool();
getParamTimer.restart();
}
try {
std::shared_ptr<saveJob> oriJob(new saveJob("[ORI_JOB]" + data->SNcode));
std::shared_ptr<saveJob> resJob(new saveJob("[RES_JOB]" + data->SNcode));
std::shared_ptr<saveJob> oriJob(new saveJob("[ORI_JOB]" + data->SNcode));
std::shared_ptr<saveJob> resJob(new saveJob("[RES_JOB]" + data->SNcode));
QString oriSavePath = _ImageSavePathFormatter.genPath(data, oriImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名
if (saveOri == true || saveSeg == true || saveCls == true) {
createDirectoryIfNotExists(oriSavePath);//不存在此文件夹则创建
if (data->oriImgs.size() != 0 && saveOri == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->oriImgs);//按规则为文件创建命名
packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->oriImgs);//打包数据
}
//SEG原图
if (data->segOriginImgs.size() != 0 && saveSeg == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->segOriginImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->segOriginImgs);//打包数据
}
//CLS原图
if (data->clsOriginImgs.size() != 0 && saveCls == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->clsOriginImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->clsOriginImgs);//打包数据
}
}
QString oriSavePath = _ImageSavePathFormatter.genPath(data, oriImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名
if (saveOri == true || saveSeg == true || saveCls == true) {
createDirectoryIfNotExists(oriSavePath);//不存在此文件夹则创建
if (data->oriImgs.size() != 0 && saveOri == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, oriImg, data->oriImgs);//按规则为文件创建命名
packageData(oriJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->oriImgs);//打包数据
}
//SEG原图
if (data->segOriginImgs.size() != 0 && saveSeg == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, segImg, data->segOriginImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->segOriginImgs);//打包数据
}
//CLS原图
if (data->clsOriginImgs.size() != 0 && saveCls == true) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genClsFileNames(data, clsImg, data->clsOriginImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, oriSavePath.toLocal8Bit().toStdString(), fileNames, data->clsOriginImgs);//打包数据
QString resSavePath = _ImageSavePathFormatter.genPath(data, resImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名
if (saveRes == true) {
createDirectoryIfNotExists(resSavePath);//不存在此文件夹则创建
//结果图保存
if (data->resultImgs.size() != 0) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->resultImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->resultImgs);//打包数据
}
}
if (oriJob->imgQueue.size() != 0)
saveThread.addJob(oriJob);
if (resJob->imgQueue.size() != 0)
saveThread.addJob(resJob, imgSaveThread::priority);
}
QString resSavePath = _ImageSavePathFormatter.genPath(data, resImg, data->customPath, data->customImageSaveTemplateParams);//获取文件夹名
if (saveRes == true){
createDirectoryIfNotExists(resSavePath);//不存在此文件夹则创建
//结果图保存
if (data->resultImgs.size() != 0) {
std::vector<std::string>fileNames = _ImageSavePathFormatter.genFileNames(data, resImg, data->resultImgs);//按规则为文件创建命名
packageData(resJob->imgQueue, resSavePath.toLocal8Bit().toStdString(), fileNames, data->resultImgs);//打包数据
}
catch (...) {
qDebug() << "存图崩溃 SN" << QString::fromStdString(data->SNcode) << " uuid" << data->uuid;
}
if (oriJob->imgQueue.size() != 0)
saveThread.addJob(oriJob);
if (resJob->imgQueue.size() != 0)
saveThread.addJob(resJob, imgSaveThread::priority);
//额外储存NG文件夹
//std::string additionalSaveNgImgPath = genDirName(data, additionalSaveNgImg);
//std::vector<std::string>additionalSaveNgImgNames = genFileNames(data, additionalSaveNgImg);
//if (additionalSaveNgImgNames.size() > 0)
// createDirectoryIfNotExists(additionalSaveNgImgPath);//不存在此文件夹则创建
//int additionalSaveNgImgNamesIndex = 0;
//for (int index = 0; index < data->segOriginImgs.size()&& additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++)
//{
// saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->segOriginImgs[index]);
// additionalSaveNgImgNamesIndex++;
//}
//for (int index = 0; index < data->oriImgs.size() && additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++)
//{
// saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->oriImgs[index]);
// additionalSaveNgImgNamesIndex++;
//}
//for (int index = 0; index < data->resultImgs.size() && additionalSaveNgImgNames.size() > additionalSaveNgImgNamesIndex; index++)
//{
// saveThread.addData(additionalSaveNgImgPath + additionalSaveNgImgNames[additionalSaveNgImgNamesIndex], data->resultImgs[index]);
// additionalSaveNgImgNamesIndex++;
//}
}
private:
bool saveOri = true, saveRes = true, saveSeg = true, saveCls = true;
@@ -339,15 +322,8 @@ private:
qWarning() << "检测到存图文件名数量与图片数量不符";
for (int index = 0; index < fileNames.size() && index < mats.size(); index++) {
try {
if (mats[index].data == nullptr) {
qDebug() << "在存图线程中发现空指针";
continue;
}
}
catch (...) {
qDebug() << "在存图线程中发现无效图像";
if (mats[index].data == nullptr) {
qDebug() << "在存图线程中发现空指针";
continue;
}
@@ -361,15 +337,8 @@ private:
qWarning() << "检测到存图文件名数量与图片数量不符";
for (int index = 0; index < fileNames.size() && index < mats.size(); index++) {
try {
if (mats[index].second.data == nullptr) {
qDebug() << "在存图线程中发现空指针";
continue;
}
}
catch (...) {
qDebug() << "在存图线程中发现无效图像";
if (mats[index].second.data == nullptr) {
qDebug() << "在存图线程中发现空指针";
continue;
}
+80 -4
View File
@@ -6,11 +6,12 @@
using namespace std;
void baomoXiaDMianCut(const std::string path, const std::string format, const std::string outputPath,cv::Size fillter) {
void baomoShangDMianCut(const std::string path, const std::string format, const std::string outputPath,cv::Size fillter) {
//int
handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImgFiles/baoMoXiaDaMian_seg.BHD", 1, 0);
handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImageFiles/baoMoXiaDaMian_seg.BHD", 1, 0);
std::vector<std::string> images;
cv::glob(path + "/*." + format, images, false);
std::cout << "files count" << images.size() << std::endl;
for (size_t i = 0; i < images.size(); i++) {
std::string filePath = outputPath + "/" + std::to_string(i) + "/";
createDirectoryIfNotExists(QString::fromStdString(filePath));
@@ -29,9 +30,9 @@ void baomoXiaDMianCut(const std::string path, const std::string format, const st
std::vector<std::vector<cv::Point>> contours;
cv::findContours(SegResult,contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
for (int ii = 0; ii < contours.size(); ii++) {
cv::Rect rect = cv::boundingRect(contours[i]);
cv::Rect rect = cv::boundingRect(contours[ii]);
if (rect.width > fillter.width || rect.height > fillter.height) {
cv::putText(Paint, std::to_string(i), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(255, 255, 255), 5);
cv::putText(Paint, std::to_string(ii), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(255, 255, 255), 5);
cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3);
auto imgs = cutImg2ClsVec(rect, srcImage);
for (int o = 0; o < imgs.size(); o++) {
@@ -40,5 +41,80 @@ void baomoXiaDMianCut(const std::string path, const std::string format, const st
}
}
cv::imwrite(filePath + "/Paint.bmp", Paint);
std::cout << i << "/" << images.size() << std::endl;
}
}
void baomoXiaDMianSiJiaoCut(const std::string path, const std::string format, const std::string outputPath, cv::Size fillter) {
//int
handdleAI::pSegmentation* dingwei = handdleAI::CreateSegObjS("./cutImageFiles/Seg_Baomo_Xiadamian_Sijiao.BHD", 1, 0);
handdleAI::pSegmentation* seg = handdleAI::CreateSegObjS("./cutImageFiles/Seg_2025-11-14_12-24-59_8.303497.BHD", 1, 0);
std::vector<std::string> images;
cv::glob(path + "/*." + format, images, false);
std::cout << "files count" << images.size() << std::endl;
for (size_t i = 0; i < images.size(); i++) {
std::string filePath = outputPath + "/" + std::to_string(i) + "/";
createDirectoryIfNotExists(QString::fromStdString(filePath));
cv::Mat srcImage = cv::imread(images[i], -1);
cv::Mat Paint;
if (srcImage.channels() == 1)
cv::cvtColor(srcImage, Paint, cv::COLOR_GRAY2BGR);
else
srcImage.copyTo(Paint);
if (srcImage.empty()) {
std::cout << "图片为空!" << std::endl;
continue;
}
//定位高>800 宽>6000的
std::vector<cv::Mat> dingWeiImgs;
std::vector<cv::Rect> rects;
{
cv::Mat forDingWei;
cv::resize(srcImage, forDingWei, cv::Size(), 0.1, 0.1);
cv::Mat dingweiSegResult = ~dingwei->Evaluate(forDingWei);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(dingweiSegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
for (int o = 0; o < contours.size(); o++) {
cv::Rect rect = cv::boundingRect(contours[o]);
rect.width = rect.width * 10 + 10;
rect.height = rect.height * 10 + 10;
rect.x = rect.x * 10 - 10;
rect.y = rect.y * 10 - 10;
if (rect.width > 5500, rect.height > 700) {
dingWeiImgs.push_back(srcImage(rect).clone());
cv::rectangle(Paint, rect, cv::Scalar(0, 255, 0), 3);
rects.push_back(rect);
}
}
}
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
if (dingWeiImgs.size() != 2)std:cout << "图片不满足2"<<std::endl;
for (int imgIndex = 0; imgIndex < dingWeiImgs.size(); imgIndex++) {
cv::Mat forSeg;
cv::resize(dingWeiImgs[imgIndex], forSeg, cv::Size(), 0.5, 0.5);
cv::imwrite(filePath + "/" + std::to_string(imgIndex) + "_SEG_ORI.bmp", forSeg);
auto SegResult = ~seg->Evaluate(forSeg);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(SegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
for (int ii = 0; ii < contours.size(); ii++) {
cv::Rect rect = cv::boundingRect(contours[ii]);
if (rect.width > fillter.width || rect.height > fillter.height) {
auto imgs = cutImg2ClsVec(rect, forSeg);
for (int o = 0; o < imgs.size(); o++) {
cv::imwrite(filePath + "/" + std::to_string(imgIndex) + "_" + std::to_string(ii) + "_" + std::to_string(o) + "CLS.bmp", imgs[o]);
}
rect.x += +rects[imgIndex].x /2;
rect.y += +rects[imgIndex].y /2;
cv::putText(Paint, std::to_string(ii), cv::Point(rect.x + rect.width / 2, rect.y + rect.height / 2), 1, 2, cv::Scalar(0, 0, 255), 5);
cv::rectangle(Paint, rect, cv::Scalar(0, 0, 255), 3);
}
}
}
cv::imwrite(filePath + "/Paint.jpg", Paint);
std::cout << i << "/" << images.size() << std::endl;
}
}
+1 -1
View File
@@ -2,6 +2,6 @@
int main(int argc, char* argv[])
{
//baomoXiaDMianCut(
baomoXiaDMianSiJiaoCut("E:\\imgs", "bmp", "./outputs/" , cv::Size(50, 50));
return 1;
}
@@ -0,0 +1,9 @@
#include <581_RuanLianJie_majiatiejiao.h>
mission* createMission() {
return new _581_YuHan_hanqian();
}
void destroyMission(mission* _mission) {
delete _mission;
}
@@ -0,0 +1,284 @@
#include <missionBase.hpp>
#include <sxGlobal.h>
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
#pragma endregion
class RuanLianJie_majiatiejiao {
public:
};
#if 0
bool top_tiejiaojianece(std::shared_ptr <detData> data, RuanLianJie_majiatiejiao* _detParams, sx_581_address address) {
try{
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
cv::Mat resultImage = img2D.clone();
if (resultImage.channels() == 1) {
cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR);
}
QString okng_tag = "OK";
cv::Mat seg_detectImage;
cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1);
plcResult = "1";
bool isNG = false;
if (DOGLIVE) {
std::vector<std::pair <int, cv::Mat >>clsImgs;
bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs);
for (int i = 0; i < clsImgs.size(); i++) {
addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first));
}
}
if (isNG == false)//OK
{
putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200);
okng_tag = "OK";
}
else
{
putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200);
plcResult = "2";
}
cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5);
resMat.push_back(resultImage);
if (resMat.size() > 0)
{
addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图
}
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
data->oriImgs[0] = cv::imread("D:\\testImage\\Camera1.bmp", -1);
QByteArray plcResult = "2";
cv::Mat sourceImg;
data->oriImgs[0].copyTo(sourceImg);
cv::Mat Paint;
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
HDevEngineCpp::HDevProcedure proc("_4_Inspection_Packaging_tape");
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
HObject in_Image;
in_Image = MatToHObject(sourceImg);
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
procedureCall.Execute();//执行halcon程序
HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDeTails;
out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle");
out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle");
//out_NgDeTails = procedureCall.GetOutputCtrlParamTuple("out_NgDeTails");
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
int flag = out_Flag.D();
std::string NgDeTails = out_NgDeTails.ToString();
plcResult = "1";
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
if (flag == 1)
{
int out_GlueRectangle_L = out_GlueRectangle.Length();
for (auto i = 0; i < out_GlueRectangle_L / 4; i++)
cv::rectangle(Paint,
cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1],
out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]),
cv::Scalar(0, 255, 0), 5);
textPainter.putText(Paint,
"OK",
cv::Point(0, 50), cv::Scalar(0, 255, 0));
}
else
{
int out_ErrRectangle_L = out_ErrRectangle.Length();
for (auto i = 0; i < out_ErrRectangle_L / 4; i++)
cv::rectangle(Paint,
cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1],
out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]),
cv::Scalar(0, 255, 0), 5);
textPainter.putText(Paint,
"NG",
cv::Point(0, 50), cv::Scalar(0, 0, 255));
plcResult = "2";
}
plcResult = "1";
sourceImg.release();
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
return true;
#endif
}
CATCH_EXCEPTIONS
qDebug() << "[Error] " << QString::fromUtf8("检测失败!");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
return true;
}
#endif
bool tiejiaojianece(std::shared_ptr <detData> data, RuanLianJie_majiatiejiao * _detParams, sx_581_address address) {
try {
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
cv::Mat resultImage = img2D.clone();
if (resultImage.channels() == 1) {
cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR);
}
QString okng_tag = "OK";
cv::Mat seg_detectImage;
cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1);
plcResult = "1";
bool isNG = false;
if (DOGLIVE) {
std::vector<std::pair <int, cv::Mat >>clsImgs;
bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs);
for (int i = 0; i < clsImgs.size(); i++) {
addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first));
}
}
if (isNG == false)//OK
{
putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200);
okng_tag = "OK";
}
else
{
putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200);
plcResult = "2";
}
cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5);
resMat.push_back(resultImage);
if (resMat.size() > 0)
{
addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图
}
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
//data->oriImgs[0] = cv::imread("D:\\testImage\\" + data->cameraKeyName + ".bmp",-1);
//存图数据加保存队列,加锁,避免数据访问冲突
QByteArray plcResult = "2";
cv::Mat sourceImg;
data->oriImgs[0].copyTo(sourceImg);
cv::Mat Paint;
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
HDevEngineCpp::HDevProcedure proc("_3_Inspection_Packaging_Tape");
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
HObject in_Image;
in_Image = MatToHObject(sourceImg);
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
procedureCall.Execute();//执行halcon程序
HalconCpp::HTuple out_ErrRectangle, out_GlueRectangle, out_Flag, out_NgDetails;
out_ErrRectangle = procedureCall.GetOutputCtrlParamTuple("out_ErrRectangle");
out_GlueRectangle = procedureCall.GetOutputCtrlParamTuple("out_GlueRectangle");
out_NgDetails = procedureCall.GetOutputCtrlParamTuple("out_NgDetails");
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");
int flag = out_Flag.D();
std::string NgDeTails = gbkToUtf8(out_NgDetails.ToString().Text());
plcResult = "1";
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
if (flag == 1)
{
int out_GlueRectangle_L = out_GlueRectangle.Length();
for (auto i = 0; i < out_GlueRectangle_L / 4; i++)
cv::rectangle(Paint,
cv::Rect(out_GlueRectangle[i * 4], out_GlueRectangle[i * 4 + 1],
out_GlueRectangle[i * 4 + 2], out_GlueRectangle[i * 4 + 3]),
cv::Scalar(0, 255, 0), 5);
textPainter.putText(Paint,
"OK",
cv::Point(0, 50), cv::Scalar(0, 255, 0));
}
else
{
int out_ErrRectangle_L = out_ErrRectangle.Length();
for (auto i = 0; i < out_ErrRectangle_L / 4; i++)
cv::rectangle(Paint,
cv::Rect(out_ErrRectangle[i * 4], out_ErrRectangle[i * 4 + 1],
out_ErrRectangle[i * 4 + 2], out_ErrRectangle[i * 4 + 3]),
cv::Scalar(0, 0, 255), 10);
textPainter.putText(Paint,"NG",cv::Point(0, 50), cv::Scalar(0, 0, 255));
textPainter.putText(Paint, NgDeTails, cv::Point(0, 550), cv::Scalar(0, 0, 255));
plcResult = "2";
}
if(data->service->_paramSyncManager->get("通用设置","强制OK",false).toBool())
plcResult = "1";
sourceImg.release();
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
return true;
#endif
}
CATCH_EXCEPTIONS
qDebug() << "[Error] " << QString::fromUtf8("检测失败!");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 0, 255));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool())
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
else
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果反馈
return true;
}
class _581_YuHan_hanqian : public mission {
public:
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_1;
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_2;
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_3;
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dibu_4;
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_1;
_581_SX_Single_triggerTemplate< RuanLianJie_majiatiejiao> dingbu_2;
RuanLianJie_majiatiejiao DetParams;
//RuanLianJie_majiatiejiao lvDetParams;
void onConfigReloaded() {
HDevEngineCpp::HDevEngine myEngine;
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
}
bool initCustom() {
#pragma region 注册触发器回调
dingbu_1.init("Camera1", "马甲贴胶检测-A面-顶部相机-相机1", { { 5000, 1,{5010},"5002","5006",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-顶部相机-相机1");
dingbu_2.init("Camera2", "马甲贴胶检测-B面-顶部相机-相机1", { { 5100, 1,{5110},"5102","5106",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-顶部相机-相机1");
dibu_1.init("Camera3", "马甲贴胶检测-A面-底部相机-相机1", { { 5200, 1,{5210},"5202","5206",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机1");
dibu_2.init("Camera4", "马甲贴胶检测-A面-底部相机-相机2", { { 5300, 1,{5310},"5302","5306",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-A面-底部相机-相机2");
dibu_3.init("Camera5", "马甲贴胶检测-B面-底部相机-相机1", { { 5400, 1,{5410},"5402","5406",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机1");
dibu_4.init("Camera6", "马甲贴胶检测-B面-底部相机-相机2", { { 5500, 1,{5510},"5502","5506",-1} }, 1, &DetParams, _serviceManager, bridge, tiejiaojianece,"马甲贴胶检测-B面-底部相机-相机2");
#pragma endregion
return true;
}
};
#pragma once
@@ -0,0 +1,77 @@
# 获取获取当前目录名
get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(TIMESTAMP RUN_TIME)
message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME})
set(DLL_NAMES "opencv" "halcon" "handdleAI")
foreach(child ${DLL_NAMES})
LIST(APPEND ENV_INCLUDE ${${child}_include})
LIST(APPEND ENV_LIB ${${child}_lib})
LIST(APPEND ENV_TARGET ${${child}_target_link})
endforeach()
message(" ENV_INCLUDE : " ${ENV_INCLUDE} )
message(" ENV_LIB : " ${ENV_LIB} )
message(" ENV_TARGET : " ${ENV_TARGET} )
include_directories(
${PROJECT_ROOT_PATH}/src/core
${PROJECT_ROOT_PATH}/src/core/handleAi
${PROJECT_ROOT_PATH}/src/core/service
${PROJECT_ROOT_PATH}/src/core/sql
${ENV_INCLUDE}
)
link_directories (
${ENV_LIB}
)
add_compile_options(/utf-8)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC OFF)
set(CMAKE_AUTORCC ON)
FILE(GLOB HEAD_FILES "*.h" )
FILE(GLOB SRC_FILES "./*.cpp")
FILE(GLOB UI_FILES "./*.ui")
#find_package(Qt5 COMPONENTS Core REQUIRED)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED)
add_library(${CURRENT_FOLDER} SHARED
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
${PROJECT_ROOT_PATH}/include/interface.h
)
set_target_properties(${CURRENT_FOLDER} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
)
target_link_libraries(${CURRENT_FOLDER} PRIVATE
${ENV_TARGET}
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
)
# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY)
string(TIMESTAMP RUN_TIME)
message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME})
message( " header files "${HEAD_FILES})
@@ -38,7 +38,7 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
//搜索所有设备
int SearchDevice(){
if (m_stIFList.nInterfaceNum != 0) {
if (m_stIFList.nInterfaceNum == 0) {
const char* chCtiPath = "MvFGProducerXoF.cti";//.cti文件路径
int nRet = 0;
nRet = MV_CC_EnumInterfacesByGenTL(&m_stIFList, chCtiPath);