Compare commits

..

No commits in common. 'c7b20f2c754011cdf9803b1c2c75c2b7f1298172' and 'df101943fe92b16699aab9e0cb627ca08e97f3b5' have entirely different histories.

@ -14,24 +14,24 @@ enum AI_CLass_QX_NAME_
{ {
AI_CLass_QX_NAME_PIN_PoSun, // PIN破损 AI_CLass_QX_NAME_PIN_PoSun, // PIN破损
AI_CLass_QX_NAME_PIN_QueShi, // PIN缺失
AI_CLass_QX_NAME_BTB_DuanLie, // BTB断裂 AI_CLass_QX_NAME_BTB_DuanLie, // BTB断裂
AI_CLass_QX_NAME_LianXi, // 连锡 AI_CLass_QX_NAME_LianXi, // 连锡
AI_CLass_QX_NAME_QueXi, // 缺锡 AI_CLass_QX_NAME_QueXi, // 缺锡
AI_CLass_QX_NAME_YiWu, // 异物 AI_CLass_QX_NAME_YiWu, // 异物
AI_CLass_QX_NAME_C_BianXing, // C型卡口异常 AI_CLass_QX_NAME_C_BianXing, // C型卡口异常
AI_CLass_QX_NAME_Panel, // Panel
AI_CLass_QX_NAME_count, AI_CLass_QX_NAME_count,
}; };
// 缺陷项对应在参数中的名称 // 缺陷项对应在参数中的名称
static const std::string AI_CLass_QX_NAME_Names[] = static const std::string AI_CLass_QX_NAME_Names[] =
{ {
"PIN_PoSun", "PIN_PoSun",
"PIN_QueShi",
"BTB_DuanLie", "BTB_DuanLie",
"LianXi", "LianXi",
"QueXi", "QueXi",
"YiWu", "YiWu",
"C_BianXing", "C_BianXing",
"Panel",
}; };
#endif #endif

@ -94,7 +94,6 @@ public:
{ {
int ncamId; // 相机ID int ncamId; // 相机ID
BaseCheckFunction *pBaseCheckFunction; BaseCheckFunction *pBaseCheckFunction;
std::string strProductID; // 产品ID(存图文件名用)
std::string strChannel; // 通道 std::string strChannel; // 通道
int nthresholdvalue; // 背景阈值 int nthresholdvalue; // 背景阈值
int nAIErodesize; // 边缘腐蚀强度 int nAIErodesize; // 边缘腐蚀强度
@ -117,7 +116,6 @@ public:
saveProcessImg = Save_Close; saveProcessImg = Save_Close;
bUseDrawRoi_Check = false; bUseDrawRoi_Check = false;
drawRoi = cv::Rect(0, 0, 0, 0); drawRoi = cv::Rect(0, 0, 0, 0);
strProductID = "";
if (!drawMask.empty()) if (!drawMask.empty())
{ {
drawMask.release(); drawMask.release();

@ -286,7 +286,8 @@ private:
std::vector<cv::Rect> SmallRoiList; std::vector<cv::Rect> SmallRoiList;
std::string m_strRootPath_KK_cls; std::string m_strRootPath_TA_cls;
std::string m_strRootPath_CA_cls;
std::string m_strSavePath_cls; std::string m_strSavePath_cls;
std::string m_strLastDate; std::string m_strLastDate;

@ -59,7 +59,6 @@ public:
BaseCheckFunction *pBaseCheckFunction; BaseCheckFunction *pBaseCheckFunction;
std::string strChannel; std::string strChannel;
std::string strProductID; // 产品ID(存图文件名用)
bool bSaveResultImg; bool bSaveResultImg;
DetConfigResult() DetConfigResult()
{ {
@ -69,7 +68,6 @@ public:
{ {
pBaseCheckFunction = NULL; pBaseCheckFunction = NULL;
strChannel = ""; strChannel = "";
strProductID = "";
bSaveResultImg = false; bSaveResultImg = false;
} }
}; };
@ -82,7 +80,6 @@ public:
private: private:
int InitModel_Pin(); int InitModel_Pin();
int creatsavedir();
private: private:
bool m_bInitSucc; // 是否初始化成功 bool m_bInitSucc; // 是否初始化成功
@ -92,12 +89,6 @@ private:
bool m_bshowimg; bool m_bshowimg;
cv::Mat showimg; cv::Mat showimg;
std::string m_strRootPath_Pin;
std::string m_strSavePath_Pin;
std::string m_strLastDate;
ImageStorage *m_pImageStorage;
std::shared_ptr<AIFactory> AI_Factory; std::shared_ptr<AIFactory> AI_Factory;
private: private:

@ -183,8 +183,8 @@ AI_Edge_Algin::AI_Edge_Algin(std::shared_ptr<DetLog> &log_ref)
m_bModelSucc = false; m_bModelSucc = false;
m_bModel_Mark_Succ = false; m_bModel_Mark_Succ = false;
m_bshowimg = false; m_bshowimg = false;
m_strRootPath_Big = "/home/aidlux/BOE/Algin/KK/"; m_strRootPath_Big = "/home/aidlux/BOE/Algin/";
m_strRootPath_Mark = "/home/aidlux/BOE/MarkLine/KK/"; m_strRootPath_Mark = "/home/aidlux/BOE/MarkLine/";
creatsavedir(); creatsavedir();
std::string m_strSavePath; std::string m_strSavePath;
@ -364,12 +364,6 @@ int AI_Edge_Algin::Get_Edge(int AIModel_type, const cv::Mat &img, DetConfig *pDe
cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl; cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl;
cv::resize(img, detImg, sz); cv::resize(img, detImg, sz);
// 存图用: 通道转换(灰度化)之前的模型输入图(未开启存图时不克隆, 节省时间/内存)
cv::Mat saveInImg;
if (pDetConfig->pBaseCheckFunction->saveImg.bSaveAlginImg)
{
saveInImg = detImg.clone();
}
int re = 0; int re = 0;
cv::Mat mask; cv::Mat mask;
// 模型输入要求单通道;原图为彩色时按 BGR 顺序转灰度(与 imread(path,0) 的亮度一致) // 模型输入要求单通道;原图为彩色时按 BGR 顺序转灰度(与 imread(path,0) 的亮度一致)
@ -393,12 +387,19 @@ int AI_Edge_Algin::Get_Edge(int AIModel_type, const cv::Mat &img, DetConfig *pDe
if (pDetConfig->pBaseCheckFunction->saveImg.bSaveAlginImg) if (pDetConfig->pBaseCheckFunction->saveImg.bSaveAlginImg)
{ {
creatsavedir(); creatsavedir();
std::string str = m_strSavePath_Big + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_" + std::to_string(AIModel_type) + "_Img.png"; static int sdk = 0;
int sr = m_pImageStorage->addImage(str, saveInImg); std::string str = m_strSavePath_Big + std::to_string(sdk) + "_" + pDetConfig->strChannel + "_Img.png";
int sr = m_pImageStorage->addImage(str, detImg);
if (sr == 0) if (sr == 0)
{ {
str = m_strSavePath_Big + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_" + std::to_string(AIModel_type) + "_Img_mask.png"; str = m_strSavePath_Big + std::to_string(sdk) + "_" + pDetConfig->strChannel + "_Img_mask.png";
m_pImageStorage->addImage(str, mask, true); int sr = m_pImageStorage->addImage(str, mask, true);
sdk++;
if (sdk > 99999)
{
sdk = 0;
/* code */
}
} }
} }

@ -797,9 +797,32 @@ int ImageResultJudge::DrawResult(std::shared_ptr<ImageAllResult> pImageResult)
draw_str->txtP = cv::Point(draw_qx->cp.x + r, draw_qx->cp.y - r); draw_str->txtP = cv::Point(draw_qx->cp.x + r, draw_qx->cp.y - r);
draw_str->txtsize = 0.5; draw_str->txtsize = 0.5;
draw_str->txtbackgroundk = txtbackgroundk; draw_str->txtbackgroundk = txtbackgroundk;
cv::Rect srcroi = pqx->srcImgroi;
cv::Point srccp = cv::Point(srcroi.x + srcroi.width * .5, srcroi.y + srcroi.height * 0.5);
char buffer[128];
{
std::string text = std::to_string(pqx->idx) + ":" + pqx->strTypeName;
draw_str->strlist.push_back(text);
}
{
sprintf(buffer, " center:%d %d", srccp.x, srccp.y);
std::string text = buffer;
draw_str->strlist.push_back(text);
}
{
sprintf(buffer, " len %0.2f A: %0.2f ", pqx->len, pqx->area);
std::string text = buffer;
draw_str->strlist.push_back(text);
}
{
sprintf(buffer, " breadth %0.2f A: %0.2f ", pqx->breadth, pqx->area);
std::string text = buffer;
draw_str->strlist.push_back(text);
}
{ {
// 只绘制 id:缺陷code (缺陷名可能中文乱码, 用code替代) sprintf(buffer, " E:%0.2f hj %0.2f", pqx->energy, pqx->hj);
std::string text = std::to_string(pqx->idx) + ":" + pqx->qx_Code; std::string text = buffer;
draw_str->strlist.push_back(text); draw_str->strlist.push_back(text);
} }
sendTask(draw_str); sendTask(draw_str);

@ -40,7 +40,8 @@ ImgCheckAnalysisy::ImgCheckAnalysisy()
m_pbaseCheckFunction = &m_AnalysisyConfig.baseFunction; m_pbaseCheckFunction = &m_AnalysisyConfig.baseFunction;
m_strLastDate = ""; m_strLastDate = "";
m_strRootPath_KK_cls = "/home/aidlux/BOE/Cls/KK/"; m_strRootPath_TA_cls = "/home/aidlux/BOE/Cls/TA/";
m_strRootPath_CA_cls = "/home/aidlux/BOE/Cls/CA/";
creatsavedir(); creatsavedir();
m_pImageStorage = ImageStorage::getInstance(); m_pImageStorage = ImageStorage::getInstance();
m_nConfigIdx = -1; m_nConfigIdx = -1;
@ -201,10 +202,12 @@ int ImgCheckAnalysisy::creatsavedir()
return 0; return 0;
} }
m_strLastDate = curDate; m_strLastDate = curDate;
m_strRootPath_KK_cls += m_strLastDate + "/"; m_strRootPath_TA_cls += m_strLastDate + "/";
m_strRootPath_CA_cls += m_strLastDate + "/";
for (int i = 0; i < AI_CLass_QX_NAME_count; i++) for (int i = 0; i < AI_CLass_QX_NAME_count; i++)
{ {
CheckUtil::CreateDir(m_strRootPath_KK_cls + std::to_string(i) + "/"); CheckUtil::CreateDir(m_strRootPath_TA_cls + std::to_string(i) + "/");
CheckUtil::CreateDir(m_strRootPath_CA_cls + std::to_string(i) + "/");
} }
return 0; return 0;
} }
@ -1383,8 +1386,7 @@ int ImgCheckAnalysisy::ConfigCheck(cv::Mat img)
int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
{ {
// 依次使用多个检测模型,各模型输出 mask 取并集作为最终 outmask; // 依次使用多个检测模型,各模型输出 mask 取并集作为最终 outmask
// Defect_QueXi 模型是否参与合并由基础参数 Merge_QueXi 开关控制
std::vector<std::shared_ptr<AIModel_Base>> pAIDetList; std::vector<std::shared_ptr<AIModel_Base>> pAIDetList;
pAIDetList.push_back(AI_Factory->Defect); pAIDetList.push_back(AI_Factory->Defect);
pAIDetList.push_back(AI_Factory->Defect_QueXi); pAIDetList.push_back(AI_Factory->Defect_QueXi);
@ -1394,9 +1396,6 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
pAIDetNameList.push_back(AI_DET_MODEL_NAME_Defect); pAIDetNameList.push_back(AI_DET_MODEL_NAME_Defect);
pAIDetNameList.push_back(AI_DET_MODEL_NAME_QueXi); pAIDetNameList.push_back(AI_DET_MODEL_NAME_QueXi);
// Defect_QueXi 模型是否参与最终结果并集(开关关闭时: 模型照常推理, 但结果不合并到 ResultImg)
bool bMerge_QueXi = (m_pbaseCheckFunction != NULL) && m_pbaseCheckFunction->Merge_QueXi.bOpen;
std::string strBaseLog = "AI_Detect"; std::string strBaseLog = "AI_Detect";
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "AI_Detect Start"); m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "AI_Detect Start");
@ -1435,9 +1434,6 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
std::shared_ptr<AIModel_Base> pAIDet = pAIDetList[m]; std::shared_ptr<AIModel_Base> pAIDet = pAIDetList[m];
std::string strModelName = (m < pAIDetNameList.size()) ? pAIDetNameList[m] : std::string(AI_DET_MODEL_NAME_UnKnown); std::string strModelName = (m < pAIDetNameList.size()) ? pAIDetNameList[m] : std::string(AI_DET_MODEL_NAME_UnKnown);
// 当前模型的 mask 是否合并进最终结果: Defect 模型始终合并; Defect_QueXi 由 Merge_QueXi 开关控制
bool bMergeModel = (strModelName != AI_DET_MODEL_NAME_QueXi) || bMerge_QueXi;
int deal_image_width = pAIDet->input_0.width; int deal_image_width = pAIDet->input_0.width;
int deal_image_height = pAIDet->input_0.height; int deal_image_height = pAIDet->input_0.height;
if (deal_image_width <= 0 || deal_image_height <= 0) if (deal_image_width <= 0 || deal_image_height <= 0)
@ -1490,29 +1486,19 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
{ {
cv::resize(modelMask, modelMaskFull, img.size(), 0, 0, cv::INTER_NEAREST); cv::resize(modelMask, modelMaskFull, img.size(), 0, 0, cv::INTER_NEAREST);
if (bMergeModel)
{
// 多个模型的 mask 取并集 // 多个模型的 mask 取并集
cv::bitwise_or(ResultImg, modelMaskFull, ResultImg); cv::bitwise_or(ResultImg, modelMaskFull, ResultImg);
// 当前模型自己的 mask 单独记录一份(只记录参与并集的模型, 保证残点来源追溯与结果一致) // 当前模型自己的 mask 单独记录一份
cv::bitwise_or(modelMaskList[m], modelMaskFull, modelMaskList[m]); cv::bitwise_or(modelMaskList[m], modelMaskFull, modelMaskList[m]);
} }
else
{
// Merge_QueXi 开关关闭: 不合并、不推加速队列、不记录残点来源
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog,
" %s Merge_QueXi off, mask not merged (pixel num %d)",
strModelName.c_str(), cv::countNonZero(modelMaskFull));
}
}
// AI 检测残点图存图:每个模型的结果都存,并增加一级 模型名称 目录, // AI 检测残点图存图:每个模型的结果都存,并增加一级 模型名称 目录,
// 用以区分该残点是由哪个模型检出的 // 用以区分该残点是由哪个模型检出的
// 目录结构:/home/aidlux/BOE/ZB_SOCKET/AI_Detect/<模型名称>/<产品ID>/ // 目录结构:/home/aidlux/BOE/ZB_SOCKET/AI_Detect/<模型名称>/<产品ID>/
if (m_pbaseCheckFunction->saveImg.bSaveAIDetImg && !modelMaskFull.empty()) if (m_pbaseCheckFunction->saveImg.bSaveAIDetImg && !modelMaskFull.empty())
{ {
std::string strSaveDir = "/home/aidlux/BOE/AI_Detect/KK/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/"; std::string strSaveDir = "/home/aidlux/BOE/ZB_SOCKET/AI_Detect/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/";
CheckUtil::CreateDir(strSaveDir); CheckUtil::CreateDir(strSaveDir);
std::string strSavePath_in = strSaveDir + m_strCurDetChannel + "_in.png"; std::string strSavePath_in = strSaveDir + m_strCurDetChannel + "_in.png";
std::string strSavePath_out = strSaveDir + m_strCurDetChannel + "_out.png"; std::string strSavePath_out = strSaveDir + m_strCurDetChannel + "_out.png";
@ -1521,8 +1507,7 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
} }
// 4、mask 结果放入队列,用于 AIMaskDet 加速 blob 计算(整图 ROI) // 4、mask 结果放入队列,用于 AIMaskDet 加速 blob 计算(整图 ROI)
// 只推入参与并集的 mask, 保证行标志与最终结果 mask 一致 if (!modelMaskFull.empty())
if (bMergeModel && !modelMaskFull.empty())
{ {
std::shared_ptr<AIMulThreadRunBase::AITask> maskTask = std::make_shared<AIMulThreadRunBase::AITask>(); std::shared_ptr<AIMulThreadRunBase::AITask> maskTask = std::make_shared<AIMulThreadRunBase::AITask>();
maskTask->id = static_cast<int>(m); maskTask->id = static_cast<int>(m);
@ -1663,31 +1648,31 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
break; break;
case 1: case 1:
cls_num = AI_CLass_QX_NAME_PIN_QueShi; cls_num = AI_CLass_QX_NAME_BTB_DuanLie;
break; break;
case 2: case 2:
cls_num = AI_CLass_QX_NAME_BTB_DuanLie; cls_num = AI_CLass_QX_NAME_LianXi;
break; break;
case 3: case 3:
cls_num = AI_CLass_QX_NAME_LianXi; cls_num = AI_CLass_QX_NAME_QueXi;
break; break;
case 4: case 4:
cls_num = AI_CLass_QX_NAME_QueXi; cls_num = AI_CLass_QX_NAME_YiWu;
break; break;
case 5: case 5:
cls_num = AI_CLass_QX_NAME_YiWu; cls_num = AI_CLass_QX_NAME_C_BianXing;
break; break;
case 6: case 6:
cls_num = AI_CLass_QX_NAME_C_BianXing; cls_num = AI_CLass_QX_NAME_Panel;
break; break;
default: default:
cls_num = AI_CLass_QX_NAME_count; // 无效类别, 不参与缺陷分析 cls_num = AI_CLass_QX_NAME_Panel;
break; break;
} }
@ -1695,13 +1680,18 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
// printf("AI Class num %d = %s %f\n", cls_num, strclassName.c_str(), result->cls_score); // printf("AI Class num %d = %s %f\n", cls_num, strclassName.c_str(), result->cls_score);
// 分类存图 开启。 // 分类存图 开启。
if (m_pbaseCheckFunction->saveImg.bSaveClsImg) if (m_pbaseCheckFunction->saveImg.bSaveAlginImg)
{ {
std::string saveimgpaht = ""; std::string saveimgpaht = "";
if (m_strCurDetChannel == "TA")
{ {
saveimgpaht = m_strRootPath_KK_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png"; saveimgpaht = m_strRootPath_TA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png";
}
else
{
saveimgpaht = m_strRootPath_CA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png";
} }
{ {
@ -1956,9 +1946,6 @@ int ImgCheckAnalysisy::AIClassTypeToConfigType(int nAIQXType)
case AI_CLass_QX_NAME_PIN_PoSun: case AI_CLass_QX_NAME_PIN_PoSun:
resultError_type = CONFIG_QX_NAME_PIN_PoSun; resultError_type = CONFIG_QX_NAME_PIN_PoSun;
break; break;
case AI_CLass_QX_NAME_PIN_QueShi:
resultError_type = CONFIG_QX_NAME_PIN_QueShi;
break;
case AI_CLass_QX_NAME_BTB_DuanLie: case AI_CLass_QX_NAME_BTB_DuanLie:
resultError_type = CONFIG_QX_NAME_BTB_DuanLie; resultError_type = CONFIG_QX_NAME_BTB_DuanLie;
break; break;
@ -1974,6 +1961,9 @@ int ImgCheckAnalysisy::AIClassTypeToConfigType(int nAIQXType)
case AI_CLass_QX_NAME_C_BianXing: case AI_CLass_QX_NAME_C_BianXing:
resultError_type = CONFIG_QX_NAME_C_BianXing; resultError_type = CONFIG_QX_NAME_C_BianXing;
break; break;
case AI_CLass_QX_NAME_Panel:
resultError_type = CONFIG_QX_NAME_Panel;
break;
default: default:
break; break;
} }
@ -1999,7 +1989,6 @@ int ImgCheckAnalysisy::Pin_Qx_Det(const cv::Mat &img)
m_Edge_DetConfig.Init(); m_Edge_DetConfig.Init();
m_Edge_DetConfig.strChannel = m_strCurDetChannel; m_Edge_DetConfig.strChannel = m_strCurDetChannel;
m_Edge_DetConfig.strProductID = DetImgInfo_shareP->strImgProductID;
m_Edge_DetConfig.pBaseCheckFunction = m_pbaseCheckFunction; m_Edge_DetConfig.pBaseCheckFunction = m_pbaseCheckFunction;
m_Edge_DetConfig.bSaveResultImg = false; m_Edge_DetConfig.bSaveResultImg = false;
@ -2943,7 +2932,6 @@ int ImgCheckAnalysisy::AI_Edge(const cv::Mat &img, cv::RotatedRect &outerRoi, cv
config.bSaveResultImg = true; config.bSaveResultImg = true;
} }
config.strChannel = DetImgInfo_shareP->strChannel; config.strChannel = DetImgInfo_shareP->strChannel;
config.strProductID = DetImgInfo_shareP->strImgProductID;
config.pBaseCheckFunction = m_pbaseCheckFunction; config.pBaseCheckFunction = m_pbaseCheckFunction;
int re = m_pAI_Edge_Algin.Detect(img, &config, m_pEdge_Align_Result); int re = m_pAI_Edge_Algin.Detect(img, &config, m_pEdge_Align_Result);
if (re != 0) if (re != 0)

@ -10,10 +10,6 @@ Pin_QX_Det::Pin_QX_Det(std::shared_ptr<DetLog> &log_ref)
{ {
std::string m_strSavePath; std::string m_strSavePath;
AI_Factory = AIFactory::GetInstance(); AI_Factory = AIFactory::GetInstance();
m_strLastDate = "";
m_strRootPath_Pin = "/home/aidlux/BOE/Algin/Pin/";
m_pImageStorage = ImageStorage::getInstance();
creatsavedir();
} }
Pin_QX_Det::~Pin_QX_Det() Pin_QX_Det::~Pin_QX_Det()
{ {
@ -31,12 +27,6 @@ int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat
cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl; cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl;
cv::resize(img, detImg, sz); cv::resize(img, detImg, sz);
// 存图用: 通道转换(灰度化)之前的模型输入图(未开启存图时不克隆, 节省时间/内存)
cv::Mat saveInImg;
if (pDetConfig->pBaseCheckFunction != NULL && pDetConfig->pBaseCheckFunction->saveImg.bSavePinImg)
{
saveInImg = detImg.clone();
}
int re = 0; int re = 0;
if (detImg.channels() != 1) if (detImg.channels() != 1)
{ {
@ -51,20 +41,6 @@ int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat
return re123; return re123;
} }
// 参数 Align_Pin_Save 打开时, 保存Pin脚定位模型的输入/输出图(异步存图, 不阻塞检测)
// 输入图存未做通道转化(灰度化)之前的图; 文件名首位用产品ID
if (pDetConfig->pBaseCheckFunction != NULL && pDetConfig->pBaseCheckFunction->saveImg.bSavePinImg)
{
creatsavedir();
std::string str = m_strSavePath_Pin + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_pin_in.png";
int sr = m_pImageStorage->addImage(str, saveInImg);
if (sr == 0)
{
str = m_strSavePath_Pin + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_pin_out_mask.png";
m_pImageStorage->addImage(str, mask, true);
}
}
if (pDetConfig->bSaveResultImg) if (pDetConfig->bSaveResultImg)
{ {
cv::imwrite(pDetConfig->strChannel +"_pin_" +"in.png", detImg); cv::imwrite(pDetConfig->strChannel +"_pin_" +"in.png", detImg);
@ -73,16 +49,3 @@ int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat
return 0; return 0;
} }
int Pin_QX_Det::creatsavedir()
{
std::string curDate = CheckUtil::getCurrentDate();
if (curDate == m_strLastDate)
{
return 0;
}
m_strLastDate = curDate;
m_strSavePath_Pin = m_strRootPath_Pin + curDate + "/";
CheckUtil::CreateDir(m_strSavePath_Pin);
return 0;
}

@ -1060,9 +1060,9 @@ struct Base_Function_SaveImg
{ {
bool bOpen; // 是否开启 bool bOpen; // 是否开启
bool bSaveMarkImg; // mark 存图
bool bSaveClsImg; // 分类 存图 bool bSaveClsImg; // 分类 存图
bool bSaveAlginImg; // 定位 存图 bool bSaveAlginImg; // 分类 存图
bool bSavePinImg; // pin 存图
bool bSaveAIDetImg; // AI 检测残点图 存图(每个模型单独一级目录) bool bSaveAIDetImg; // AI 检测残点图 存图(每个模型单独一级目录)
Base_Function_SaveImg() Base_Function_SaveImg()
@ -1072,7 +1072,7 @@ struct Base_Function_SaveImg
void Init() void Init()
{ {
bOpen = false; bOpen = false;
bSavePinImg = false; bSaveMarkImg = false;
bSaveClsImg = false; bSaveClsImg = false;
bSaveAlginImg = false; bSaveAlginImg = false;
bSaveAIDetImg = false; bSaveAIDetImg = false;
@ -1082,21 +1082,21 @@ struct Base_Function_SaveImg
{ {
this->bOpen = tem.bOpen; this->bOpen = tem.bOpen;
this->bSavePinImg = tem.bSavePinImg; this->bSaveMarkImg = tem.bSaveMarkImg;
this->bSaveClsImg = tem.bSaveClsImg; this->bSaveClsImg = tem.bSaveClsImg;
this->bSaveAlginImg = tem.bSaveAlginImg; this->bSaveAlginImg = tem.bSaveAlginImg;
this->bSaveAIDetImg = tem.bSaveAIDetImg; this->bSaveAIDetImg = tem.bSaveAIDetImg;
} }
void print(std::string str) void print(std::string str)
{ {
printf("%s>>bOpen %d bSavePinImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), printf("%s>>bOpen %d bSaveMarkImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(),
bOpen, bSavePinImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); bOpen, bSaveMarkImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg);
} }
std::string GetInfo(std::string str) std::string GetInfo(std::string str)
{ {
char buffer[256]; char buffer[256];
sprintf(buffer, "%s>>bOpen %d bSavePinImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), sprintf(buffer, "%s>>bOpen %d bSaveMarkImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(),
bOpen, bSavePinImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); bOpen, bSaveMarkImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg);
std::string str123 = buffer; std::string str123 = buffer;
return str123; return str123;
} }
@ -1141,38 +1141,6 @@ struct Big_NG
return str123; return str123;
} }
}; };
struct Base_Function_Merge_QueXi
{
bool bOpen;
Base_Function_Merge_QueXi()
{
Init();
}
void Init()
{
bOpen = false;
}
void copy(Base_Function_Merge_QueXi tem)
{
this->bOpen = tem.bOpen;
}
void print(std::string str)
{
printf("%s>>bOpen %d \n", str.c_str(),
bOpen);
}
std::string GetInfo(std::string str)
{
char buffer[256];
sprintf(buffer, "%s>>bOpen %d \n", str.c_str(),
bOpen);
std::string str123 = buffer;
return str123;
}
};
// 基础检测功能 大缺陷 NG // 基础检测功能 大缺陷 NG
struct Base_Function_BigNG struct Base_Function_BigNG
{ {
@ -1274,7 +1242,6 @@ struct BaseCheckFunction
Base_Function_ALign ALign_Config; Base_Function_ALign ALign_Config;
Base_Function_Pin_Det pinDet; Base_Function_Pin_Det pinDet;
Base_Function_SaveImg saveImg; Base_Function_SaveImg saveImg;
Base_Function_Merge_QueXi Merge_QueXi;
Base_Function_BigNG bigNG; Base_Function_BigNG bigNG;
BaseCheckFunction() BaseCheckFunction()
{ {
@ -1285,7 +1252,6 @@ struct BaseCheckFunction
ALign_Config.Init(); ALign_Config.Init();
pinDet.Init(); pinDet.Init();
saveImg.Init(); saveImg.Init();
Merge_QueXi.Init();
bigNG.Init(); bigNG.Init();
} }
void copy(BaseCheckFunction tem) void copy(BaseCheckFunction tem)
@ -1293,7 +1259,6 @@ struct BaseCheckFunction
this->ALign_Config.copy(tem.ALign_Config); this->ALign_Config.copy(tem.ALign_Config);
this->pinDet.copy(tem.pinDet); this->pinDet.copy(tem.pinDet);
this->saveImg.copy(tem.saveImg); this->saveImg.copy(tem.saveImg);
this->Merge_QueXi.copy(tem.Merge_QueXi);
this->bigNG.copy(tem.bigNG); this->bigNG.copy(tem.bigNG);
} }
void print(std::string str) void print(std::string str)
@ -1302,7 +1267,6 @@ struct BaseCheckFunction
ALign_Config.print("ALign_Config"); ALign_Config.print("ALign_Config");
pinDet.print("pinDet"); pinDet.print("pinDet");
saveImg.print("saveImg"); saveImg.print("saveImg");
Merge_QueXi.print("Merge_QueXi");
bigNG.print("bigNG"); bigNG.print("bigNG");
} }
std::string GetInfo(std::string str) std::string GetInfo(std::string str)
@ -1311,7 +1275,6 @@ struct BaseCheckFunction
str123 += ALign_Config.GetInfo("ALign_Config"); str123 += ALign_Config.GetInfo("ALign_Config");
str123 += pinDet.GetInfo("pinDet"); str123 += pinDet.GetInfo("pinDet");
str123 += saveImg.GetInfo("saveImg"); str123 += saveImg.GetInfo("saveImg");
str123 += Merge_QueXi.GetInfo("Merge_QueXi");
str123 += bigNG.GetInfo("bigNG"); str123 += bigNG.GetInfo("bigNG");
// str123 += "\n"; // str123 += "\n";
return str123; return str123;

@ -825,7 +825,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
// _config.pinDet.print("pinDet"); // _config.pinDet.print("pinDet");
// getchar(); // getchar();
} }
if ("KK_Image_Save" == strCode) if ("Det_Image_Save" == strCode)
{ {
auto value_f = value; auto value_f = value;
// std::cout << value_f << std::endl; // std::cout << value_f << std::endl;
@ -834,6 +834,10 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
if (_config.saveImg.bOpen) if (_config.saveImg.bOpen)
{ {
if (value_f["form"]["SaveImg_Config"]["Mark_Save"])
{
_config.saveImg.bSaveMarkImg = value_f["form"]["SaveImg_Config"]["Mark_Save"].asBool();
}
if (value_f["form"]["SaveImg_Config"]["Cls_Save"]) if (value_f["form"]["SaveImg_Config"]["Cls_Save"])
{ {
_config.saveImg.bSaveClsImg = value_f["form"]["SaveImg_Config"]["Cls_Save"].asBool(); _config.saveImg.bSaveClsImg = value_f["form"]["SaveImg_Config"]["Cls_Save"].asBool();
@ -842,10 +846,6 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
{ {
_config.saveImg.bSaveAlginImg = value_f["form"]["SaveImg_Config"]["Align_Big_Save"].asBool(); _config.saveImg.bSaveAlginImg = value_f["form"]["SaveImg_Config"]["Align_Big_Save"].asBool();
} }
if (value_f["form"]["SaveImg_Config"]["Align_Pin_Save"])
{
_config.saveImg.bSavePinImg = value_f["form"]["SaveImg_Config"]["Align_Pin_Save"].asBool();
}
if (value_f["form"]["SaveImg_Config"]["AI_Det_Save"]) if (value_f["form"]["SaveImg_Config"]["AI_Det_Save"])
{ {
_config.saveImg.bSaveAIDetImg = value_f["form"]["SaveImg_Config"]["AI_Det_Save"].asBool(); _config.saveImg.bSaveAIDetImg = value_f["form"]["SaveImg_Config"]["AI_Det_Save"].asBool();
@ -858,14 +858,6 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
// _config.pinDet.print("pinDet"); // _config.pinDet.print("pinDet");
// getchar(); // getchar();
} }
if ("bMerge_QueXi" == strCode)
{
auto value_f = value;
// std::cout << value_f << std::endl;
// getchar();
_config.Merge_QueXi.bOpen = value_f["isOpen"].asBool();
}
if ("Big_NG" == strCode) if ("Big_NG" == strCode)
{ {
auto value_f = value; auto value_f = value;

Loading…
Cancel
Save