V20251119-2.2.5

修复三协objectname不生效的问题。
存图线程增加try。
This commit is contained in:
2025-11-20 00:36:11 +08:00
parent f6d50c531a
commit a20069eac5
5 changed files with 146 additions and 102 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
#include <QDir>
#pragma execution_character_set("utf-8")
const std::string softwareVersion = "20251119-2.2.4";
const std::string softwareVersion = "20251119-2.2.5";
const std::string euiJsonVersion = "1.0.6";
#define globalDatabasePth "./sqlDatabase/eui_db.db" //全局数据库路径
#define saveImgEnable 1
-1
View File
@@ -148,7 +148,6 @@ public:
camera->clearCache();//清除缓存
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
QString::fromStdString(cameraName), sn, oneTriggerCaptrueTimes, camera->config.oriSaveFormat);//创建数据包
QString saveObjectName = "";
data->saveObjectName = saveObjectName;
camera->captureImage(data);//拍照
generalDet->ansyncProcess(data, address[batteryOffset], ("D" + address[0].completeAddr + "_1"));//处理算法 并在取到图片后发送完成信号
+39 -27
View File
@@ -192,38 +192,48 @@ public:
QQueue< std::shared_ptr<saveJob>>defaultQueue;
int imgRemainCount = 0;
void run() {
while (true) {
QQueue<std::pair<std::string, cv::Mat>> localQueue;
std::shared_ptr<saveJob> job = nullptr;
// 优先处理 priorityQueue
{
QMutexLocker locker(&mutex);
if (!priorityQueue.isEmpty()) {
job = priorityQueue.dequeue();
try {
while (true) {
QQueue<std::pair<std::string, cv::Mat>> localQueue;
std::shared_ptr<saveJob> job = nullptr;
// 优先处理 priorityQueue
{
QMutexLocker locker(&mutex);
if (!priorityQueue.isEmpty()) {
job = priorityQueue.dequeue();
}
else if (!defaultQueue.isEmpty()) {
job = defaultQueue.dequeue();
}
}
else if (!defaultQueue.isEmpty()) {
job = defaultQueue.dequeue();
// 没有任务就跳出
if (job == nullptr) {
break;
}
}
// 没有任务就跳出
if (job == nullptr) {
break;
}
qDebug() << "saveJob start" << QString::fromStdString(job->jobName) << "remain" << imgRemainCount;
imgRemainCount -= job->imgQueue.size();
localQueue.swap(job->imgQueue);
// 批量保存
while (!localQueue.isEmpty()) {
auto data = std::move(localQueue.dequeue());
qDebug() << "saveJob start" << QString::fromStdString(job->jobName) << "remain" << imgRemainCount;
imgRemainCount -= job->imgQueue.size();
localQueue.swap(job->imgQueue);
// 批量保存
while (!localQueue.isEmpty()) {
auto data = std::move(localQueue.dequeue());
#if saveImgEnable
cv::imwrite(data.first, data.second);
cv::imwrite(data.first, data.second);
#endif
}
}
qDebug() << "saveJob end " << QString::fromStdString(job->jobName);
qDebug() << "saveJob end " << QString::fromStdString(job->jobName);
}
}
catch (cv::Exception& e) {
qCritical() << "存图线程发生严重错误" << e.what();
}
catch (std::exception& e) {
qCritical() << "存图线程发生严重错误" << e.what();
}
catch (...) {
qCritical() << "存图线程发生严重错误";
}
}
@@ -240,7 +250,9 @@ public:
}
imgRemainCount += job->imgQueue.size();
qDebug() << "savejob enqueue" << QString::fromStdString(job->jobName) << "queue size" << priorityQueue.size() << "|" << defaultQueue.size() << " imgRemain" << imgRemainCount;
this->start();
if (!this->isRunning()) {
this->start();
}
}
int queueSize() {
@@ -17,88 +17,39 @@ void exceptionResume(std::shared_ptr<detData> data, baoMoQianDaMianDetParams* _d
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
}
cv::Rect extractRegion(cv::Mat& src,int binary_threshold = 50) {
cv::Mat binary;
threshold(src, binary, binary_threshold, 255, cv::THRESH_BINARY);
cv::dilate(binary, binary, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5)));
std::vector<std::vector<cv::Point>> contours;
findContours(binary, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
bool BaoMoQianShangDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
///////////////////取图//处理//////////////////
try {
cv::Mat src = data->oriImgs[0];
cv::Mat Paint;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB);
else
data->oriImgs[0].copyTo(Paint);
//////////////////////检测//////////////////////
cv::Mat afterDingWei;
{
cv::Mat forDingWei;
cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1);
cv::Mat segResult = _detParams->dingwei_seg->Evaluate(src);
auto rect = findMaxAreaContour(segResult);
rect.x *= 10; rect.y *= 10; rect.width *= 10; rect.height *= 10;
if(rect.width <4000 || rect.height <4000){
exceptionResume(data, _detParams, address, "定位失败");
return true;
}
src(rect).copyTo(afterDingWei);
}
cv::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei);
std::vector<std::vector<cv::Point>>contours;
cv::findContours(segResult, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
bool isNg = false;
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if(rect.width <60 || rect.height <60)
continue;
std::vector<cv::Mat> clsImgs = cutImg2ClsVec(rect, afterDingWei);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
int clsResult = _detParams->baomodamian_cls->Evaluate(clsImg);
if (clsResult == 2)
clsIsNg = true;
}
if(clsIsNg == true)
cv::drawContours(Paint, contours, i, cv::Scalar(0, 0, 255), 3);
for (auto& clsImg : clsImgs)
data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",clsImg });
}
data->resultImgs.push_back(Paint);
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
return true;
}
CATCH_EXCEPTIONS
exceptionResume(data, _detParams, address, "检测异常");
return true;
double maxArea = 0;
int maxAreaIdx = -1;
for (size_t i = 0; i < contours.size(); i++) {
double area = contourArea(contours[i]);
if (area > maxArea) {
maxArea = area;
maxAreaIdx = i;
}
}
cv::Rect boundingRect = cv::boundingRect(contours[maxAreaIdx]);
return boundingRect;
}
int index = 0;
bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
QString date = QDateTime::currentDateTime().toString("yyyy_MM_dd_HH_mm_ss_").toUtf8() + QString::number(index++);
data->SNcode = date.toStdString();
bool BaoMoQianShangDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
index++;
///////////////////取图//处理//////////////////
try {
//data->oriImgs[0] = cv::imread("D:\\testImg\\Camera1.bmp");
cv::Mat src = data->oriImgs[0];
cv::Mat Paint;
if (data->oriImgs[0].channels() == 1)
cv::cvtColor(data->oriImgs[0], Paint, cv::COLOR_GRAY2RGB);
else
data->oriImgs[0].copyTo(Paint);
//////////////////////检测//////////////////////
cv::Mat afterDingWei;
{
cv::Mat forDingWei;
cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1);
cv::Mat segResult = _detParams->dingwei_seg->Evaluate(src);
cv::Mat segResult = ~_detParams->dingwei_seg->Evaluate(forDingWei);
auto rect = findMaxAreaContour(segResult);
rect.x *= 10; rect.y *= 10; rect.width *= 10; rect.height *= 10;
if (rect.width < 4000 || rect.height < 4000) {
@@ -107,8 +58,16 @@ bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams
}
src(rect).copyTo(afterDingWei);
}
cv::resize(afterDingWei, afterDingWei, cv::Size(), 0.5, 0.5);
cv::Mat Paint;
if (afterDingWei.channels() == 1)
cv::cvtColor(afterDingWei, Paint, cv::COLOR_GRAY2RGB);
else
afterDingWei.copyTo(Paint);
data->segOriginImgs.push_back(afterDingWei);
cv::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
std::vector<std::vector<cv::Point>>contours;
cv::findContours(segResult, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
bool isNg = false;
@@ -132,7 +91,80 @@ bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams
}
data->resultImgs.push_back(Paint);
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
if (isNg == true)
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 0, 255));
else
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
return true;
}
CATCH_EXCEPTIONS
exceptionResume(data, _detParams, address, "检测异常");
return true;
}
bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address) {
QString date = QDateTime::currentDateTime().toString("yyyy_MM_dd_HH_mm_ss_").toUtf8() + QString::number(index++);
data->SNcode = date.toStdString();
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
index++;
///////////////////取图//处理//////////////////
try {
//data->oriImgs[0] = cv::imread("D:\\testImg\\Camera2.bmp");
cv::Mat src = data->oriImgs[0];
//////////////////////检测//////////////////////
cv::Mat afterDingWei;
{
cv::Mat forDingWei;
cv::resize(src, forDingWei, cv::Size(), 0.1, 0.1);
cv::Mat segResult = ~_detParams->dingwei_seg->Evaluate(forDingWei);
auto rect = findMaxAreaContour(segResult);
rect.x *= 10; rect.y *= 10; rect.width *= 10; rect.height *= 10;
if (rect.width < 4000 || rect.height < 4000) {
exceptionResume(data, _detParams, address, "定位失败");
return true;
}
src(rect).copyTo(afterDingWei);
}
cv::resize(afterDingWei, afterDingWei, cv::Size(), 0.5, 0.5);
cv::Mat Paint;
if (afterDingWei.channels() == 1)
cv::cvtColor(afterDingWei, Paint, cv::COLOR_GRAY2RGB);
else
afterDingWei.copyTo(Paint);
data->segOriginImgs.push_back(afterDingWei);
cv::Mat segResult = ~_detParams->baomodamian_seg->Evaluate(afterDingWei);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
std::vector<std::vector<cv::Point>>contours;
cv::findContours(segResult, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
bool isNg = false;
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
if (rect.width < 60 || rect.height < 60)
continue;
std::vector<cv::Mat> clsImgs = cutImg2ClsVec(rect, afterDingWei);
bool clsIsNg = false;
for (auto& clsImg : clsImgs) {
int clsResult = _detParams->baomodamian_cls->Evaluate(clsImg);
if (clsResult == 2)
clsIsNg = true;
}
if (clsIsNg == true)
cv::drawContours(Paint, contours, i, cv::Scalar(0, 0, 255), 3);
for (auto& clsImg : clsImgs)
data->clsOriginImgs.push_back({ clsIsNg == true ? "NG" : "OK",clsImg });
}
data->resultImgs.push_back(Paint);
if(isNg == true)
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 0, 255));
else
textPainter.putText(Paint, "OK", cv::Point(50, 50), cv::Scalar(0, 255, 0));
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");
return true;
}
@@ -6,12 +6,13 @@ using namespace HDevEngineCpp;
class baoMoQianDaMianDetParams {
public:
handdleAI::pSegmentation* dingwei_seg = nullptr;
handdleAI::pSegmentation* dingwei_seg = nullptr;
handdleAI::pSegmentation* baomodamian_seg = nullptr;
handdleAI::pClassification* baomodamian_cls = nullptr;
};
bool BaoMoQianShangDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address);
bool BaoMoQianXiaDaMian(std::shared_ptr <detData> data, baoMoQianDaMianDetParams* _detParams, yh_581_address address);
class _581_BaoMo_Cam1234 : public mission {
@@ -31,8 +32,8 @@ public:
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
if (initOnce == false) {
_baoMoQianDaMianDetParams[0].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/seg_dingwei.BHD", 64, 0);
_baoMoQianDaMianDetParams[1].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/seg_dingwei.BHD", 0, 1);
_baoMoQianDaMianDetParams[0].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMianDingWei_Seg.BHD", 64, 0);
_baoMoQianDaMianDetParams[1].dingwei_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMianDingWei_Seg.BHD", 0, 1);
_baoMoQianDaMianDetParams[0].baomodamian_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 0);
_baoMoQianDaMianDetParams[1].baomodamian_seg = handdleAI::CreateSegObjS("./handleAiModels/BaoMoQianDaMian_Seg.BHD", 64, 1);