diff options
author | Chris Xiong <chirs241097@gmail.com> | 2022-09-19 02:39:03 -0400 |
---|---|---|
committer | Chris Xiong <chirs241097@gmail.com> | 2022-09-19 02:39:03 -0400 |
commit | 41e9051f2d809c42c3dfecc2eb11ad544cbd27b7 (patch) | |
tree | e370e08b0e0a45c6eef38704aa2f2b2b0e6d8033 /qdeduper/sigdb_qt.cpp | |
parent | 4b8d314f575d9e893d8dda7431194f8b470fc888 (diff) | |
download | deduper-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.cpp | 122 |
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]; +} |