Files
bytetrack-counter-cpp/src/config.cpp
T
2026-07-06 03:17:44 +07:00

129 lines
5.2 KiB
C++

#include "config.hpp"
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iostream>
AppConfig g_config;
static std::string trim(const std::string& s) {
auto start = s.find_first_not_of(" \t\r\n");
if (start == std::string::npos) return {};
auto end = s.find_last_not_of(" \t\r\n");
return s.substr(start, end - start + 1);
}
static std::string get_env(const std::string& key, const std::string& def = "") {
const char* val = std::getenv(key.c_str());
return val ? std::string(val) : def;
}
void AppConfig::load_from_env(const char* env_path) {
std::string path = ".env";
if (env_path) path = env_path;
// also check env path
const char* env_file = std::getenv("ENV_FILE");
if (env_file) path = env_file;
std::ifstream file(path);
if (file.is_open()) {
std::string line;
while (std::getline(file, line)) {
line = trim(line);
if (line.empty() || line[0] == '#') continue;
auto eq = line.find('=');
if (eq == std::string::npos) continue;
std::string key = trim(line.substr(0, eq));
std::string val = trim(line.substr(eq + 1));
// strip quotes
if (val.size() >= 2 && val.front() == '"' && val.back() == '"')
val = val.substr(1, val.size() - 2);
setenv(key.c_str(), val.c_str(), 1);
}
}
output_dir = get_env("OUTPUT_DIR", output_dir);
db_path = get_env("DB_PATH", output_dir + "/bytetrack_counter.db");
state_file = get_env("STATE_FILE", output_dir + "/current_batch.json");
source = get_env("SOURCE", source);
model_path = get_env("MODEL_PATH", model_path);
camera_name = get_env("CAMERA_NAME", camera_name);
object_label = get_env("OBJECT_LABEL", object_label);
class_ayam = get_env("CLASS_AYAM", class_ayam);
class_talenan = get_env("CLASS_TALENAN", class_talenan);
auto lx = get_env("LINE_X");
if (!lx.empty()) line_x = std::stoi(lx);
auto lxf = get_env("LINE_X_FRAC");
if (!lxf.empty()) line_x_frac = std::stof(lxf);
cross_direction = get_env("CROSS_DIRECTION", cross_direction);
auto imgsz_s = get_env("IMGSZ");
if (!imgsz_s.empty()) imgsz = std::stoi(imgsz_s);
auto half_s = get_env("HALF");
half = (half_s == "true");
auto conf_s = get_env("CONF");
if (!conf_s.empty()) conf = std::stof(conf_s);
auto dev_s = get_env("DEVICE");
if (!dev_s.empty()) device = std::stoi(dev_s);
auto cm_s = get_env("CORE_MASK");
if (!cm_s.empty()) core_mask = std::stoi(cm_s);
auto nc_s = get_env("NUM_CLASSES");
if (!nc_s.empty()) num_classes = std::stoi(nc_s);
auto ss_s = get_env("SCORE_SIGMOID");
score_sigmoid = (ss_s == "true");
auto th_s = get_env("TRACK_HIGH_THRESH");
if (!th_s.empty()) track_high_thresh = std::stof(th_s);
auto tl_s = get_env("TRACK_LOW_THRESH");
if (!tl_s.empty()) track_low_thresh = std::stof(tl_s);
auto tm_s = get_env("TRACK_MATCH_THRESH");
if (!tm_s.empty()) track_match_thresh = std::stof(tm_s);
auto tb_s = get_env("TRACK_BUFFER");
if (!tb_s.empty()) track_buffer = std::stoi(tb_s);
auto tmh_s = get_env("TRACK_MIN_HITS");
if (!tmh_s.empty()) track_min_hits = std::stoi(tmh_s);
daily_cutoff_time = get_env("DAILY_CUTOFF_TIME", daily_cutoff_time);
auto bto_s = get_env("BATCH_TIMEOUT_SECONDS");
if (!bto_s.empty()) batch_timeout_seconds = std::stof(bto_s);
auto ibl_s = get_env("IGNORE_BATCH_LABEL_TIMEOUT_SECONDS");
if (!ibl_s.empty()) ignore_batch_label_timeout = std::stof(ibl_s);
auto mob_s = get_env("MIN_OBJECT_PER_BATCH");
if (!mob_s.empty()) min_object_per_batch = std::stoi(mob_s);
auto mdb_s = get_env("MIN_DURATION_PER_BATCH");
if (!mdb_s.empty()) min_duration_per_batch = std::stoi(mdb_s);
auto ecsv = get_env("EXPORT_CSV");
if (!ecsv.empty()) export_csv = (ecsv == "true");
cross_csv = get_env("CROSS_CSV", output_dir + "/batch_crossings.csv");
auto wf_s = get_env("WARMUP_FRAMES");
if (!wf_s.empty()) warmup_frames = std::stoi(wf_s);
auto rd_s = get_env("RECONNECT_DELAY_SEC");
if (!rd_s.empty()) reconnect_delay_sec = std::stoi(rd_s);
auto mra_s = get_env("MAX_RECONNECT_ATTEMPTS");
if (!mra_s.empty()) max_reconnect_attempts = std::stoi(mra_s);
auto fl_s = get_env("FLUSH_EVERY_N_FRAMES");
if (!fl_s.empty()) flush_every_n_frames = std::stoi(fl_s);
auto tp_s = get_env("TRACKED_PRUNE_SEC");
if (!tp_s.empty()) tracked_prune_sec = std::stoi(tp_s);
auto rv_s = get_env("RECORD_VIDEO");
record_video = (rv_s == "true");
auto vs_s = get_env("VIDEO_SEGMENT_SEC");
if (!vs_s.empty()) video_segment_sec = std::stoi(vs_s);
auto ofps_s = get_env("OUTPUT_FPS");
if (!ofps_s.empty()) output_fps = std::stoi(ofps_s);
auto lse_s = get_env("LIVE_STREAM_ENABLED");
live_stream_enabled = (lse_s == "true");
live_stream_frame_path = get_env("LIVE_STREAM_FRAME_PATH", live_stream_frame_path);
auto lsq_s = get_env("LIVE_STREAM_QUALITY");
if (!lsq_s.empty()) live_stream_quality = std::stoi(lsq_s);
auto lsn_s = get_env("LIVE_STREAM_EVERY_N");
if (!lsn_s.empty()) live_stream_every_n = std::stoi(lsn_s);
rtsp_ffmpeg_options = get_env("OPENCV_FFMPEG_CAPTURE_OPTIONS", rtsp_ffmpeg_options);
}