aboutsummaryrefslogtreecommitdiff
path: root/signature.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-11 01:39:29 -0400
committerGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-11 01:39:29 -0400
commitc41768dbbd50a0055298d5ec6318ae7f1d2e4ab3 (patch)
tree4fe4ec18a65424998c33c6654456b2551996ae39 /signature.cpp
parentfd2773c2407aa475ba8aa4c8a72c91b83fd99c42 (diff)
downloaddeduper-c41768dbbd50a0055298d5ec6318ae7f1d2e4ab3.tar.xz
New testdrive using sqlite db as data storage.
Add signature serialization & deserialization. Only link what we need from OpenCV.
Diffstat (limited to 'signature.cpp')
-rw-r--r--signature.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/signature.cpp b/signature.cpp
index fb4e8a3..74c7590 100644
--- a/signature.cpp
+++ b/signature.cpp
@@ -239,6 +239,32 @@ bool signature::operator==(const signature &o) const
return *p == *o.p;
}
+std::string signature::to_string() const
+{
+ if (!p || !p->compressed) return std::string();
+ Base64Encoder enc;
+ size_t sz = p->ct.size();
+ enc.encode_data(&p->cfg, sizeof(signature_config));
+ enc.encode_data(&sz, sizeof(size_t));
+ enc.encode_data(p->ct.internal_data(), p->ct.internal_container_size() * 8);
+ return enc.finalize();
+}
+
+signature signature::from_string(std::string &&s)
+{
+ signature_priv *p = new signature_priv;
+ Base64Decoder dec(std::move(s));
+ size_t sz;
+ p->compressed = true;
+ size_t s1 = dec.decode_data(&p->cfg, sizeof(signature_config));
+ size_t s2 = dec.decode_data(&sz, sizeof(size_t));
+ size_t s3 = dec.decoded_length() - s1 - s2;
+ p->ct.internal_set_size(sz);
+ p->ct.internal_container_resize(s3 / 8);
+ dec.decode_data(p->ct.internal_data(), s3);
+ return signature(p);
+}
+
signature signature::from_preprocessed_matrix(cv::Mat *m, const signature_config &cfg)
{
signature_priv *p = new signature_priv;