From cd97a70e0b35b34425427a4f5ea936d0a8a889e2 Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Fri, 11 Nov 2022 01:50:14 +0100 Subject: [PATCH] hashmap and serialization not sure about the messagepack format, but its fine for now. --- Cargo.lock | 36 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/main.rs | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37c31dd..0effe9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,6 +235,8 @@ name = "image-similarity" version = "0.1.0" dependencies = [ "image", + "rmp-serde", + "serde", ] [[package]] @@ -368,6 +370,12 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +[[package]] +name = "paste" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" + [[package]] name = "pin-project" version = "1.0.12" @@ -442,6 +450,28 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rmp" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b13be192e0220b8afb7222aa5813cb62cc269ebb5cac346ca6487681d2913e" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "scoped_threadpool" version = "0.1.9" @@ -454,6 +484,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "serde" +version = "1.0.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" + [[package]] name = "smallvec" version = "1.10.0" diff --git a/Cargo.toml b/Cargo.toml index 3c75bb1..05b1879 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" [dependencies] image = "0.24.4" +serde = "1.0.147" +rmp-serde = "1.1.1" diff --git a/src/main.rs b/src/main.rs index 168efd9..1cb7c53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,36 @@ use descriptors::{Descriptor, Median}; +use std::collections::HashMap; +use std::fs; pub mod descriptors; fn main() { + //Init all descriptors: let desc = Median; - let img0 = image::open("img/meowl.jpg").unwrap(); - let img1 = image::open("img/nyameowl.jpg").unwrap(); - let img2 = image::open("img/armmeowl.jpg").unwrap(); - let img0_phash = desc.describe(img0); - let img1_phash = desc.describe(img1); - let img2_phash = desc.describe(img2); - println!("{:#x}", img0_phash); - println!("{:#x}", img1_phash); - println!("{:#x}", img2_phash); - println!("meowl and armmeowl are {} different", desc.distance(img0_phash, img2_phash)); + + //Pre-allocate hashmap to right size: + let count = fs::read_dir("img").unwrap().count(); + let mut map: HashMap = HashMap::with_capacity(count); + + //Calculate phashes for all images + for node in fs::read_dir("img").unwrap() { + let file = node.expect("Error walking directory"); + let img = image::open(file.path()).expect("Unable to open file"); + let phash = desc.describe(img); + let name = file.file_name().into_string().expect("Issue with filename"); + map.insert(name, phash); + } + + for (key, val) in map.iter() { + println!("{key}: {val}"); + } + + //Test (de)serialize to vector with MessagePack: + let serialized: Vec = rmp_serde::to_vec(&map).unwrap(); + + let x: HashMap = rmp_serde::from_slice(&serialized).unwrap(); + + for (key, val) in x.iter() { + println!("{key}: {val}"); + } }