aboutsummaryrefslogtreecommitdiff
path: root/signature.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2022-08-27 22:36:28 -0400
committerGravatar Chris Xiong <chirs241097@gmail.com> 2022-08-27 22:36:28 -0400
commit137960a0261245a433f161d8fa4cbb53e4e50e6a (patch)
treeb6e124f744a5db48c5741ee0663fcf90faa0eccb /signature.cpp
parent96fc17b99d56eb636c894c5be9ab39bfdb4ba454 (diff)
downloaddeduper-137960a0261245a433f161d8fa4cbb53e4e50e6a.tar.xz
Fix distance calculation.
Diffstat (limited to 'signature.cpp')
-rw-r--r--signature.cpp93
1 files changed, 56 insertions, 37 deletions
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<uint8_t, 3> ct;
std::vector<uint8_t> 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<float>(0);
for (int x = 0; x < slc; ++x)
{
@@ -125,7 +127,7 @@ void signature_priv::get_signature()
std::vector<double> 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