V20251119-2.2.5
修复三协objectname不生效的问题。 存图线程增加try。
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
@@ -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"));//处理算法 并在取到图片后发送完成信号
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user