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