更新,完善检测算法
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <back/threadPoolManager.h>
|
||||
#include <halconAlgo/Inspection.h>
|
||||
|
||||
static HalconCpp::HObject MatToHObject(cv::Mat& image)
|
||||
{
|
||||
HalconCpp::HObject Hobj;
|
||||
@@ -210,70 +211,142 @@ static void MatToHObjectV(cv::Mat& image, HalconCpp::HObject& Hobj)
|
||||
}
|
||||
|
||||
}
|
||||
void ALGO_Inspection(std::shared_ptr <detData> data)
|
||||
|
||||
|
||||
void pinHandleAiEvaluate(cv::Mat& src, cv::Mat& Paint,
|
||||
handdleAI::pSegmentation *segPtr, handdleAI::pClassification* clsPtr)
|
||||
{
|
||||
cv::Mat segRes = ~segPtr->Evaluate(src);
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
cv::findContours(segRes, contours, cv::RETR_EXTERNAL,cv::CHAIN_APPROX_NONE);
|
||||
for (auto contour : contours)
|
||||
{
|
||||
cv::Rect rect = cv::boundingRect(contour);
|
||||
rect += cv::Size(1, 1);
|
||||
rect = cv::Rect(
|
||||
max(0, rect.x),
|
||||
max(0, rect.y),
|
||||
min(rect.x + rect.width, src.rows),
|
||||
min(rect.y + rect.height, src.cols)
|
||||
);
|
||||
|
||||
int clsRes = clsPtr->Evaluate(src(rect));
|
||||
cv::Scalar color;
|
||||
switch (clsRes)
|
||||
{
|
||||
case 0:
|
||||
color = cv::Scalar(0, 255, 0, 128);
|
||||
break;
|
||||
case 1:
|
||||
color = cv::Scalar(255, 0, 0, 128);
|
||||
break;
|
||||
default:
|
||||
color = cv::Scalar(255, 255, 255, 128);
|
||||
}
|
||||
cv::rectangle(Paint, rect, color, 2);
|
||||
}
|
||||
}
|
||||
|
||||
void pinHalconEvaluate(std::vector<cv::Rect>& Result,cv::Mat& src, cv::Mat& Paint)
|
||||
{
|
||||
//hv_in_Parameter
|
||||
//[0]-产品种类; 1A正面 2A反面 3B正面 4C正面
|
||||
//[1]-图像序号第一位;
|
||||
//[2]-图像序号第二位;
|
||||
//[3]-3d相机精度(mm);
|
||||
//[4]-ping针偏移判NG阈值(mm);
|
||||
//[5]-切图存图开关
|
||||
#pragma region halcon变量定义
|
||||
//测量
|
||||
HObject ho_in_Image;
|
||||
HObject ho_in_Image2;
|
||||
HTuple hv_in_ShapePath;
|
||||
HTuple hv_in_Parameter;
|
||||
HTuple hv_out_Pings_X;
|
||||
HTuple hv_out_Pings_Y;
|
||||
HTuple hv_out_NG_Pings_X;
|
||||
HTuple hv_out_NG_Pings_Y;
|
||||
HTuple hv_out_Pings_Num;
|
||||
HTuple hv_out_NG_Pings_Num;
|
||||
HTuple hv_out_Flag_INS;
|
||||
|
||||
//ROI
|
||||
HTuple hv_out_ROI_Value;
|
||||
HTuple hv_out_Flag_ROI;
|
||||
#pragma endregion
|
||||
ho_in_Image = MatToHObject(src);
|
||||
hv_in_Parameter.Append(3);
|
||||
hv_in_Parameter.Append(5);
|
||||
hv_in_Parameter.Append(1);
|
||||
hv_in_Parameter.Append(0.0135);
|
||||
hv_in_Parameter.Append(0.2);
|
||||
hv_in_Parameter.Append(2);
|
||||
|
||||
hv_in_ShapePath = "./halconModel";
|
||||
|
||||
|
||||
Pings_Inspection(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X,
|
||||
&hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num,
|
||||
&hv_out_NG_Pings_Num, &hv_out_Flag_INS);
|
||||
|
||||
Pings_ROI(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_ROI_Value, &hv_out_Flag_ROI);
|
||||
for (int i = 0; i < hv_out_ROI_Value.Length() / 4; i++)
|
||||
{
|
||||
Result.push_back(
|
||||
cv::Rect(
|
||||
hv_out_ROI_Value[i * 4 + 1].D(),
|
||||
hv_out_ROI_Value[i * 4].D(),
|
||||
hv_out_ROI_Value[i * 4 + 3].D() - hv_out_ROI_Value[i * 4 + 1].D(),
|
||||
hv_out_ROI_Value[i * 4 + 2].D() - hv_out_ROI_Value[i * 4].D()
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
void ALGO_Inspection(std::shared_ptr <detData> data, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
if (data->oriImgs.size() < 1)
|
||||
{
|
||||
qDebug() << __FUNCDNAME__ << __LINE__ << "camera Mat size is Error!";
|
||||
return;
|
||||
}
|
||||
//hv_in_Parameter
|
||||
//[0]-产品种类; 1A正面 2A反面 3B正面 4C正面
|
||||
//[1]-图像序号第一位;
|
||||
//[2]-图像序号第二位;
|
||||
//[3]-3d相机精度(mm);
|
||||
//[4]-ping针偏移判NG阈值(mm);
|
||||
//[5]-切图存图开关
|
||||
#pragma region halcon变量定义
|
||||
//测量
|
||||
HObject ho_in_Image;
|
||||
HObject ho_in_Image2;
|
||||
HTuple hv_in_ShapePath;
|
||||
HTuple hv_in_Parameter;
|
||||
HTuple hv_out_Pings_X;
|
||||
HTuple hv_out_Pings_Y;
|
||||
HTuple hv_out_NG_Pings_X;
|
||||
HTuple hv_out_NG_Pings_Y;
|
||||
HTuple hv_out_Pings_Num;
|
||||
HTuple hv_out_NG_Pings_Num;
|
||||
HTuple hv_out_Flag_INS;
|
||||
cv::Mat src = data->oriImgs[0];
|
||||
cv::Mat Paint;
|
||||
cvtColor(src, Paint, cv::COLOR_GRAY2BGR);
|
||||
std::vector<cv::Rect>halconResult;
|
||||
//hv_in_Parameter
|
||||
//[0]-产品种类; 1A正面 2A反面 3B正面 4C正面
|
||||
//[1]-图像序号第一位;
|
||||
//[2]-图像序号第二位;
|
||||
//[3]-3d相机精度(mm);
|
||||
//[4]-ping针偏移判NG阈值(mm);
|
||||
//[5]-切图存图开关
|
||||
|
||||
//ROI
|
||||
HTuple hv_out_ROI_Value;
|
||||
HTuple hv_out_Flag_ROI;
|
||||
#pragma endregion
|
||||
//HALCON
|
||||
pinHalconEvaluate(halconResult,src, Paint);
|
||||
|
||||
cv::Mat mat = cv::imread("C://NHMJDHNN78474-5_1-ASR1006X20240320-150822.BMP", -1);
|
||||
ho_in_Image = MatToHObject(mat);
|
||||
MatToHObjectV(mat, ho_in_Image);
|
||||
hv_in_Parameter.Append(3);
|
||||
hv_in_Parameter.Append(5);
|
||||
hv_in_Parameter.Append(1);
|
||||
hv_in_Parameter.Append(0.0135);
|
||||
hv_in_Parameter.Append(0.2);
|
||||
hv_in_Parameter.Append(2);
|
||||
//HANDLEAI
|
||||
int customIndex = 0;
|
||||
switch(customIndex)
|
||||
{
|
||||
case 0:
|
||||
pinHandleAiEvaluate(src(halconResult[0]), Paint(halconResult[0]),
|
||||
_handleAiModelManager->largeSeg, _handleAiModelManager->largeCls);
|
||||
break;
|
||||
case 1:
|
||||
pinHandleAiEvaluate(src(halconResult[0]), Paint(halconResult[0]),
|
||||
_handleAiModelManager->largeSeg, _handleAiModelManager->largeCls);
|
||||
break;
|
||||
case 2:
|
||||
pinHandleAiEvaluate(src(halconResult[0]), Paint(halconResult[0]),
|
||||
_handleAiModelManager->midSeg, _handleAiModelManager->midCls);
|
||||
break;
|
||||
case 3:
|
||||
pinHandleAiEvaluate(src(halconResult[0]), Paint(halconResult[0]),
|
||||
_handleAiModelManager->smallSeg, _handleAiModelManager->smallCls);
|
||||
break;
|
||||
}
|
||||
|
||||
hv_in_ShapePath = "./halconModel";
|
||||
|
||||
|
||||
Pings_Inspection(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X,
|
||||
&hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num,
|
||||
&hv_out_NG_Pings_Num, &hv_out_Flag_INS);
|
||||
|
||||
Pings_ROI(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_ROI_Value, &hv_out_Flag_ROI);
|
||||
std::vector<cv::Rect>Result;
|
||||
for (int i = 0; i < hv_out_ROI_Value.Length() / 4; i++)
|
||||
{
|
||||
Result.push_back(
|
||||
cv::Rect(
|
||||
hv_out_ROI_Value[i * 4 + 1].D(),
|
||||
hv_out_ROI_Value[i * 4].D(),
|
||||
hv_out_ROI_Value[i * 4 + 3].D() - hv_out_ROI_Value[i * 4 + 1].D(),
|
||||
hv_out_ROI_Value[i * 4 + 2].D() - hv_out_ROI_Value[i * 4].D()
|
||||
));
|
||||
}
|
||||
cv::Mat Paint;
|
||||
cvtColor(mat, Paint, cv::COLOR_GRAY2BGR);
|
||||
rectangle(Paint, Result[0], cv::Scalar(0, 0, 255), 4);
|
||||
rectangle(Paint, halconResult[0], cv::Scalar(0, 0, 255), 4);
|
||||
data->resultImgs.push_back(Paint);
|
||||
_sleep(100);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#include <algo/ALGO_Test.h>
|
||||
#include <algo/ALGO_Correction.h>
|
||||
#include <algo/ALGO_Inspection.h>
|
||||
#include <handleAi/handleAiModel.h>
|
||||
|
||||
bool processAlgo(std::shared_ptr <detData> data, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
try
|
||||
{
|
||||
switch (data->algoThreadIndex)
|
||||
{
|
||||
case -1:
|
||||
pinAioEvalute(data);
|
||||
break;
|
||||
case 0:
|
||||
ALGO_Correction(data);
|
||||
break;
|
||||
case 1:
|
||||
ALGO_Inspection(data, _handleAiModelManager);
|
||||
break;
|
||||
}
|
||||
qDebug() << "algo end";
|
||||
return true;
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cerr << "Caught exception: " << e.what() << std::endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#pragma once
|
||||
Binary file not shown.
@@ -34,7 +34,7 @@ public:
|
||||
while (this->isRunning() == true);
|
||||
}
|
||||
void getImgQueueSize();
|
||||
void Process(std::shared_ptr <detData> dataIn)
|
||||
void captureImage(std::shared_ptr <detData> dataIn)
|
||||
{
|
||||
requestQueue.enqueue(dataIn);
|
||||
}
|
||||
@@ -109,6 +109,13 @@ public:
|
||||
void init(backEndManager*);
|
||||
~cameraManager();
|
||||
std::unordered_map<std::string, camera*>cameras;//key 相机名
|
||||
camera* getCamera(std::string cameraName)
|
||||
{
|
||||
auto camera = cameras.find(cameraName);
|
||||
if (camera != cameras.end())
|
||||
return camera->second;
|
||||
return nullptr;
|
||||
}
|
||||
void run()
|
||||
{
|
||||
//while (1)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "logmsg.h"
|
||||
#include "logmsg.h"
|
||||
#include<QThread>
|
||||
key_sendMsg m_key_callback = NULL;
|
||||
|
||||
|
||||
@@ -2,12 +2,9 @@
|
||||
#include <FrontendBackendBridge.h>
|
||||
#include <sqlManager/sqlManager.h>
|
||||
#include <imgSaveThreadManager.h>
|
||||
#include <triggerManager.h>
|
||||
#include <algo/ALGO_MAIN.h>
|
||||
|
||||
#include <algo/ALGO_Test.h>
|
||||
#include <algo/ALGO_Correction.h>
|
||||
#include <algo/ALGO_Inspection.h>
|
||||
|
||||
using namespace std;
|
||||
void createDirectoryIfNotExists_2(const std::string& path) {
|
||||
// 检查路径是否存在
|
||||
if (!std::filesystem::exists(path)) {
|
||||
@@ -50,6 +47,8 @@ void threadManager::init(backEndManager* _backEndManagerIn)
|
||||
_backEndManager = _backEndManagerIn;
|
||||
sql = &_backEndManager->_sqlManager;
|
||||
_imgSaveThreadManager = _backEndManagerIn->_imgSaveThreadManager;
|
||||
_triggerManager = _backEndManagerIn->_triggerManager;
|
||||
_handleAiModelManager = _backEndManager->_handleAiModelManager;
|
||||
this->start();
|
||||
}
|
||||
void threadManager::process()
|
||||
@@ -67,7 +66,7 @@ void threadManager::process()
|
||||
std::shared_ptr<detData> ptr = *it;
|
||||
if (ptr->oriImgs.size() >= ptr->imgAmountMin)
|
||||
{
|
||||
algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, ALGO_Inspection, ptr)));
|
||||
algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, processAlgo, ptr,_handleAiModelManager)));
|
||||
processData.push_back(ptr);
|
||||
|
||||
it = waitImgData.erase(it);
|
||||
@@ -81,10 +80,12 @@ void threadManager::process()
|
||||
{
|
||||
std::shared_ptr<detData> ptr = *it;
|
||||
futrueIte = algoFutures.find(ptr->timeCode);
|
||||
if (futrueIte->second.wait_for(zeroSec)== std::future_status::ready)
|
||||
if (futrueIte->second.wait_for(zeroSec) == std::future_status::ready)
|
||||
{
|
||||
resultData.push_back(ptr);
|
||||
resultFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, &threadManager::resultHandle, this, ptr)));
|
||||
bool res= futrueIte->second.get();
|
||||
//resultData.push_back(ptr);
|
||||
//resultFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, &threadManager::resultHandle, this, ptr)));
|
||||
std::async(std::launch::async, &threadManager::resultHandle, this, ptr);
|
||||
|
||||
it = processData.erase(it);
|
||||
algoFutures.erase(futrueIte);
|
||||
@@ -94,19 +95,19 @@ void threadManager::process()
|
||||
}
|
||||
#pragma endregion
|
||||
#pragma region 等待结果并执行显示图片等操作
|
||||
for (auto it = resultData.begin(); it != resultData.end();)
|
||||
{
|
||||
std::shared_ptr<detData> ptr = *it;
|
||||
futrueIte = resultFutures.find(ptr->timeCode);
|
||||
if (futrueIte->second.wait_for(zeroSec) == std::future_status::ready)
|
||||
{
|
||||
//for (auto it = resultData.begin(); it != resultData.end();)
|
||||
//{
|
||||
// std::shared_ptr<detData> ptr = *it;
|
||||
// futrueIte = resultFutures.find(ptr->timeCode);
|
||||
// if (futrueIte->second.wait_for(zeroSec) == std::future_status::ready)
|
||||
// {
|
||||
|
||||
it = resultData.erase(it);
|
||||
resultFutures.erase(futrueIte);
|
||||
}
|
||||
else
|
||||
++it;
|
||||
}
|
||||
// it = resultData.erase(it);
|
||||
// resultFutures.erase(futrueIte);
|
||||
// }
|
||||
// else
|
||||
// ++it;
|
||||
//}
|
||||
#pragma endregion
|
||||
|
||||
}
|
||||
@@ -115,13 +116,16 @@ void threadManager::resultHandle(std::shared_ptr <detData> data)
|
||||
//储存结果图
|
||||
_imgSaveThreadManager->resSaveThread->imgDataQueue.append(data);
|
||||
//发送图片
|
||||
QPixmap pixmap;
|
||||
cvMatToQPixMap(data->resultImgs[0], pixmap);
|
||||
showImgPack* pack = new showImgPack();
|
||||
pack->img = pixmap;
|
||||
pack->type = imgWidgetRes;
|
||||
pack->index = data->oriShowIndex;
|
||||
emit _backEndManager->sendPixmapImageWidget(pack);
|
||||
if(data->resultImgs.size()>0)
|
||||
{
|
||||
QPixmap pixmap;
|
||||
cvMatToQPixMap(data->resultImgs[0], pixmap);
|
||||
showImgPack* pack = new showImgPack();
|
||||
pack->img = pixmap;
|
||||
pack->type = imgWidgetRes;
|
||||
pack->index = data->oriShowIndex;
|
||||
emit _backEndManager->sendPixmapImageWidget(pack);
|
||||
}
|
||||
|
||||
//SQL
|
||||
std::vector<sqlData> sqlDatas;
|
||||
@@ -129,6 +133,10 @@ void threadManager::resultHandle(std::shared_ptr <detData> data)
|
||||
sqlDatas.push_back({ sqlData.first, std::to_string(sqlData.second) });
|
||||
sql->addData(data->SNcode, sqlDatas);
|
||||
|
||||
//写入plc
|
||||
for (auto writeBackStr : data->writeBackData)
|
||||
_triggerManager->sendFinsMsg(writeBackStr);
|
||||
|
||||
//提交清理申请
|
||||
detDataManager* dManager = data->dManager;
|
||||
data->dManager->deleteDetData(data->timeCode);
|
||||
@@ -143,14 +151,9 @@ void threadManager::run()
|
||||
}
|
||||
void threadManager::addTask(std::shared_ptr <detData> data)
|
||||
{
|
||||
//{
|
||||
// CameraListCls::datastruct _struct = bridge.back.json.camera.getData(data->cameraKeyName);
|
||||
// data->oriShowIndex = _struct.showIndex;
|
||||
//}
|
||||
insertQueueMutex.lock();
|
||||
insertQueue.enqueue(data);
|
||||
insertQueueMutex.unlock();
|
||||
//this->start();
|
||||
}
|
||||
threadManager::~threadManager()
|
||||
{
|
||||
@@ -182,12 +185,12 @@ bool sncodeCls::clearSameSnRequestData()
|
||||
}
|
||||
return true;
|
||||
}
|
||||
void sncodeCls::checkSnFromWaittingVec(QByteArray byte)
|
||||
void sncodeCls::checkSnFromWaittingVec(QByteArray plcByte)
|
||||
{
|
||||
while (clearSameSnRequestData() == false);
|
||||
for (int i = 0; i < snWaittingVec.size(); i++)
|
||||
{//第一位是hash,第二位是index
|
||||
string SN = readSnFromQByteArray(byte, snWaittingVec[i].startpos, false, true, 0);
|
||||
std::string SN = readSnFromQByteArray(plcByte, snWaittingVec[i].startpos, false, true, 0);
|
||||
if (SN.compare(snErrorsnError))//不为空
|
||||
{
|
||||
snResList.push_back({ snWaittingVec[i].timecode,SN,snWaittingVec[i].startpos });
|
||||
@@ -199,28 +202,28 @@ void sncodeCls::checkSnFromWaittingVec(QByteArray byte)
|
||||
}
|
||||
|
||||
//FINSEDIT
|
||||
string sncodeCls::readSnFromQByteArray(QByteArray byte, int dmPos,
|
||||
std::string sncodeCls::readSnFromQByteArray(QByteArray plcByte, int dmPos,
|
||||
bool highLowConversion, bool clearAfterRead, long long timeCode, int Size)
|
||||
{
|
||||
int triggerPos = (dmPos - tcpStartPos) * 2;
|
||||
if (triggerPos < 0)
|
||||
{
|
||||
cout << "Read SN error,trigger is DM:" << dmPos << ",but read start at DM:" << tcpStartPos << endl;
|
||||
std::cout << "Read SN error,trigger is DM:" << dmPos << ",but read start at DM:" << tcpStartPos << endl;
|
||||
return snErrorsnError;
|
||||
}
|
||||
QString str;
|
||||
if (byte.at(triggerPos + 1) == 0 && byte.at(triggerPos) == 0)
|
||||
if (plcByte.at(triggerPos + 1) == 0 && plcByte.at(triggerPos) == 0)
|
||||
return snErrorsnError;
|
||||
int snCount = 0;
|
||||
while (byte.at(snCount + triggerPos) != 0 || byte.at(snCount + triggerPos + 1) != 0)
|
||||
while (plcByte.at(snCount + triggerPos) != 0 || plcByte.at(snCount + triggerPos + 1) != 0)
|
||||
{
|
||||
|
||||
if (byte.at(snCount + triggerPos) == 0)
|
||||
if (plcByte.at(snCount + triggerPos) == 0)
|
||||
{
|
||||
snCount++;
|
||||
continue;
|
||||
}
|
||||
str += QChar(byte.at(snCount + triggerPos));
|
||||
str += QChar(plcByte.at(snCount + triggerPos));
|
||||
snCount++;
|
||||
}
|
||||
if (highLowConversion == true)
|
||||
@@ -244,7 +247,7 @@ QString sncodeCls::snHex(QString sn)
|
||||
}
|
||||
return resultStr;
|
||||
}
|
||||
string sncodeCls::getData(unsigned long long timeCode)
|
||||
std::string sncodeCls::getData(unsigned long long timeCode)
|
||||
{
|
||||
for (int i = snResList.size() - 1; i >= 0; i--)
|
||||
{
|
||||
@@ -253,10 +256,10 @@ string sncodeCls::getData(unsigned long long timeCode)
|
||||
}
|
||||
return snErrorsnError;
|
||||
}
|
||||
string sncodeCls::waitForSn(unsigned long long timeCode, int timeOut)
|
||||
std::string sncodeCls::waitForSn(unsigned long long timeCode, int timeOut)
|
||||
{
|
||||
int cnt = 0;
|
||||
string sn = getData(timeCode);
|
||||
std::string sn = getData(timeCode);
|
||||
if (!sn.compare(snErrorsnError))
|
||||
{
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@ class threadManager;
|
||||
class algoThread;
|
||||
class subThread;
|
||||
class detDataManager;
|
||||
//class detData;
|
||||
class triggerManager;
|
||||
|
||||
class backEndManager;
|
||||
class detData
|
||||
{
|
||||
@@ -37,6 +38,7 @@ public:
|
||||
double camera1Width = 0, camera1Height = 0;
|
||||
int cameraIndex = -1; //是第几次拍照
|
||||
int imgAmountMin = 1;
|
||||
int algoThreadIndex = -1;
|
||||
|
||||
std::vector<std::pair<std::string, double>> sqlVec;
|
||||
|
||||
@@ -79,22 +81,7 @@ public:
|
||||
//algoThreadIndex = _struct.threadIndex;
|
||||
//resShowIndex = _struct.showIndex;
|
||||
}
|
||||
static std::shared_ptr <detData> CreateDetData(QString IN_cameraKeyName, QString IN_algoThreadName,
|
||||
std::string IN_SN, int IN_oriShowIndex)
|
||||
{
|
||||
std::shared_ptr <detData> data(new detData(IN_cameraKeyName, IN_algoThreadName, IN_SN, IN_oriShowIndex));
|
||||
return data;
|
||||
}
|
||||
|
||||
detData(QString IN_cameraKeyName, QString IN_algoThreadName,
|
||||
std::string IN_SN, int IN_oriShowIndex)
|
||||
{
|
||||
cameraKeyName = IN_cameraKeyName;
|
||||
algoThreadName = IN_algoThreadName;
|
||||
oriShowIndex = IN_oriShowIndex;
|
||||
SNcode = IN_SN;
|
||||
//imgMutex = new QMutex();
|
||||
}
|
||||
~detData()
|
||||
{
|
||||
for (auto img : oriImgs)
|
||||
@@ -107,35 +94,40 @@ class detDataManager
|
||||
{
|
||||
public:
|
||||
std::unordered_map<unsigned long long, std::shared_ptr<detData>>map;
|
||||
|
||||
//QLinkedList<detData> detDatas;
|
||||
QMutex dataMutex;
|
||||
//std::shared_ptr <detData> insertDetData(QString IN_cameraKeyName, QString IN_algoThreadName,
|
||||
// std::string IN_SN, int IN_oriShowIndex)
|
||||
//{
|
||||
// dataMutex.lock();
|
||||
// std::shared_ptr <detData> data = new detData(IN_cameraKeyName, IN_algoThreadName, IN_SN, IN_oriShowIndex);
|
||||
// data->dManager = this;
|
||||
// //detDatas.push_back(data);
|
||||
// map.insert({ data->timeCode,data });
|
||||
// dataMutex.unlock();
|
||||
// std::shared_ptr <detData> dataPtr = getDetData(data->timeCode);
|
||||
//
|
||||
// if (dataPtr == nullptr)
|
||||
// qDebug() << "创建新容器失败";
|
||||
// return dataPtr;
|
||||
//}
|
||||
std::shared_ptr <detData> insertDetData(QString IN_cameraKeyName, QString IN_algoThreadName,
|
||||
|
||||
/* std::shared_ptr <detData> insertDetData(QString IN_cameraKeyName, QString IN_algoThreadName,
|
||||
std::string IN_SN, int IN_oriShowIndex)
|
||||
{
|
||||
dataMutex.lock();
|
||||
std::shared_ptr <detData>data(new detData(IN_cameraKeyName, IN_algoThreadName, IN_SN, IN_oriShowIndex));
|
||||
data->dManager = this;
|
||||
//detDatas.push_back(data);
|
||||
map.insert({ data->timeCode,data });
|
||||
dataMutex.unlock();
|
||||
std::shared_ptr <detData> dataPtr = getDetData(data->timeCode);
|
||||
|
||||
if (dataPtr == nullptr)
|
||||
qDebug() << "创建新容器失败";
|
||||
return dataPtr;
|
||||
}*/
|
||||
std::shared_ptr <detData> insertDetData(
|
||||
QString IN_cameraKeyName,
|
||||
std::string IN_SN,
|
||||
int IN_oriShowIndex,
|
||||
int IN_algoThreadIndex)
|
||||
{
|
||||
dataMutex.lock();
|
||||
std::shared_ptr <detData>dataPtr(new detData());
|
||||
|
||||
dataPtr->cameraKeyName = IN_cameraKeyName;
|
||||
dataPtr->SNcode = IN_SN;
|
||||
dataPtr->oriShowIndex = IN_oriShowIndex;
|
||||
dataPtr->algoThreadIndex = IN_algoThreadIndex;
|
||||
|
||||
dataPtr->dManager = this;
|
||||
map.insert({ dataPtr->timeCode,dataPtr });
|
||||
dataMutex.unlock();
|
||||
|
||||
if (dataPtr == nullptr)
|
||||
qDebug() << "创建新容器失败";
|
||||
return dataPtr;
|
||||
@@ -201,6 +193,9 @@ public:
|
||||
|
||||
sqlManager* sql;
|
||||
imgSaveThreadManager* _imgSaveThreadManager;
|
||||
triggerManager* _triggerManager;
|
||||
handleAiModelManager* _handleAiModelManager;
|
||||
|
||||
QQueue<std::shared_ptr <detData>> detDataQueue;
|
||||
autoDelete* autoDeleteThread;
|
||||
void init(backEndManager* _backEndManagerIn);
|
||||
@@ -227,11 +222,11 @@ private:
|
||||
std::list<std::shared_ptr <detData>> processData;//处理中
|
||||
std::list<std::shared_ptr <detData>> resultData;//等待结果
|
||||
|
||||
std::unordered_map<unsigned long long, std::future<void>> algoFutures;
|
||||
std::unordered_map<unsigned long long, std::future<bool>> algoFutures;
|
||||
std::unordered_map<unsigned long long, std::future<void>> resultFutures;
|
||||
|
||||
std::chrono::seconds zeroSec = std::chrono::seconds(0);
|
||||
std::unordered_map<unsigned long long, std::future<void>>::iterator futrueIte;
|
||||
std::unordered_map<unsigned long long, std::future<bool>>::iterator futrueIte;
|
||||
|
||||
bool runFlag = true;
|
||||
QList<std::shared_ptr <detData>>imgWaitList;
|
||||
|
||||
@@ -11,21 +11,22 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
|
||||
#if debugTesting
|
||||
//if (checkTrigger(1, 2, byte) == true)
|
||||
{
|
||||
std::shared_ptr <detData> data = dManager->insertDetData("Camera1", "Thread3", "TEST", 0);
|
||||
data->correctionData = correctionData;
|
||||
_threadManager->addTask(data);//添加任务
|
||||
auto camera = _cameraManager->cameras.find("123");
|
||||
if(camera != _cameraManager->cameras.end())
|
||||
camera->second->Process(data);
|
||||
//std::shared_ptr <detData> data = dManager->insertDetData("Camera1" , "TEST", 0 , 0);
|
||||
//data->correctionData = correctionData;
|
||||
//_threadManager->addTask(data);//添加任务
|
||||
//auto camera = _cameraManager->getCamera("123");
|
||||
//if(camera != nullptr)
|
||||
// camera->captureImage(data);
|
||||
}
|
||||
//if (checkTrigger(2, 2, byte) == true)
|
||||
{
|
||||
std::shared_ptr <detData> data = dManager->insertDetData("Camera1", "Thread2", "TEST", 1);
|
||||
std::shared_ptr <detData> data = dManager->insertDetData("Camera1", "TEST", 1, 1);
|
||||
data->correctionData = correctionData;
|
||||
data->oriImgs.push_back(cv::imread("C://Users//RCi//Downloads//20240526-202606.bmp",-1));
|
||||
_threadManager->addTask(data);//添加任务
|
||||
//auto camera = _cameraManager->cameras.find("456");
|
||||
//if (camera != _cameraManager->cameras.end())
|
||||
// camera->second->Process(data);
|
||||
//auto camera = _cameraManager->getCamera("123");
|
||||
//if (camera != nullptr)
|
||||
// camera->captureImage(data);
|
||||
}
|
||||
return;
|
||||
#endif
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <globalStruct.h>
|
||||
#include <backStruct.h>
|
||||
|
||||
using namespace std;
|
||||
class backEndManager;
|
||||
class cameraManager;
|
||||
class jsonConfiguration;
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <future>
|
||||
#include <qobject.h>
|
||||
#include <backEndManager.h>
|
||||
|
||||
#if 0
|
||||
class handleAiModelBase
|
||||
{
|
||||
public:
|
||||
@@ -120,4 +122,47 @@ private:
|
||||
std::vector<std::mutex*>gpuMutex;
|
||||
int gpuCnt = 1;//gpu数量
|
||||
};
|
||||
#endif
|
||||
class handleAiModelManager :public QObject
|
||||
{
|
||||
public:
|
||||
handdleAI::pSegmentation* largeSeg;
|
||||
handdleAI::pClassification* largeCls;
|
||||
|
||||
handdleAI::pSegmentation* midSeg;
|
||||
handdleAI::pClassification* midCls;
|
||||
|
||||
handdleAI::pSegmentation* smallSeg;
|
||||
handdleAI::pClassification* smallCls;
|
||||
|
||||
////////模型放这里///////
|
||||
handleAiModelManager()
|
||||
{
|
||||
|
||||
}
|
||||
///////////END/////////
|
||||
|
||||
void init(backEndManager* _backEndManagerIn)
|
||||
{
|
||||
return;
|
||||
largeSeg = handdleAI::CreateSegObj("./HandleAiModels/large-seg.BHD", 0);
|
||||
midSeg = handdleAI::CreateSegObj("./HandleAiModels/mid-seg.BHD", 0);
|
||||
smallSeg = handdleAI::CreateSegObj("./HandleAiModels/small-seg.BHD", 0);
|
||||
|
||||
largeCls = handdleAI::CreateClsObjVT("./HandleAiModels/large-cls.BHD", 0);
|
||||
midCls = handdleAI::CreateClsObjVT("./HandleAiModels/mid-cls.BHD", 0);
|
||||
smallCls = handdleAI::CreateClsObjVT("./HandleAiModels/small_cls.BHD", 0);
|
||||
}
|
||||
~handleAiModelManager()
|
||||
{
|
||||
handdleAI::DestroySegObj(largeSeg);
|
||||
handdleAI::DestroySegObj(midSeg);
|
||||
handdleAI::DestroySegObj(smallSeg);
|
||||
|
||||
handdleAI::DestroyClsObj(largeCls);
|
||||
handdleAI::DestroyClsObj(midCls);
|
||||
handdleAI::DestroyClsObj(smallCls);
|
||||
}
|
||||
|
||||
};
|
||||
#pragma once
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user