/* * @Author: your name * @Date: 2022-04-20 15:49:50 * @LastEditTime: 2025-09-30 16:17:49 * @LastEditors: xiewenji 527774126@qq.com * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: /ZCXD_MonitorPlatform/src/CoreLogicModule/include/CamDeal.h */ #ifndef ImgCheckAnalysisy_H_ #define ImgCheckAnalysisy_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include "BlobBase.h" #include "ImgCheckBase.h" #include "ImageDetBase.h" #include "ImgCheckConfig.h" #include "CheckErrorCodeDefine.hpp" #include "CheckConfigDefine.h" #include "ConfigBase.h" #include "ImageDetConfig.h" #include "OtherDetect.h" #include "Define_Error.h" #include "AI_Factory.h" #include "ImageAllResult.h" #include "Task.h" #include "ImageStorage.h" #include "AIClassify.h" #include "AI_Second_Det.h" #include "AI_Edge_QX_Det.h" using namespace std; using namespace cv; enum AT_THRESHOLD_TYPE_ { AT_THRESHOLD_TYPE_NULL, AT_THRESHOLD_TYPE_READY, AT_THRESHOLD_TYPE_BUSY, AT_THRESHOLD_TYPE_COMPLETE, }; // 全局静态变量, 记录图像灰度值异常累计数量 static int g_nImgBrightnessErrorCount = 0; class ImgCheckAnalysisy : public ImgCheckBase { public: ImgCheckAnalysisy(); ~ImgCheckAnalysisy(); // 初始化参数 pconfig 参数指针 返回:0 成功 其他异常 int RunStart(void *pconfig1); // 设置检测数据,并开启检测 返回:0 成AT_THRESHOLD_TYPE_READY功 其他异常 int SetDataRun_SharePtr(std::shared_ptr p); // 获取结果信息 返回:0 成功 其他异常 int GetCheckReuslt(std::shared_ptr &pResult); int CheckImg(std::shared_ptr p, std::shared_ptr &pResult); int ReJsonResul(std::shared_ptr p, std::shared_ptr &pResult); // 获取检测库 状态信息 返回:CHECK_THREAD_RUN_STATUS int GetStatus(); // 更新参数 pconfig 参数指针,nConfigType 需要更新的参数类型 返回:0 成功 其他异常 int UpdateConfig(void *pconfig, int nConfigType); std::string GetVersion(); std::string GetErrorInfo(); int creatsavedir(); private: // 加载运行参数 int LoadRunConfig(void *p); // 加载分析参数 int LoadCheckConfig(void *p); /// @brief 初始化并且启动程序 /// @return int InitRun(int nId); /// @brief 开启检测 /// @return int StartCheck(); /// @brief 设置空闲 /// @return int SetIDLE(); private: // 开启线程 int StartThread(int nId); // 停止线程 int StopThread(); // 退出系统 int ExitSystem(); // 初始化模型 int InitModel(); double CalBlobHJ(cv::Mat &img, const cv::Mat &mask, cv::Rect &det_roi, cv::Rect &qx_roi, int expand = 10); cv::Scalar calc_blob_info_withstats(cv::Mat &img, const cv::Mat &mask, cv::Rect &stats, cv::Size k_size = cv::Size(5, 5), int expand = 10, double threshold = 0.7); // 检测 int CheckRun(); // 计算产品尺寸 int CalProductSize(); // 图片预处理 int ImgPreDet(); // 处理签的 预处理 int DetPreImage(); // 每个检测通道 都更新 屏蔽区域 int UpdateSheildMask(std::string strChannel, cv::Rect roi); // 异显检测 int AI_Det_YX(const cv::Mat &cropImg); // 缺失pol检测 int Detect_LackPol(const cv::Mat &cropImg); std::string ConfigTypeToWebDetType(int nconfigType); bool JudgeQXAnalysis(int nqx_configType, std::shared_ptr pQxlog); // 设置新的检测参数 int SetNewConfig(); int GetParamidx(); // 获得参数索引 ChannelCheckFunction *GetChannelFuntion(std::string strChannelName); // 获得 通道的检测功能 private: // 图片处理线程 std::shared_ptr ptr_thread_Run; int Run(int nId); // 运行; // 图片处理线程 std::shared_ptr ptr_thread_AI; int set_cpu_id(const std::vector &cpu_set_vec); // 计算BLob 其他一些属性值。 int CalBlob_Other(); // 计算灰阶 int CalBLobMean_GrayDis(); // 分类 int GetClassImg(const cv::Mat &img, cv::Mat &AIdetImg, cv::Rect qx_roi, int detwidth, int detheight); // 计算缺陷长度 float Cal_QXLen(cv::Mat qx_maskImg, int qx_type, float fsc_x, float fsc_y); float CalImgScorl(cv::Mat det_img, cv::Mat up_img); float CalImgScorl_t(cv::Mat det_img, cv::Mat up_img); // 获取检测结果blob,用于后续分析。 int GetCheckResultBLob(); // 亮的判断 int LDJudge(int nconfigtype, cv::Rect roi, float JudgeArea, int maxV, int hj, std::shared_ptr pQxlog); // 使用 DP mask 进行二次判断 int UseDPMask(int L0, int nconfigtype, cv::Rect roi, float JudgeArea, int maxV, int hj, std::shared_ptr pQxlog); // 更新亮点参数 int UPdateLDConfig(); // 获得所有blob int GetALLBlob(); // 获得YX blob int GetBLob_YX(); // 获得 缺pol blob int GetBlob_LackPol(); // 获得 缺陷 blob int GetBlob_QX(); // 获得 127cell blob int GetBlob_127cell(); // 对AI mask图片进行 结果处理 int AIMaskDet(); // 轮廓处理 int Contours(); // 检测初始化 int CheckImgInit(); // 参数 核对 int ConfigCheck(cv::Mat img); // 多线程方式处理 int AI_Detect_Thread(); // 多线程方式处理Other AI检测 int AI_Other_Det_Thread(); // 缺陷检测 int AI_Detect_QX(); // 127cell int AI_Detect_127Cell(); // 缺陷分类 int AI_QX_Class_Thread(); // 多线程 任务运行管理器 int ThreadTask(int nId); // 运行; // resize 图片 int ResizeImg(); // AI 推理任务函数 void TaskFun_AIDet(std::shared_ptr task); // AI 推理任务函数 void TaskFun_AI_Other(std::shared_ptr task); // 缺陷分类任务函数 void TaskFun_QxClass(std::shared_ptr task); // 更新 检测区域 int Update_DetRoiList(); // 边缘检测 int Edge_Det(); // 临时绘制结果 int DrawResult_Step_1(); // 参数缺陷类型转 结果参数类型 int AIClassTypeToConfigType(int nAIQXType, cv::Rect qx_roi); // 更新成像精度 int UpdateImgageScale(); // 把blob 汇总成 检测结果。 int BLobToDetResult(); // 二次计算缺陷面积 int ReCalQX_AreaAndLen(AI_SecondDet::DetConfigResult *pdetConfig); // 创建检测 小图区域。 int CreatAIDetSmallRoi(const cv::Mat &detimg, std::shared_ptr pAI_Model, std::vector &SmallList); // 多区域分类 int AI_Classify_New(const cv::Mat &src_Img, cv::Rect qx_roi, float fjustarea, float *fmaxScore); // 利用Up 画面过滤 float UseUpMaskAnalysis(cv::Rect teroi, const cv::Mat AIMaskImg, std::shared_ptr pQxlog); // 缺陷是否要进行检测分析 缺陷是参数类型的缺陷 bool Judge_MarkLine_QX(int nqx_configType, cv::Rect detqx_Roi, std::shared_ptr pQxlog); std::shared_ptr AI_Factory; private: int m_nErrorCode; // 错误代码 bool m_bInitSucc; // 初始化状态 bool m_bExit; // 是否退出检测 int m_nThreadIdx; // 线程序号 //相机处理的顺序号,该序号 程序运行就已经固定 std::shared_ptr runner; // 所有的检测结果 std::shared_ptr m_pImageAllResult; std::shared_ptr m_pdetlog; std::shared_ptr m_pDetResult; // 检测结果 后续主要对pDetResult 继续分析 std::shared_ptr DetImgInfo_shareP; // 检测结果 std::shared_ptr m_CheckResult_shareP; // 检测参数模块 ConfigBase *m_pConfig; int m_nConfigIdx; // 线程运行的一些参数 RunInfoST m_RunConfig; float m_fImgage_Scale_X; float m_fImgage_Scale_Y; // 分析参数 AnalysisyConfigST m_AnalysisyConfig; ChannelCheckFunction *m_pFuntion; BaseCheckFunction *m_pbaseCheckFunction; // 基础检测 CommonConfigNodeST *m_pCommonAnalysisyConfig; BasicConfig *m_pBasicConfig; RegionConfigST *m_pRegionAnalysisyParam; // 分析参数 int m_QxInParamListIdx[CONFIG_QX_NAME_count]; cv::Rect m_CutRoi; cv::Rect m_Crop_Roi_paramImg; // 裁切在参数模板图上的 位置。 std::string m_strCurDetCamChannel; // 当前处理的图片通道 std::string m_strCurDetChannel; // 当前处理的图片通道 int m_nRun_Status; // 运行状态:空闲,运行中,异常,。。。。。 int m_nCheckResultErrorCode; Detect_ROI_Config m_DetRoiList; // 检测区域roi List ERROR_DOTS_BLOBS blobs; OtherDet_Config m_OtherDet_Config; std::vector m_Draw_qxImageResult; // 缺陷小图结果 std::vector SmallRoiList; int det_SmallImgNum; std::string m_strRootPath_TA_cls; std::string m_strRootPath_CA_cls; std::string m_strSavePath_cls; std::string m_strLastDate; ImageStorage *m_pImageStorage; AI_SecondDet m_SecondDet; // 二次分割检测 // AI 推理的所有结果, 可能会返回去。需要临时存储。 std::queue> m_AIMaskImgBLobQueue; std::mutex mtx_AIMaskImgBLobQueue; AIClassify m_AIClassify; // 缺陷分类 AI_Edge_QX_Det m_AIEdge_QX_Det; // 边缘缺陷检测 Task m_task; std::shared_ptr m_AItask; std::shared_ptr m_AI_Other_task; // 其他类型的AI推理 std::shared_ptr m_Classtask; // 缺陷分类任务 LD_ConfigT_ m_LDConfig; LD_ConfigT_ m_LD_WTBConfig; LD_ConfigT_ m_LD_HSConfig; }; #endif