|
|
|
|
@ -678,7 +678,7 @@ int ImgCheckAnalysisy::CheckRun()
|
|
|
|
|
{
|
|
|
|
|
m_pImageAllResult->detImg = image(m_CutRoi).clone();
|
|
|
|
|
}
|
|
|
|
|
// 多线程开启 AI 推理检测
|
|
|
|
|
// 多线程开启 传统/AI 推理检测
|
|
|
|
|
long time_AI_s = CheckUtil::getcurTime();
|
|
|
|
|
m_AItask = std::make_shared<TaskInfo>();
|
|
|
|
|
m_AItask->taskname = Task_AI;
|
|
|
|
|
@ -1294,6 +1294,40 @@ int ImgCheckAnalysisy::AIMaskDet()
|
|
|
|
|
m_ImgBlobHFlagData = new unsigned char[m_pImageAllResult->detImg.rows];
|
|
|
|
|
memset(m_ImgBlobHFlagData, 0, sizeof(unsigned char) * m_pImageAllResult->detImg.rows);
|
|
|
|
|
|
|
|
|
|
// 传统检测路径:等待异步任务完成后,计算HFlag
|
|
|
|
|
if(m_pBasicConfig->bTraditionalDetect)
|
|
|
|
|
{
|
|
|
|
|
m_AItask->waitComplate();
|
|
|
|
|
int rec = m_AItask->nresult;
|
|
|
|
|
if (rec != CHECK_OK)
|
|
|
|
|
{
|
|
|
|
|
return rec;
|
|
|
|
|
}
|
|
|
|
|
if (!m_pImageAllResult->AIMaskImg.empty())
|
|
|
|
|
{
|
|
|
|
|
unsigned char *pGrayErrordata = (unsigned char *)m_pImageAllResult->AIMaskImg.data;
|
|
|
|
|
int width = m_pImageAllResult->AIMaskImg.cols;
|
|
|
|
|
int height = m_pImageAllResult->AIMaskImg.rows;
|
|
|
|
|
for (int y = 0; y < height; y++)
|
|
|
|
|
{
|
|
|
|
|
if (m_ImgBlobHFlagData[y] == 0)
|
|
|
|
|
{
|
|
|
|
|
unsigned char *p = pGrayErrordata + y * width;
|
|
|
|
|
for (int x = 0; x < width; x++)
|
|
|
|
|
{
|
|
|
|
|
if (p[x] != 0)
|
|
|
|
|
{
|
|
|
|
|
m_ImgBlobHFlagData[y] = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_CheckResult_shareP->resultMaskImg = m_pImageAllResult->AIMaskImg;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
|
|
@ -1577,6 +1611,25 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ======================== 传统检测 ========================
|
|
|
|
|
int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
|
{
|
|
|
|
|
std::string strBaseLog = "Traditional_Detect";
|
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "Traditional_Detect Start (placeholder)");
|
|
|
|
|
|
|
|
|
|
// 输出与AI推理相同格式的二值mask图 (CV_8UC1)
|
|
|
|
|
ResultImg = cv::Mat::zeros(img.size(), CV_8UC1);
|
|
|
|
|
|
|
|
|
|
// ===== TODO: 在此处调用传统检测算法库 =====
|
|
|
|
|
// 示例:cv::threshold(img, ResultImg, 128, 255, cv::THRESH_BINARY);
|
|
|
|
|
// 输入: img (单通道灰度图, CV_8UC1)
|
|
|
|
|
// 输出: ResultImg (二值mask, CV_8UC1, 0/255)
|
|
|
|
|
// ==========================================
|
|
|
|
|
|
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "Traditional_Detect End (placeholder)");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ImgCheckAnalysisy::AI_QX_Class_Thread()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
@ -1742,6 +1795,35 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ======================== 传统分类 ========================
|
|
|
|
|
int ImgCheckAnalysisy::Traditional_QX_Class_Thread()
|
|
|
|
|
{
|
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_3, "Traditional_Class", " Start (placeholder)");
|
|
|
|
|
|
|
|
|
|
int totalTasks = blobs.blobCount;
|
|
|
|
|
for (int i = 0; i < totalTasks; i++)
|
|
|
|
|
{
|
|
|
|
|
ERROR_DOTS_BLOB_DATA *pblob = &blobs.blobTab[i];
|
|
|
|
|
|
|
|
|
|
if (pblob->ErrType == ERR_TYPE_2)
|
|
|
|
|
{
|
|
|
|
|
pblob->AIclasstype = CONFIG_QX_NAME_cell_ymhs;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// ===== TODO: 在此处调用传统分类算法库 =====
|
|
|
|
|
// 输入: pblob->minx/maxy/miny/maxy 定位的blob区域
|
|
|
|
|
// m_pImageAllResult->detImg 原始检测图
|
|
|
|
|
// 输出: pblob->AIclasstype (CONFIG_QX_NAME_cell_xxx)
|
|
|
|
|
// ==========================================
|
|
|
|
|
pblob->AIclasstype = CONFIG_QX_NAME_cell_other;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_3, "Traditional_Class", " End (placeholder), classified %d blobs", totalTasks);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ImgCheckAnalysisy::ThreadTask(int nId)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
@ -1791,11 +1873,19 @@ void ImgCheckAnalysisy::TaskFun_AIDet(std::shared_ptr<TaskInfo> task)
|
|
|
|
|
{
|
|
|
|
|
task->SetStatus(TaskStep_run);
|
|
|
|
|
long t1, t2;
|
|
|
|
|
// AI 推理生成
|
|
|
|
|
// 检测:传统检测 / AI推理
|
|
|
|
|
{
|
|
|
|
|
t1 = CheckUtil::getcurTime();
|
|
|
|
|
|
|
|
|
|
int rec = AI_Detect_Thread(m_pImageAllResult->detImg, m_pImageAllResult->AIMaskImg);
|
|
|
|
|
int rec;
|
|
|
|
|
if(m_pBasicConfig->bTraditionalDetect)
|
|
|
|
|
{
|
|
|
|
|
rec = Traditional_Detect_Thread(m_pImageAllResult->detImg, m_pImageAllResult->AIMaskImg);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
rec = AI_Detect_Thread(m_pImageAllResult->detImg, m_pImageAllResult->AIMaskImg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
t2 = CheckUtil::getcurTime();
|
|
|
|
|
task->nresult = rec;
|
|
|
|
|
@ -1807,11 +1897,19 @@ void ImgCheckAnalysisy::TaskFun_QxClass(std::shared_ptr<TaskInfo> task)
|
|
|
|
|
{
|
|
|
|
|
task->SetStatus(TaskStep_run);
|
|
|
|
|
long t1, t2;
|
|
|
|
|
// AI 推理生成
|
|
|
|
|
// 缺陷分类:传统检测 / AI推理
|
|
|
|
|
{
|
|
|
|
|
t1 = CheckUtil::getcurTime();
|
|
|
|
|
|
|
|
|
|
int rec = AI_QX_Class_Thread();
|
|
|
|
|
int rec;
|
|
|
|
|
if(m_pBasicConfig->bTraditionalDetect)
|
|
|
|
|
{
|
|
|
|
|
rec = Traditional_QX_Class_Thread();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
rec = AI_QX_Class_Thread();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
t2 = CheckUtil::getcurTime();
|
|
|
|
|
task->nresult = rec;
|
|
|
|
|
|