aboutsummaryrefslogtreecommitdiff
path: root/qdeduper/sigdb_qt.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-19 02:39:03 -0400
committerGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-19 02:39:03 -0400
commit41e9051f2d809c42c3dfecc2eb11ad544cbd27b7 (patch)
treee370e08b0e0a45c6eef38704aa2f2b2b0e6d8033 /qdeduper/sigdb_qt.cpp
parent4b8d314f575d9e893d8dda7431194f8b470fc888 (diff)
downloaddeduper-41e9051f2d809c42c3dfecc2eb11ad544cbd27b7.tar.xz
You break it, you fix it!
The GUI is now working again, with scanning built-in.
Diffstat (limited to 'qdeduper/sigdb_qt.cpp')
-rw-r--r--qdeduper/sigdb_qt.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/qdeduper/sigdb_qt.cpp b/qdeduper/sigdb_qt.cpp
new file mode 100644
index 0000000..ab6a9f9
--- /dev/null
+++ b/qdeduper/sigdb_qt.cpp
@@ -0,0 +1,122 @@
+#include "sigdb_qt.hpp"
+#include "signature_db.hpp"
+
+#include <algorithm>
+
+signature_config cfg_full =
+{
+ 9, //slices
+ 3, //blur_window
+ 2, //min_window
+ true, //crop
+ true, //comp
+ 0.5, //pr
+ 1./128, //noise_threshold
+ 0.05, //contrast_threshold
+ 0.25 //max_cropping
+};
+
+signature_config cfg_subslice =
+{
+ 4, //slices
+ 16, //blur_window
+ 2, //min_window
+ false, //crop
+ true, //comp
+ 0.5, //pr
+ 1./64, //noise_threshold
+ 0.05, //contrast_threshold
+ 0.25 //max_cropping
+};
+
+SignatureDB::SignatureDB() : QObject(nullptr)
+{
+ sdb = new signature_db();
+}
+
+SignatureDB::SignatureDB(const fs::path &dbpath) : QObject(nullptr)
+{
+ sdb = new signature_db(dbpath);
+}
+
+SignatureDB::~SignatureDB()
+{
+ delete sdb;
+}
+
+void SignatureDB::scan_files(const std::vector<fs::path> &files, int njobs)
+{
+ populate_cfg_t pcfg = {
+ 3,
+ 3,
+ cfg_full,
+ cfg_subslice,
+ 0.3,
+ [this](size_t c,int){Q_EMIT image_scanned(c);},
+ njobs
+ };
+ sdb->populate(files, pcfg);
+
+ Q_EMIT image_scanned(~size_t(0));
+
+ auto ids = sdb->get_image_ids();
+ sdb->batch_get_signature_begin();
+ for (auto &id : ids)
+ {
+ fs::path p;
+ std::tie(p, std::ignore) = sdb->get_signature(id);
+ fmap[id] = p;
+ frmap[p] = id;
+ }
+ sdb->batch_get_signature_end();
+
+ auto dupes = sdb->dupe_pairs();
+ for (auto &dupe : dupes)
+ distmap[std::make_pair(dupe.id1, dupe.id2)] = dupe.distance;
+
+ sdb->group_similar();
+ auto gps = sdb->groups_get();
+ gps.erase(std::remove_if(gps.begin(), gps.end(), [](std::vector<size_t> v){ return v.size() < 2; }), gps.end());
+ this->groups = std::move(gps);
+}
+
+size_t SignatureDB::num_groups()
+{
+ return groups.size();
+}
+
+std::vector<size_t> SignatureDB::get_group(size_t gid)
+{
+ if (gid >= groups.size()) return {};
+ return groups[gid];
+}
+
+std::map<std::pair<size_t, size_t>, double> SignatureDB::group_distances(size_t gid)
+{
+ std::map<std::pair<size_t, size_t>, double> ret;
+ auto g = get_group(gid);
+ for (size_t i = 0; i < g.size(); ++i)
+ for (size_t j = i + 1; j < g.size(); ++j)
+ {
+ size_t x = g[i], y = g[j];
+ if (distmap.find(std::make_pair(x, y)) != distmap.end())
+ ret[std::make_pair(i, j)] = distmap[std::make_pair(x, y)];
+ else if (distmap.find(std::make_pair(y, x)) != distmap.end())
+ ret[std::make_pair(j, i)] = distmap[std::make_pair(x, y)];
+ }
+ return ret;
+}
+
+fs::path SignatureDB::get_image_path(size_t id)
+{
+ if (fmap.find(id) == fmap.end())
+ return fs::path();
+ else return fmap[id];
+}
+
+size_t SignatureDB::get_path_id(const fs::path& p)
+{
+ if (frmap.find(p) == frmap.end())
+ return ~size_t(0);
+ else return frmap[p];
+}