/* // 定位结果共享(暗场相机复用明场相机的定位结果) // 背景:bright/dark 两台相机拍同一产品,暗场图不做定位模型(Align_Outer/Align_Inner/Tag_Loc), // 直接复用明场相机的定位结果(外/内轮廓 roi、标签 roi、bigmask、偏移映射)。 // 约定:复用方(暗场)相机名/通道名把 "dark" 替换为 "bright" 得到提供方(明场)的相机名/通道名, // 同产品内按 (产品ID, 相机名, 通道名) 精确配对。 // 生命周期:产品送图开始时清理(防上一轮的脏数据);产品检测完成时清理(释放内存)。 */ #ifndef AlignShare_H_ #define AlignShare_H_ #include #include #include #include #include #include "AI_Edge_Algin.h" class AlignShare { public: static AlignShare &GetInstance(); // 提供方(明场)定位成功:发布可复用的定位结果 void PublishSuccess(const std::string &strProduct, const std::string &strCamera, const std::string &strChannel, const std::shared_ptr &pResult, const cv::Size &imgSize); // 提供方(明场)定位失败:发布失败标记,让等待方立即走回退逻辑,不必干等超时 void PublishFailed(const std::string &strProduct, const std::string &strCamera, const std::string &strChannel); // 查询(不等待):返回是否已有条目;bSucc 表示条目是成功结果(true)还是失败标记(false) bool TryGet(const std::string &strProduct, const std::string &strCamera, const std::string &strChannel, bool &bSucc, std::shared_ptr &pResult, cv::Size &imgSize); // 产品生命周期清理(送图开始 / 检测完成) void ClearProduct(const std::string &strProduct); private: AlignShare() {} struct AlignShareEntry_ { bool bSucc = false; // 条目是否代表"定位成功" std::shared_ptr pResult; // 定位结果(成功时有效) cv::Size imgSize = cv::Size(0, 0); // 结果对应的原图尺寸 }; std::string MakeKey(const std::string &strProduct, const std::string &strCamera, const std::string &strChannel); std::map m_mapShare; // key: 产品ID|相机名|通道名 std::mutex m_mtx; }; #endif