From 137960a0261245a433f161d8fa4cbb53e4e50e6a Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sat, 27 Aug 2022 22:36:28 -0400 Subject: Fix distance calculation. --- signature.cpp | 93 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 37 deletions(-) (limited to 'signature.cpp') diff --git a/signature.cpp b/signature.cpp index 21de945..cd55a77 100644 --- a/signature.cpp +++ b/signature.cpp @@ -20,17 +20,17 @@ #include "imageutil.hpp" #include "signature.hpp" -signature_config signature::cfg = +static signature_config _default_cfg = { - 9, - 3, - 2, - true, - false, - 0.5, - 1./128, - 0.05, - 0.25 + 9, //slices + 3, //blur_window + 2, //min_window + true, //crop + false, //comp + 0.5, //pr + 1./128,//noise_threshold + 0.05, //contrast_threshold + 0.25 //max_cropping }; class signature_priv @@ -42,6 +42,7 @@ private: compressed_vector ct; std::vector uct; bool compressed; + signature_config cfg; public: float get_light_charistics_cell(int x, int y, int w, int h); void get_light_charistics(); @@ -50,6 +51,7 @@ public: double length() const; double distance(const signature_priv &o) const; bool operator==(const signature_priv &o) const; + void dump() const; friend class signature; friend struct signature_hash; }; @@ -65,12 +67,12 @@ void signature_priv::get_light_charistics() int iw, ih, slc; iw = fimg.size().width; ih = fimg.size().height; - slc = signature::cfg.slices; + slc = cfg.slices; windowx = iw / (double)slc / 2; windowy = ih / (double)slc / 2; - int windows = round(std::min(iw, ih) / slc * signature::cfg.pr); - if (windows < signature::cfg.min_window) - windows = signature::cfg.min_window; + int windows = round(std::min(iw, ih) / slc * cfg.pr); + if (windows < cfg.min_window) + windows = cfg.min_window; double ww = (iw - 1) / (slc + 1.); double wh = (ih - 1) / (slc + 1.); double wxs = 0, wys = 0; @@ -99,7 +101,7 @@ void signature_priv::get_light_variance() { const int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; - int slc = signature::cfg.slices; + int slc = cfg.slices; float *lp = lch.ptr(0); for (int x = 0; x < slc; ++x) { @@ -125,7 +127,7 @@ void signature_priv::get_signature() std::vector darks; for (float &l : lv) { - if (fabsf(l) > signature::cfg.noise_threshold) + if (fabsf(l) > cfg.noise_threshold) { if (l > 0) lights.push_back(l); @@ -135,12 +137,12 @@ void signature_priv::get_signature() } double lth = image_util::median(lights); double dth = image_util::median(darks); - if (signature::cfg.compress) + if (cfg.compress) { compressed = true; for (float &l : lv) { - if (fabsf(l) > signature::cfg.noise_threshold) + if (fabsf(l) > cfg.noise_threshold) { if (l > 0) ct.push_back(l > lth ? 4 : 3); @@ -155,7 +157,7 @@ void signature_priv::get_signature() compressed = false; for (float &l : lv) { - if (fabsf(l) > signature::cfg.noise_threshold) + if (fabsf(l) > cfg.noise_threshold) { if (l > 0) uct.push_back(l > lth ? 4 : 3); @@ -178,9 +180,9 @@ double signature_priv::length() const double signature_priv::distance(const signature_priv &o) const { if (compressed && o.compressed) - return image_util::distance(ct, o.ct); + return image_util::distance(ct, o.ct) / (image_util::length(ct, uint8_t(2)) + image_util::length(o.ct, uint8_t(2))); else - return image_util::distance(uct, o.uct); + return image_util::distance(uct, o.uct) / (image_util::length(uct, uint8_t(2)) + image_util::length(o.uct, uint8_t(2))); } bool signature_priv::operator==(const signature_priv &o) const @@ -191,10 +193,26 @@ bool signature_priv::operator==(const signature_priv &o) const return uct == o.uct; } +void signature_priv::dump() const +{ + if (!compressed) + for (auto &x : this->uct) + printf("%u ", x); + else + for (size_t i = 0; i < this->ct.size(); ++i) + printf("%u ", this->ct.get(i)); + printf("\n"); +} + signature::signature() = default; -signature::signature(signature_priv* _p) : p(_p) {} +signature::signature(signature_priv* _p) : p(_p){} signature::~signature() = default; +void signature::dump() const +{ + if (p) p->dump(); +} + signature signature::clone() const { return signature(*this); @@ -218,21 +236,17 @@ bool signature::operator==(const signature &o) const return *p == *o.p; } -void signature::configure(signature_config _cfg) -{signature::cfg = _cfg;} - -signature_config signature::config() -{return signature::cfg;} - -signature signature::from_preprocessed_matrix(cv::Mat m) +signature signature::from_preprocessed_matrix(cv::Mat m, const signature_config &cfg) { signature_priv *p = new signature_priv; - if (signature::cfg.crop) - p->fimg = image_util::crop(m, signature::cfg.contrast_threshold, signature::cfg.max_cropping); + p->cfg = cfg; + + if (cfg.crop) + p->fimg = image_util::crop(m, cfg.contrast_threshold, cfg.max_cropping); else p->fimg = m; - if (signature::cfg.blur_window > 1) - cv::blur(p->fimg, p->fimg, cv::Size(signature::cfg.blur_window, signature::cfg.blur_window)); + if (cfg.blur_window > 1) + cv::blur(p->fimg, p->fimg, cv::Size(cfg.blur_window, cfg.blur_window)); p->get_light_charistics(); p->get_light_variance(); p->get_signature(); @@ -242,7 +256,7 @@ signature signature::from_preprocessed_matrix(cv::Mat m) return signature(p); } -signature signature::from_cvmatrix(cv::Mat m) +signature signature::from_cvmatrix(cv::Mat m, const signature_config &cfg) { cv::Mat ma, bw; double sc = 1; @@ -258,13 +272,18 @@ signature signature::from_cvmatrix(cv::Mat m) cv::cvtColor(ma, bw, cv::COLOR_RGB2GRAY); else bw = ma; - return signature::from_preprocessed_matrix(bw); + return signature::from_preprocessed_matrix(bw, cfg); } -signature signature::from_file(const char *fn) +signature signature::from_file(const char *fn, const signature_config &cfg) { cv::Mat img = cv::imread(fn, cv::IMREAD_UNCHANGED); - return signature::from_cvmatrix(img); + return signature::from_cvmatrix(img, cfg); +} + +signature_config signature::default_cfg() +{ + return _default_cfg; } size_t signature_hash::operator()(signature const& sig) const noexcept -- cgit v1.2.3