From 345e684adcf9be2c361d616cb9b83f5643988964 Mon Sep 17 00:00:00 2001 From: simon987 Date: Sat, 28 Dec 2019 09:57:43 -0500 Subject: [PATCH] add whash wname option --- benchmark.cpp | 2 +- fastimagehash.cpp | 22 +++++++++++++--------- fastimagehash.h | 10 +++++----- imhash.c | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/benchmark.cpp b/benchmark.cpp index f3e745c..d249155 100644 --- a/benchmark.cpp +++ b/benchmark.cpp @@ -35,7 +35,7 @@ static void BM_whash(benchmark::State &state) { void *buf = load_test_file(&size); for (auto _ : state) { - whash_mem(buf, tmp, size, state.range(), 0); + whash_mem(buf, tmp, size, state.range(), 0, "haar"); } free(buf); diff --git a/fastimagehash.cpp b/fastimagehash.cpp index cb61a35..5d3760b 100644 --- a/fastimagehash.cpp +++ b/fastimagehash.cpp @@ -200,19 +200,19 @@ int dhash_mem(void *buf, uchar *out, size_t buf_len, int hash_size) { return FASTIMAGEHASH_OK; } -int whash_file(const char *filepath, uchar *out, int hash_size, int img_scale) { +int whash_file(const char *filepath, uchar *out, int hash_size, int img_scale, const char* wname) { size_t size; void *buf = load_file_in_mem(filepath, &size); if (buf == nullptr) { return FASTIMAGEHASH_READ_ERR; } - int ret = whash_mem(buf, out, size, hash_size, img_scale); + int ret = whash_mem(buf, out, size, hash_size, img_scale, wname); free(buf); return ret; } -int whash_mem(void *buf, uchar *out, size_t buf_len, const int hash_size, int img_scale) { +int whash_mem(void *buf, uchar *out, size_t buf_len, const int hash_size, int img_scale, const char *wname) { Mat im; try { im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE); @@ -220,6 +220,10 @@ int whash_mem(void *buf, uchar *out, size_t buf_len, const int hash_size, int im return FASTIMAGEHASH_DECODE_ERR; } + if (strcmp(wname, "haar") != 0 && strcmp(wname, "db4") != 0) { + throw std::invalid_argument("wname must be either of 'haar' or 'db4'"); + } + if ((hash_size & (hash_size - 1)) != 0) { throw std::invalid_argument("hash_size must be a power of two"); } @@ -256,7 +260,7 @@ int whash_mem(void *buf, uchar *out, size_t buf_len, const int hash_size, int im data[i] = (double) pixel[i] / 255; } - wave_object w = wave_init("haar"); + wave_object w = wave_init(wname); wt2_object wt = wt2_init(w, "dwt", img_scale, img_scale, dwt_level); double *coeffs = dwt2(wt, data); @@ -362,7 +366,7 @@ void multi_hash_destroy(multi_hash_t *h) { } int multi_hash_file(const char *filepath, multi_hash_t *out, int hash_size, - int ph_highfreq_factor, int wh_img_scale) { + int ph_highfreq_factor, int wh_img_scale, const char* wname) { size_t size; void *buf = load_file_in_mem(filepath, &size); @@ -370,13 +374,14 @@ int multi_hash_file(const char *filepath, multi_hash_t *out, int hash_size, return FASTIMAGEHASH_READ_ERR; } - int ret = multi_hash_mem(buf, out, size, hash_size, ph_highfreq_factor, wh_img_scale); + int ret = multi_hash_mem(buf, out, size, hash_size, ph_highfreq_factor, wh_img_scale, wname); free(buf); return ret; } int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len, - int hash_size, int ph_highfreq_factor, int wh_img_scale) { + int hash_size, int ph_highfreq_factor, int wh_img_scale, + const char*wname) { Mat im; try { im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE); @@ -497,8 +502,7 @@ int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len, pixels[i] = (double) pixel[i] / 255; } - //TODO: haar option - wave_object w = wave_init("haar"); + wave_object w = wave_init(wname); wt2_object wt = wt2_init(w, "dwt", wh_img_scale, wh_img_scale, dwt_level); double *coeffs = dwt2(wt, pixels); diff --git a/fastimagehash.h b/fastimagehash.h index 72bcb93..10df548 100644 --- a/fastimagehash.h +++ b/fastimagehash.h @@ -1,7 +1,7 @@ #ifndef FASTIMAGEHASH_FASTIMAGEHASH_H #define FASTIMAGEHASH_FASTIMAGEHASH_H -#define FASTIMAGEHASH_VERSION "1.0" +#define FASTIMAGEHASH_VERSION "2.0" #include @@ -24,9 +24,9 @@ multi_hash_t *multi_hash_create(int hash_size); void multi_hash_destroy(multi_hash_t *h); -int multi_hash_file(const char *filepath, multi_hash_t *out, int hash_size, int ph_highfreq_factor, int wh_img_scale); +int multi_hash_file(const char *filepath, multi_hash_t *out, int hash_size, int ph_highfreq_factor, int wh_img_scale, const char*wname); -int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len, int hash_size, int ph_highfreq_factor, int wh_img_scale); +int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len, int hash_size, int ph_highfreq_factor, int wh_img_scale, const char* wname); void hash_to_hex_string_reversed(const uchar *h, char *out, int hash_size); @@ -44,9 +44,9 @@ int dhash_file(const char *filepath, uchar *out, int hash_size); int dhash_mem(void *buf, uchar *out, size_t buf_len, int hash_size); -int whash_file(const char *filepath, uchar *out, int hash_size, int img_scale); +int whash_file(const char *filepath, uchar *out, int hash_size, int img_scale, const char* wname); -int whash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int img_scale); +int whash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int img_scale, const char*wname); int phash_file(const char *buf, uchar *out, int hash_size, int highfreq_factor); diff --git a/imhash.c b/imhash.c index c64b916..cabb403 100644 --- a/imhash.c +++ b/imhash.c @@ -51,7 +51,7 @@ int main(int argc, char *argv[]) { } } if (do_whash) { - if (whash_file(argv[i], hash, 8, 0) == 0) { + if (whash_file(argv[i], hash, 8, 0, "haar") == 0) { hash_to_hex_string_reversed(hash, hashstr, 8); printf("%s\tw:%s\n", argv[i], hashstr); }