1 #include <stdio.h>
2 #include <stdint.h>
3 #include "math.h"
4 #include "pHash.h"
5
6 using namespace cimg_library;
7
8
sort_names(char ** names,int L1)9 void sort_names(char **names, int L1){
10
11 for (int i=0;i<L1;i++){
12 int min = i;
13 for (int j=i+1;j<L1;j++){
14 if (strcmp(names[j], names[min]) <= 0)
15 min = j;
16 }
17 if (i != min){
18 char *swap = names[i];
19 names[i] = names[min];
20 names[min] = swap;
21 }
22
23 }
24
25 }
26
main(int argc,char ** argv)27 int main(int argc, char **argv){
28
29 if (argc < 3){
30 printf(" not enough input args\n");
31 exit(1);
32 }
33
34 const char *dirname1 = argv[1];
35 const char *dirname2 = argv[2];
36
37 int alpha = 2;
38 int level = 1;
39
40 int nbfiles1;
41 char **files1 = ph_readfilenames(dirname1, nbfiles1);
42 sort_names(files1,nbfiles1);
43
44 int nbfiles2;
45 char **files2 = ph_readfilenames(dirname2, nbfiles2);
46 sort_names(files2,nbfiles2);
47
48 if (nbfiles1 != nbfiles2){
49 printf("number files in both directories not equal\n");
50 exit(1);
51 }
52
53 uint8_t **hash1 = (uint8_t**)malloc(nbfiles1*sizeof(uint8_t*));
54 uint8_t *hash2 = NULL;
55 int hashlen1=0, hashlen2=0;
56 double dist = 0;
57 printf("intra distances\n");
58 printf("***************\n");
59 for (int i=0;i<nbfiles1;i++){
60 printf("file1: %s\n", files1[i]);
61 hash1[i] = ph_mh_imagehash(files1[i], hashlen1, alpha, level);
62 if (hash1 == NULL)
63 continue;
64 printf("file2: %s\n", files2[i]);
65 hash2 = ph_mh_imagehash(files2[i], hashlen2, alpha, level);
66 if (hash2 == NULL)
67 continue;
68
69 dist = ph_hammingdistance2(hash1[i], hashlen1, hash2, hashlen2);
70 printf("distance = %f\n", dist);
71 printf("-------------\n");
72 free(hash2);
73 }
74 printf("\n\n");
75 printf("--hit any key--\n");
76 getchar();
77 printf("inter distances\n");
78 for (int i=0;i<nbfiles1;i++){
79 for (int j=i+1;j<nbfiles1;j++){
80 dist = ph_hammingdistance2(hash1[i], hashlen1, hash1[j], hashlen1);
81 printf(" %d %d dist = %f\n", i, j, dist);
82 printf("----------------\n");
83 }
84 }
85 printf("done\n");
86
87 for(int i = 0; i < nbfiles1; ++i)
88 {
89 free(files1[i]);
90 free(files2[i]);
91 free(hash1[i]);
92 }
93 free(files1);
94 free(files2);
95 free(hash1);
96 return 0;
97 }
98