/* //实现对部分缺陷 需要进行 数量 和距离上分析的 */ #ifndef AI_Edge_Algin_H_ #define AI_Edge_Algin_H_ #include #include "CheckUtil.hpp" #include "OtherDetBaseDefine.h" #include "CheckErrorCodeDefine.hpp" #include "ImageDetConfig.h" #include "AI_Factory.h" using namespace std; using namespace std; using namespace cv; // 边缘搜索定位结果 struct Edge_AI_Result { int nresult; cv::Mat mask; cv::Rect roi; cv::Mat DetMask_src; // 原图上产品区域 std::shared_ptr> edge_RoiList; // 边缘检测的roi区域 Edge_AI_Result() { Init(); } void Init() { nresult = 0; roi = cv::Rect(0, 0, 0, 0); if (!mask.empty()) { mask.release(); } if (!DetMask_src.empty()) { DetMask_src.release(); } edge_RoiList = std::make_shared>(); } }; class AI_Edge_Algin { public: enum SaveProcessType { Save_Close, // 不保存 Save_Filter, // 过滤的 Save_ALL, // 全部 }; /// @brief 检测过程的参数 struct DetConfig { int ncamId; // 相机ID std::string strCamName; // 相机ID int nthresholdvalue; // 背景阈值 int nAIErodesize; // 边缘腐蚀强度 bool bDebugSaveImg; // 保存结果图片 SaveProcessType saveProcessImg; // 保存过程图片 bool bUseDrawRoi_Check; // 是否用绘制的ROI进行校验 cv::Rect drawRoi; // 绘制的 ROi; cv::Mat drawMask; // 绘制的maksk DetConfig() { Init(); } void Init() { ncamId = 0; strCamName = ""; nthresholdvalue = 1; nAIErodesize = 7; bDebugSaveImg = false; saveProcessImg = Save_Close; bUseDrawRoi_Check = false; drawRoi = cv::Rect(0, 0, 0, 0); if (!drawMask.empty()) { drawMask.release(); /* code */ } } void Print() { printf("nthresholdvalue:%d;nAIErodesize %d;bSaveResultImg %s SaveProcessImg %d\n", nthresholdvalue, nAIErodesize, BOOL_TO_STR(bDebugSaveImg), saveProcessImg); printf("bUseDrawRoi_Check %s roi %s \n", BOOL_TO_STR(bUseDrawRoi_Check), CheckUtil::GetRectString(drawRoi).c_str()); } bool IsSaveProcessImg() { if (saveProcessImg != Save_Close) { return true; } return false; } }; public: AI_Edge_Algin(/* args */); ~AI_Edge_Algin(); // 初始化检测模型 int InitModel_ALL(); int Detect(const cv::Mat &img, DetConfig *pDetConfig, std::shared_ptr &pCheckResult_Aling); int SaveSmallImg(const cv::Mat &img, const cv::Mat &mask, cv::Rect roi); private: int InitModel_Big(); int InitModel_Small(); int Det_big(const cv::Mat &img, vector &smallRoiList, std::shared_ptr> edgeRoiList, cv::Rect &bigRoi, cv::Mat &big_mask); int Dtet_small(const cv::Mat &img, vector &smallRoiList, cv::Mat &Src_Mask); private: bool m_bInitSucc; // 是否初始化成功 // 检测结果 // std::shared_ptr m_pCheckResult_Aling; OtherDet_Config *m_pOtherDet_Config; DetConfig *m_pDetConfig; std::shared_ptr AI_Factory; std::shared_ptr runner; std::string m_str_curCamName; bool m_bInitialized; bool m_bModelSucc; private: /* data */ }; // 图片特征定位 class Image_Feature_Algin { public: struct DetConfig { bool bSaveImg; bool bSave_Process; // 存储过程图片 float fscore; cv::Mat TemplateImg; // 模版图片 cv::Mat DetImg; // 检测图片 cv::Rect Search_Roi; // 搜索 范围 cv::Rect feature_Roi; // 特征区域 cv::Rect param_CropRoi; // 裁剪区域,在参数图片上 cv::Rect DetImg_CropROi; // 裁剪区域,在检测图片上 DetConfig() { bSaveImg = false; bSave_Process = false; fscore = 0.9; Search_Roi = cv::Rect(0, 0, 0, 0); feature_Roi = cv::Rect(0, 0, 0, 0); param_CropRoi = cv::Rect(0, 0, 0, 0); DetImg_CropROi = cv::Rect(0, 0, 0, 0); } }; public: Image_Feature_Algin(/* args */); ~Image_Feature_Algin(); int Detect(DetConfig *pDetConfig, Align_Result *pResult, std::vector &LogList); private: cv::Point findBestTemplateMatch(const cv::Mat &detectionImage, const cv::Mat &templateImage, double &bestScore, int method = cv::TM_CCOEFF_NORMED); private: PRINT_LOG_ m_PrintLog; private: /* data */ }; #endif