V20251118-2.2.2
优化CLS切图算法。 优化PCIE相机无法找到设备的问题。
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user