You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

892 lines
21 KiB

/*
* @Author: your name
* @Date: 2022-04-20 15:50:00
* @LastEditTime: 2025-09-24 11:03:35
* @LastEditors: xiewenji 527774126@qq.com
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: /ZCXD_MonitorPlatform/src/CoreLogicModule/src/CamDeal.cpp
*/
#include "ALLImgCheckAnalysisy.hpp"
#include "CheckUtil.hpp"
#include "Define.h"
#include "AI_Factory.h"
#include <fstream>
std::vector<ReadFlawCode> m_FlawCodeList;
std::vector <std::string> QX_Result_Names =
{
"OK",
"AD_YX",
"X_Line",
"Y_Line",
"fangge",
"Rubbing_Mura",
"Broken_line",
"ZARA",
"MTX",
"POL_Cell",
"Bright_Point",
"Dark_Point",
"BLack_Point",
"White_Point",
"Scratch",
"Weak_Bright_Mura",
"No_Label",
"Bright_Mura_Exe",
"Sweak_Line_Dark",
"STEAM_POCKET",
"Dirty",
"other",
"Cell_W",
"Cell_B",
"LackPol"};
std::vector <std::string> QX_Result_Code =
{
"P1153",
"P6873",
"P3351",
"P3452",
"P3453",
"P1550",
"P3379",
"P1153",
"P1164",
"P1101",
"P1112",
"P1111",
"P1104",
"P1103",
"P1557",
"P1654",
"P2833",
"P1549",
"P1204",
"P2534",
"P2534",
"P1101",
"P1103",
"P1104",
"P8001",
};
int ReadFlawCodeConfig(std::string json_path)
{
m_FlawCodeList.erase(m_FlawCodeList.begin(), m_FlawCodeList.end());
std::string strPath = json_path;
printf("ReadFlawCodeConfig path %s\n", strPath.c_str());
Json::CharReaderBuilder builder;
builder["collectComments"] = true;
Json::Value root;
std::string err;
std::ifstream ifs(strPath);
if (!ifs.is_open())
{
printf("error:file is open\n");
return 0;
}
if (!Json::parseFromStream(builder, ifs, &root, &err))
{
printf("error:parseFromStream\n");
return 0;
}
for (int i = 0; i < root.size(); i++)
{
// printf("Node idx %d /%d \n", i, root.size());
ReadFlawCode tem;
tem.flaw_name = root[i]["zh_name"].asString();
tem.flaw_code = root[i]["en_name"].asString();
string desc = root[i]["desc"].asString();
{
std::istringstream stream(desc);
std::string token;
// 使用 getline 按照分号分割
while (std::getline(stream, token, ';'))
{
tem.config_flaw_name.push_back(token);
}
}
m_FlawCodeList.push_back(tem);
}
for(int i = 0; i < m_FlawCodeList.size(); i++)
{
if(i >= QX_Result_Names.size()) {
QX_Result_Names.push_back(m_FlawCodeList.at(i).flaw_name);
QX_Result_Code.push_back(m_FlawCodeList.at(i).flaw_code);
}
else
{
QX_Result_Names.at(i) = m_FlawCodeList.at(i).flaw_name;
QX_Result_Code.at(i) = m_FlawCodeList.at(i).flaw_code;
}
}
return 0;
}
double calculateDistanceBetweenRectCenters(const cv::Rect &rect1, const cv::Rect &rect2, float fx, float fy)
{
// 计算矩形1的中心点
cv::Point center1(rect1.x + rect1.width / 2, rect1.y + rect1.height / 2);
// 计算矩形2的中心点
cv::Point center2(rect2.x + rect2.width / 2, rect2.y + rect2.height / 2);
center1.x *= fx;
center1.y *= fy;
center2.x *= fx;
center2.y *= fy;
// 计算中心点之间的欧几里得距离
double distance = cv::norm(center1 - center2);
return distance;
}
ALLImgCheckAnalysisy::ALLImgCheckAnalysisy()
{
m_strTest = "";
}
ALLImgCheckAnalysisy::~ALLImgCheckAnalysisy()
{
StopThread();
}
int ALLImgCheckAnalysisy::RunStart(void *pconfig1)
{
// 1、参数版本核对
int re = CheckConfigVersion(pconfig1);
if (re != 0)
{
printf("*************CheckConfigVersion error %d*************** \n", re);
m_nErrorCode = INIT_CameraCheck_Error;
return m_nErrorCode;
}
m_pParamName = ParmNameChange::getInstance();
m_pParamName->m_nWorkIdx = m_RunConfig.nWorkIdx;
// 2、初始化相机类
re = InitCameraCheckAnalysisy();
if (re != 0)
{
printf("*************InitCameraCheckAnalysisy error %d*************** \n", re);
m_nErrorCode = INIT_CameraCheck_Error;
return m_nErrorCode;
}
re = InitRun();
if (CHECK_OK != re)
{
m_nErrorCode = re;
return m_nErrorCode;
}
re = InitAIFactory();
if (CHECK_OK != re)
{
m_nErrorCode = re;
return m_nErrorCode;
}
m_nErrorCode = CHECK_OK;
printf(">>>> ALLImgCheckAnalysisy Start Succ \n");
m_nErrorCode = CHECK_OK;
m_bInitSucc = true;
return m_nErrorCode;
}
int ALLImgCheckAnalysisy::SetDataRun_SharePtr(std::shared_ptr<shareImage> p)
{
int re = PushInImg_New(p);
if (re != 0)
{
printf("SetDataRun_SharePtr======================= re %d \n", re);
}
return re;
}
int ALLImgCheckAnalysisy::GetCheckReuslt(std::shared_ptr<CheckResult> &pResult)
{
std::unique_lock<std::mutex> lk(mtx_CheckResult); // 使用 unique_lock
CheckResult_cond.wait(lk, [this]
{ return !m_CheckResultList.empty(); }); // 等待直到数据队列非空
pResult = m_CheckResultList.front(); // 从队列中取出数
m_CheckResultList.pop();
lk.unlock();
return 0;
}
int ALLImgCheckAnalysisy::ReJson(std::shared_ptr<shareImage> p, std::shared_ptr<CheckResult> &pResult)
{
return 0;
}
int ALLImgCheckAnalysisy::CheckImg(std::shared_ptr<shareImage> p, std::shared_ptr<CheckResult> &pResult)
{
return 0;
}
int ALLImgCheckAnalysisy::GetStatus()
{
return 0;
}
int ALLImgCheckAnalysisy::UpdateConfig(void *pconfig, int nConfigType)
{
int re = 0;
RunInfoST *tempconfig;
switch (nConfigType)
{
case CHECK_CONFIG_Run:
tempconfig = (RunInfoST *)pconfig;
m_RunConfig.copy(*tempconfig);
break;
case CHECK_CONFIG_Module:
m_pConfigManager = (ConfigManagerBase *)pconfig;
break;
default:
break;
}
return 0;
}
std::string ALLImgCheckAnalysisy::GetVersion()
{
return std::string("BOE_2.0.5");
}
std::string ALLImgCheckAnalysisy::GetErrorInfo()
{
std::string result = "";
return result;
}
int ALLImgCheckAnalysisy::ErrorReturn(std::shared_ptr<shareImage> p)
{
std::shared_ptr<CheckResult> result = std::make_shared<CheckResult>();
result->in_shareImage = p;
result->checkStatus = 1;
result->nresult = -CHECK_ERROR_PushImg_ID_Error;
result->basicResult.img_id = p->img_id;
result->basicResult.imgtype = p->imgtype;
result->basicResult.imgstr = p->imgstr;
result->basicResult.strChannel = p->strChannel;
// printf("ErrorReturn==== %s %s\n", p->strImgProductID.c_str(), p->strChannel.c_str());
{
std::lock_guard<std::mutex> lock(mtx_CheckResult);
m_CheckResultList.push(result);
}
CheckResult_cond.notify_all();
return 0;
}
std::shared_ptr<Product> ALLImgCheckAnalysisy::GetProduct(std::string strProduct)
{
std::lock_guard<std::mutex> lock(mtx_ProductList);
for (int i = 0; i < m_ProductList.size(); i++)
{
// printf("ddd %s \n", m_ProductList.at(i)->productBaseResult->strproductName.c_str());
if (m_ProductList.at(i)->productBaseResult->strproductName == strProduct)
{
return m_ProductList.at(i);
}
}
return std::shared_ptr<Product>();
}
int ALLImgCheckAnalysisy::InitAIFactory()
{
std::shared_ptr<AIFactory> AI_Factory;
AI_Factory = AIFactory::GetInstance();
GPU_Config gpu;
int num = 0;
for (int i = 0; i < MAX_GPU_NUM; i++)
{
gpu.UseGPUList[i] = m_RunConfig.UseGPUList[i];
if (gpu.UseGPUList[i] >= 0)
{
num++;
}
}
if (num == 0)
{
gpu.UseGPUList[0] = 0;
gpu.UseGPUList[1] = 1;
}
for (int i = 0; i < MAX_GPU_NUM; i++)
{
printf("=====InitAIFactory gpu %d %d \n", i, gpu.UseGPUList[i]);
}
AI_Factory->InitALLAIModle(gpu);
return 0;
}
int ALLImgCheckAnalysisy::LoadRunConfig(void *p)
{
return 0;
}
int ALLImgCheckAnalysisy::LoadCheckConfig(void *p)
{
return 0;
}
int ALLImgCheckAnalysisy::InitRun()
{
int re;
re = StartThread();
if (CHECK_OK != re)
{
return re;
}
return 0;
}
int ALLImgCheckAnalysisy::StartCheck()
{
return 0;
}
int ALLImgCheckAnalysisy::SetIDLE()
{
return 0;
}
int ALLImgCheckAnalysisy::CheckConfigVersion(void *pconfig1)
{
int re = 0;
VERSION_INFO *pVersionconfig = (VERSION_INFO *)pconfig1;
if (pVersionconfig == NULL)
{
m_nErrorCode = CHECK_ERROR_VERSION; // 参数或接口版本问题
return m_nErrorCode;
}
int v1 = ALL_INTERFACE_VERSION;
int v2 = CONFIGBASE_VERSION;
int v3 = RESULT_VERSION;
printf("**************************** ALL_INTERFACE_VERSION so: %d in:%d CONFIGBASE_VERSION so:%d in:%d RESULT_VERSION so:%d in:%d\n",
v1, pVersionconfig->InterfaceVersion, v2, pVersionconfig->ConfigVersion, v3, pVersionconfig->ResultVersion);
// 版本控制
if (pVersionconfig->InterfaceVersion != ALL_INTERFACE_VERSION ||
pVersionconfig->ConfigVersion != CONFIGBASE_VERSION ||
pVersionconfig->ResultVersion != RESULT_VERSION)
{
m_nErrorCode = CHECK_ERROR_VERSION; // 参数或接口版本问题
return m_nErrorCode;
}
return 0;
}
int ALLImgCheckAnalysisy::StartThread()
{
m_bExit = false;
{ // 开启检测线程
ptr_thread_Run = std::make_shared<std::thread>(std::bind(&ALLImgCheckAnalysisy::Run, this));
}
return 0;
}
int ALLImgCheckAnalysisy::StopThread()
{
m_bExit = true;
if (ptr_thread_Run != nullptr)
{
if (ptr_thread_Run->joinable())
{
ptr_thread_Run->join();
}
}
return 0;
}
int ALLImgCheckAnalysisy::ExitSystem()
{
return 0;
}
int ALLImgCheckAnalysisy::InitCameraCheckAnalysisy()
{
ReadFlawCodeConfig("/var/aidlux/efs/cell_aoi/model/defect_list.json");
m_pCameraCheckAnalysisyList.clear();
// m_pQX_Merge_Analysis->Clear();
for (const auto &config : m_pConfigManager->Config_instances_)
{
std::cout << "key: " << config.first << std::endl;
std::shared_ptr<CameraCheckAnalysisy> p = std::make_shared<CameraCheckAnalysisy>();
p->m_RunConfig.copy(m_RunConfig);
p->m_pConfig = config.second;
int re = p->Init(config.first);
if (re != 0)
{
std::cout << "Init CameraCheckAnalysisy " << config.first << " Failed" << std::endl;
return -1;
}
m_pCameraCheckAnalysisyList[config.first] = p;
// m_pQX_Merge_Analysis->AddCamer(config.first);
}
if (m_pCameraCheckAnalysisyList.size() < 0)
{
printf("ALLImgCheckAnalysisy::InitCameraCheckAnalysisy error camera config is null \n");
return 1;
/* code */
}
printf("ALLImgCheckAnalysisy::InitCameraCheckAnalysisy end \n");
// getchar();
return 0;
}
int ALLImgCheckAnalysisy::InitData()
{
return 0;
}
int ALLImgCheckAnalysisy::Det_Product(std::shared_ptr<Product> &product)
{
// m_pQX_Merge_Analysis->InitData();
// 处理每个相机
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(20));
{
std::lock_guard<std::mutex> lock(product->mtx_CameraResultList); //
for (auto &ptr : product->m_pCameraResultList)
{
if (ptr->GetCheckStep() == Check_Step_NODet)
{
m_pCameraCheckAnalysisyList[ptr->cameraBaseResult->strCameraName]->StartCheck(ptr);
}
}
}
// 判断每个相机是否都处理完了。
bool bdetComplete = product->bCheckCamplate();
// 处理完成,退出循环
if (bdetComplete)
{
break;
}
}
// 联合分析
// AnalysiyAll(0);
MergeShowImg(product);
SetProductResult(product);
printf(">>>>>>>>>>>>>>>Det_Product****************det End************\n");
return 0;
}
std::shared_ptr<Product> ALLImgCheckAnalysisy::GetProduct()
{
std::unique_lock<std::mutex> lk(mtx_ProductList); // 使用 unique_lock
ProductList_cond.wait(lk, [this]
{ return !m_ProductList.empty(); }); // 等待直到数据队列非空
std::shared_ptr<Product> tem = m_ProductList.at(0);
lk.unlock();
return tem;
}
int ALLImgCheckAnalysisy::AnalysiyAll(int productIdx)
{
return 0;
}
int ALLImgCheckAnalysisy::SetProductResult(std::shared_ptr<Product> product)
{
int nDetCamNum = product->m_pCameraResultList.size();
// 相机2的起始位置
bool bNG = false;
for (int icam = 0; icam < nDetCamNum; icam++)
{
std::shared_ptr<CameraResult> pcam = product->m_pCameraResultList.at(icam);
for (int i = 0; i < pcam->ImageALLDetResultList.size(); i++)
{
std::shared_ptr<CheckResult> pCheckResult = pcam->ImageALLDetResultList.at(i)->result;
if (pCheckResult->qxImageResult.size() > 0)
{
bNG = true;
}
if (bNG)
{
break;
}
}
if (bNG)
{
break;
}
}
if (bNG)
{
for (int icam = 0; icam < nDetCamNum; icam++)
{
std::shared_ptr<CameraResult> pcam = product->m_pCameraResultList.at(icam);
for (int i = 0; i < pcam->ImageALLDetResultList.size(); i++)
{
std::shared_ptr<CheckResult> pCheckResult = pcam->ImageALLDetResultList.at(i)->result;
pCheckResult->nProductResult = 1;
}
}
}
return 0;
}
int ALLImgCheckAnalysisy::SetSetComplet_New(std::shared_ptr<Product> product, int nerror)
{
if (product)
{
int nDetCamNum = product->m_pCameraResultList.size();
for (int icam = 0; icam < nDetCamNum; icam++)
{
std::shared_ptr<CameraResult> pcam = product->m_pCameraResultList.at(icam);
for (int i = 0; i < pcam->ImageALLDetResultList.size(); i++)
{
std::shared_ptr<CheckResult> pCheckResult = pcam->ImageALLDetResultList.at(i)->result;
{
std::lock_guard<std::mutex> lock123(mtx_CheckResult);
m_CheckResultList.push(pCheckResult);
}
CheckResult_cond.notify_all();
}
}
}
return 0;
}
int ALLImgCheckAnalysisy::PushInImg_New(std::shared_ptr<shareImage> p)
{
if (!m_bInitSucc)
{
printf("Init fail exit \n");
return CHECK_ERROR_Config_Null;
}
p->strParm_WorkCamName = m_pParamName->GetWebConfigCamName_DetImgCamName(p->strCameraName);
std::string strlog = "";
m_strTest += " PushInImg->SN:";
m_strTest += p->strImgProductID;
m_strTest += " Channel:";
m_strTest += p->strChannel;
m_strTest += " CameraID:";
m_strTest += p->strCameraName;
m_strTest += " WorkCamName:";
m_strTest += p->strParm_WorkCamName;
std::string strBase = "";
strBase += " PushInImg->SN:";
strBase += p->strImgProductID;
strBase += " camera:";
strBase += p->strCameraName;
strBase += " WorkCamName:";
strBase += p->strParm_WorkCamName;
strBase += " Channel:";
strBase += p->strChannel;
printf("strBase %s p->Status %d\n", strBase.c_str(), p->Status);
std::shared_ptr<Product> product;
{
std::string strcameraName = p->strParm_WorkCamName;
// 判断 相机名称是否存在
if (!m_pCameraCheckAnalysisyList.count(strcameraName) && -1 != p->Status)
{
return CHECK_ERROR_Camear_ID_Error;
}
product = GetProduct(p->strImgProductID);
bool ProductID_Exist = false; // 是否存在当前产品ID
strlog += "productID ";
if (product)
{
strlog += "exist";
ProductID_Exist = true;
}
// 产品ID存在
if(ProductID_Exist)
{
// 模式为第一张图,返回异常
if(IN_IMG_Status_Start == p->Status)
{
cout << "---ProductID_Exist && IN_IMG_Status_Start == p->Status---" << endl;
return CHECK_ERROR_PRODUCT_ID_EXIST;
}
// 图片都已经完了的状态
if(product->bIsImgComplete)
{
cout << "---ProductID_Exist && product->bIsImgComplete is true---" << endl;
ErrorReturn(p);
return CHECK_ERROR_PRODUCT_ID_EXIST;
}
}
// 产品ID不存在
else
{
strlog += "isnot exist";
//设置其他m_ProductList送图状态设置为结束
cout << "-------set m_ProductList other product to end-------" << endl ;
std::lock_guard<std::mutex> lock(mtx_ProductList);
for(auto &tem:m_ProductList){
tem->bIsImgComplete = true;
}
if(-1 == p->Status)
{
return CHECK_ERROR_PushImg_ID_Error;
}
}
// 产品不存在 新建一个
if (!product)
{
std::lock_guard<std::mutex> lock(mtx_ProductList);
{
if (m_ProductList.size() > 50)
{
Clear_m_ProductList();
return CHECK_ERROR_PushImg_ListSize;
}
}
strlog += " | create new product";
product = std::make_shared<Product>();
product->productBaseResult->strproductName = p->strImgProductID;
if (m_CurProductIdx > 999999)
{
m_CurProductIdx = 0;
}
product->productUseCount = m_CurProductIdx;
m_CurProductIdx++;
m_ProductList.push_back(product);
std::string strTimg = CheckUtil::getCurTimeHMS();
product->productBaseResult->detlog->bPrintStr = true;
product->productBaseResult->detlog->AddCheckstr(PrintLevel_0, "PushInImg", "add new product %s %s ", p->strImgProductID.c_str(), strTimg.c_str());
}
else
{
strlog += " | product: ";
strlog += product->productBaseResult->strproductName;
// printf("Product Is %s \n", product->productBaseResult->strproductName.c_str());
}
// 送入图的状态 结束
if(-1 == p->Status)
{
strlog += " | p->Status == -1, set product complete";
product->bIsImgComplete = true;
}
// 送入图的状态 不是结束
else
{
strlog += " | create new camera result";
// 对应相机的 检测结果
std::shared_ptr<CameraResult> pCamera = product->GetCameraResult(strcameraName);
if (pCamera.get() == nullptr)
{
strlog += " | CHECK_ERROR_Camear_ID_Error";
product->productBaseResult->detlog->bPrintStr = true;
product->productBaseResult->detlog->AddCheckstr(PrintLevel_1, "PushInImg end", "%s", strlog.c_str());
ErrorReturn(p);
return CHECK_ERROR_Camear_ID_Error;
}
// 添加产品信息
pCamera->AddDetImage(p);
}
product->UpdatePushStatus(p->Status);
if (IN_IMG_Status_End == p->Status)
{
strlog += " | p->Status == IN_IMG_Status_End, set product complete";
product->bIsImgComplete = true;
m_strTest += "\n";
product->AddLog(m_strTest);
m_strTest = "";
}
product->productBaseResult->detlog->bPrintStr = true;
product->productBaseResult->detlog->AddCheckstr(PrintLevel_0, "PushInImg end", "%s", strlog.c_str());
ProductList_cond.notify_all();
}
return 0;
}
cv::Mat ALLImgCheckAnalysisy::hconcatWithFirstBase(const cv::Mat &img1, const cv::Mat &img2,
int interpolation = cv::INTER_LINEAR)
{
// 如果高度相同,直接拼接
if (img1.rows == img2.rows)
{
cv::Mat result;
cv::hconcat(img1, img2, result);
return result;
}
// 计算缩放比例
double scale = static_cast<double>(img1.rows) / img2.rows;
// 调整img2的高度
cv::Mat img2_resized;
cv::resize(img2, img2_resized, cv::Size(), scale, scale, interpolation);
// 拼接
cv::Mat result;
cv::hconcat(img1, img2_resized, result);
return result;
}
int ALLImgCheckAnalysisy::MergeShowImg(std::shared_ptr<Product> product)
{
int nDetCamNum = product->m_pCameraResultList.size();
// printf("MergeShowImg %s \n", product->productBaseResult->strproductName.c_str());
// 2个相机才操作
if (nDetCamNum == 2)
{
std::shared_ptr<CameraResult> pcam_0 = product->m_pCameraResultList.at(0);
std::shared_ptr<CameraResult> pcam_1 = product->m_pCameraResultList.at(1);
for (int i = 0; i < pcam_0->ImageALLDetResultList.size(); i++)
{
std::shared_ptr<CheckResult> pCheckResult_0 = pcam_0->ImageALLDetResultList.at(i)->result;
// printf("cam %s channel %s \n", pcam_0->cameraBaseResult->strCameraName.c_str(),
// pCheckResult_0->in_shareImage->strChannel.c_str());
for (int j = 0; j < pcam_1->ImageALLDetResultList.size(); j++)
{
std::shared_ptr<CheckResult> pCheckResult_1 = pcam_1->ImageALLDetResultList.at(j)->result;
if (pCheckResult_1->in_shareImage->strChannel == pCheckResult_0->in_shareImage->strChannel)
{
// printf("cam %s channel %s \n", pcam_1->cameraBaseResult->strCameraName.c_str(),
// pCheckResult_1->in_shareImage->strChannel.c_str());
if (!pCheckResult_0->resultimg.empty() && !pCheckResult_1->resultimg.empty())
{
cv::Mat meregeimg;
if (pCheckResult_0->in_shareImage->strCameraName == "left")
{
meregeimg = hconcatWithFirstBase(pCheckResult_0->resultimg, pCheckResult_1->resultimg);
}
else
{
meregeimg = hconcatWithFirstBase(pCheckResult_1->resultimg, pCheckResult_0->resultimg);
}
pCheckResult_0->resultimg = meregeimg;
pCheckResult_1->resultimg = meregeimg;
}
break;
}
}
}
}
return 0;
}
void ALLImgCheckAnalysisy::Clear_m_ProductList(){
int num = m_ProductList.size();
string strlog = "";
printf("******************\n\n m_ProductImgDetResultList %ld \n", m_ProductList.size());
std::lock_guard<std::mutex> lock(mtx_ProductList);
int idx = -1;
for (int i = 0; i < m_ProductList.size(); i++)
{
int sub = std::abs(m_CurProductIdx - m_ProductList.at(i)->productUseCount);
if (sub > 50)
{
// 删除指定位置的元素
// m_ProductList.at(i)->productBaseResult->detlog->AddCheckstr(PrintLevel_0, "PushInImg", "%s Delete size > %d; m_CurProductIdx %d - nNotDetCount %d > 50",
// m_ProductList.at(i)->,
// m_ProductList.size(), m_CurProductIdx,
// m_ProductList.at(i)->productUseCount);
m_ProductList.erase(m_ProductList.begin() + i);
}
}
}
int ALLImgCheckAnalysisy::Run()
{
while (!m_bExit)
{
std::this_thread::sleep_for(std::chrono::milliseconds(20));
std::shared_ptr<Product> product = GetProduct();
int re = Det_Product(product);
// // 检测失败
// if (re != 0)
// {
// continue;
// }
SetSetComplet_New(product, re);
// 更新 产品队列
{
std::lock_guard<std::mutex> lock(mtx_ProductList); //
if (!m_ProductList.empty())
{
m_ProductList.erase(m_ProductList.begin());
}
}
}
return 0;
}
int ALLImgCheckAnalysisy::set_cpu_id(const std::vector<int> &cpu_set_vec)
{
// for cpu affinity
int nRet = 0;
#ifdef __linux
cpu_set_t _cur_cpu_set;
CPU_ZERO(&_cur_cpu_set);
for (auto _id : cpu_set_vec)
{
CPU_SET(_id, &_cur_cpu_set);
}
if (0 > pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &_cur_cpu_set))
{
perror("set cpu affinity failed: ");
printf("Warning: set cpu affinity failed ... ...\n");
nRet = -1;
}
#endif //__linux
return nRet;
}