mirror of
https://github.com/simon987/fastimagehash.git
synced 2025-04-10 14:16:49 +00:00
better error codes
This commit is contained in:
parent
d44da6bf34
commit
17106c1d4a
@ -8,6 +8,11 @@
|
|||||||
`libfastimagehash` is a [imagehash](https://github.com/JohannesBuchner/imagehash/)
|
`libfastimagehash` is a [imagehash](https://github.com/JohannesBuchner/imagehash/)
|
||||||
replacement for C/C++.
|
replacement for C/C++.
|
||||||
|
|
||||||
|
**See also:**
|
||||||
|
|
||||||
|
* [go bindings](https://github.com/simon987/fastimagehash-go)
|
||||||
|
(with *cgo*).
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="bench/results/phash_large.png"/>
|
<img src="bench/results/phash_large.png"/>
|
||||||
|
@ -13,8 +13,9 @@
|
|||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
//TODO: better err codes
|
#define FASTIMAGEHASH_OK 0
|
||||||
#define FASTIMAGEHASH_ERR -1
|
#define FASTIMAGEHASH_READ_ERR -2
|
||||||
|
#define FASTIMAGEHASH_DECODE_ERR -3
|
||||||
|
|
||||||
__always_inline
|
__always_inline
|
||||||
double median(double *arr, size_t len) {
|
double median(double *arr, size_t len) {
|
||||||
@ -90,7 +91,7 @@ int ahash_file(const char *filepath, uchar *out, int hash_size) {
|
|||||||
void *buf = load_file_in_mem(filepath, &size);
|
void *buf = load_file_in_mem(filepath, &size);
|
||||||
|
|
||||||
if (buf == nullptr) {
|
if (buf == nullptr) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_READ_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = ahash_mem(buf, out, size, hash_size);
|
int ret = ahash_mem(buf, out, size, hash_size);
|
||||||
@ -104,7 +105,7 @@ int ahash_mem(void *buf, uchar *out, size_t buf_len, int hash_size) {
|
|||||||
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
||||||
resize(im, im, Size(hash_size, hash_size), 0, 0, INTER_AREA);
|
resize(im, im, Size(hash_size, hash_size), 0, 0, INTER_AREA);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
double avg = mean(im).val[0];
|
double avg = mean(im).val[0];
|
||||||
@ -114,14 +115,14 @@ int ahash_mem(void *buf, uchar *out, size_t buf_len, int hash_size) {
|
|||||||
for (int i = 0; i < endPixel; i++) {
|
for (int i = 0; i < endPixel; i++) {
|
||||||
set_bit_at(out, i, pixel[i] > avg);
|
set_bit_at(out, i, pixel[i] > avg);
|
||||||
}
|
}
|
||||||
return 0;
|
return FASTIMAGEHASH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dhash_file(const char *filepath, uchar *out, int hash_size) {
|
int dhash_file(const char *filepath, uchar *out, int hash_size) {
|
||||||
size_t size;
|
size_t size;
|
||||||
void *buf = load_file_in_mem(filepath, &size);
|
void *buf = load_file_in_mem(filepath, &size);
|
||||||
if (buf == nullptr) {
|
if (buf == nullptr) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_READ_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = dhash_mem(buf, out, size, hash_size);
|
int ret = dhash_mem(buf, out, size, hash_size);
|
||||||
@ -135,7 +136,7 @@ int dhash_mem(void *buf, uchar *out, size_t buf_len, int hash_size) {
|
|||||||
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
||||||
resize(im, im, Size(hash_size + 1, hash_size), 0, 0, INTER_AREA);
|
resize(im, im, Size(hash_size + 1, hash_size), 0, 0, INTER_AREA);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
@ -146,14 +147,14 @@ int dhash_mem(void *buf, uchar *out, size_t buf_len, int hash_size) {
|
|||||||
set_bit_at(out, offset++, pixel[j] > pixel[j - 1]);
|
set_bit_at(out, offset++, pixel[j] > pixel[j - 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
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) {
|
||||||
size_t size;
|
size_t size;
|
||||||
void *buf = load_file_in_mem(filepath, &size);
|
void *buf = load_file_in_mem(filepath, &size);
|
||||||
if (buf == nullptr) {
|
if (buf == nullptr) {
|
||||||
return FASTIMAGEHASH_ERR;
|
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);
|
||||||
@ -166,7 +167,7 @@ int whash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int img_scal
|
|||||||
try {
|
try {
|
||||||
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hash_size & (hash_size - 1)) != 0) {
|
if ((hash_size & (hash_size - 1)) != 0) {
|
||||||
@ -194,7 +195,7 @@ int whash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int img_scal
|
|||||||
try {
|
try {
|
||||||
resize(im, im, Size(img_scale, img_scale), 0, 0, INTER_AREA);
|
resize(im, im, Size(img_scale, img_scale), 0, 0, INTER_AREA);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto data = (double *) malloc(img_scale * img_scale * sizeof(double));
|
auto data = (double *) malloc(img_scale * img_scale * sizeof(double));
|
||||||
@ -225,7 +226,7 @@ int whash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int img_scal
|
|||||||
wave_free(w);
|
wave_free(w);
|
||||||
free(coeffs);
|
free(coeffs);
|
||||||
|
|
||||||
return 0;
|
return FASTIMAGEHASH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int phash_file(const char *filepath, uchar *out, int hash_size, int highfreq_factor) {
|
int phash_file(const char *filepath, uchar *out, int hash_size, int highfreq_factor) {
|
||||||
@ -233,7 +234,7 @@ int phash_file(const char *filepath, uchar *out, int hash_size, int highfreq_fac
|
|||||||
void *buf = load_file_in_mem(filepath, &size);
|
void *buf = load_file_in_mem(filepath, &size);
|
||||||
|
|
||||||
if (buf == nullptr) {
|
if (buf == nullptr) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_READ_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = phash_mem(buf, out, size, hash_size, highfreq_factor);
|
int ret = phash_mem(buf, out, size, hash_size, highfreq_factor);
|
||||||
@ -249,7 +250,7 @@ int phash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int highfreq
|
|||||||
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
||||||
resize(im, im, Size(img_size, img_size), 0, 0, INTER_AREA);
|
resize(im, im, Size(img_size, img_size), 0, 0, INTER_AREA);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
double pixels[img_size * img_size];
|
double pixels[img_size * img_size];
|
||||||
@ -290,7 +291,7 @@ int phash_mem(void *buf, uchar *out, size_t buf_len, int hash_size, int highfreq
|
|||||||
for (int i = 0; i < hash_size * hash_size; ++i) {
|
for (int i = 0; i < hash_size * hash_size; ++i) {
|
||||||
set_bit_at(out, i, dct_lowfreq[i] > med);
|
set_bit_at(out, i, dct_lowfreq[i] > med);
|
||||||
}
|
}
|
||||||
return 0;
|
return FASTIMAGEHASH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
multi_hash_t *multi_hash_create(int hash_size) {
|
multi_hash_t *multi_hash_create(int hash_size) {
|
||||||
@ -316,7 +317,7 @@ int multi_hash_file(const char *filepath, multi_hash_t *out, int hash_size,
|
|||||||
void *buf = load_file_in_mem(filepath, &size);
|
void *buf = load_file_in_mem(filepath, &size);
|
||||||
|
|
||||||
if (buf == nullptr) {
|
if (buf == nullptr) {
|
||||||
return FASTIMAGEHASH_ERR;
|
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);
|
||||||
@ -330,7 +331,7 @@ int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len,
|
|||||||
try {
|
try {
|
||||||
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
im = imdecode(Mat(1, buf_len, CV_8UC1, buf), IMREAD_GRAYSCALE);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mat ahash_im;
|
Mat ahash_im;
|
||||||
@ -370,7 +371,7 @@ int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len,
|
|||||||
resize(im, whash_im, Size(wh_img_scale, wh_img_scale), 0, 0, INTER_AREA);
|
resize(im, whash_im, Size(wh_img_scale, wh_img_scale), 0, 0, INTER_AREA);
|
||||||
resize(im, phash_im, Size(ph_img_scale, ph_img_scale), 0, 0, INTER_AREA);
|
resize(im, phash_im, Size(ph_img_scale, ph_img_scale), 0, 0, INTER_AREA);
|
||||||
} catch (Exception &e) {
|
} catch (Exception &e) {
|
||||||
return FASTIMAGEHASH_ERR;
|
return FASTIMAGEHASH_DECODE_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pixels = new double[MAX(ph_img_scale, wh_img_scale) * MAX(ph_img_scale, wh_img_scale)];
|
auto pixels = new double[MAX(ph_img_scale, wh_img_scale) * MAX(ph_img_scale, wh_img_scale)];
|
||||||
@ -457,5 +458,5 @@ int multi_hash_mem(void *buf, multi_hash_t *out, size_t buf_len,
|
|||||||
wave_free(w);
|
wave_free(w);
|
||||||
free(coeffs);
|
free(coeffs);
|
||||||
delete[] pixels;
|
delete[] pixels;
|
||||||
return 0;
|
return FASTIMAGEHASH_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user