#pragma once #include #include #include #include #include #include #include "face/face_result.h" #include "utils/simple_json.h" namespace rk3588 { struct FaceRecogDebugConfig { bool enabled = false; bool log_matches = false; int min_log_interval_ms = 2000; }; inline FaceRecogDebugConfig ParseFaceRecogDebugConfig( const SimpleJson& cfg, const FaceRecogDebugConfig& base = {}) { FaceRecogDebugConfig out = base; const SimpleJson* debug = cfg.Find("debug"); if (!debug || !debug->IsObject()) return out; out.enabled = debug->ValueOr("enabled", out.enabled); out.log_matches = debug->ValueOr("log_matches", out.log_matches); out.min_log_interval_ms = std::max(0, debug->ValueOr("min_log_interval_ms", out.min_log_interval_ms)); return out; } inline std::string BuildFaceRecogDebugSummaryLine( const std::string& node_id, uint64_t frame_id, const FaceRecogItem& item) { const float sim_margin = item.best_sim - item.second_sim; const std::string candidate = item.candidate_name.empty() ? "n/a" : item.candidate_name; const std::string status = item.unknown ? "unknown" : "known"; std::ostringstream oss; oss << "[ai_face_recog] match" << " id=" << node_id << " frame=" << frame_id << " status=" << status << " candidate=" << candidate << " candidate_id=" << item.candidate_person_id << " best_sim=" << std::fixed << std::setprecision(2) << item.best_sim << " second_sim=" << std::fixed << std::setprecision(2) << item.second_sim << " sim_margin=" << std::fixed << std::setprecision(2) << sim_margin << " bbox=(" << static_cast(std::lround(item.bbox.x)) << "," << static_cast(std::lround(item.bbox.y)) << "," << static_cast(std::lround(item.bbox.w)) << "," << static_cast(std::lround(item.bbox.h)) << ")"; return oss.str(); } } // namespace rk3588