Browse Source

* add search directly by file

master
Alex 'AdUser' Z 8 years ago
parent
commit
da3b1e6346
  1. 68
      src/simdb-tool.c

68
src/simdb-tool.c

@ -36,7 +36,8 @@ void usage(int exitcode) {
" -D <num> Delete record <num>\n" " -D <num> Delete record <num>\n"
" -F <a>,<b> Show difference bitmap for this samples\n" " -F <a>,<b> Show difference bitmap for this samples\n"
" -I Create database (init)\n" " -I Create database (init)\n"
" -S <num> Search for images similar ot this sample\n" " -N <num> Compare this sample to other images in database\n"
" -S <path> Search for images similar to this image\n"
" -U <num> Show db usage map, <num> entries per column\n" " -U <num> Show db usage map, <num> entries per column\n"
" Special case - 0, output will be single line\n" " Special case - 0, output will be single line\n"
" -W <a>,<b> Show usage map starting from <a>, but no more\n" " -W <a>,<b> Show usage map starting from <a>, but no more\n"
@ -70,8 +71,20 @@ bitmap_print(const char *map, size_t side) {
} }
} }
int search_similar(simdb_t *db, int num, float maxdiff) { static void
int ret = 0, i = 0; print_search_results(simdb_search_t *search) {
assert(search != NULL);
for (int i = 0; i < search->found; i++) {
printf("%d -- %.1f (bitmap), %.1f (ratio)\n",
search->matches[i].num,
search->matches[i].diff_bitmap * 100,
search->matches[i].diff_ratio * 100);
}
}
int search_similar_file(simdb_t *db, float maxdiff, char *path) {
int ret = 0;
simdb_search_t search; simdb_search_t search;
memset(&search, 0x0, sizeof(simdb_search_t)); memset(&search, 0x0, sizeof(simdb_search_t));
@ -79,18 +92,35 @@ int search_similar(simdb_t *db, int num, float maxdiff) {
search.maxdiff_ratio = 0.2; /* 20% */ search.maxdiff_ratio = 0.2; /* 20% */
search.maxdiff_bitmap = maxdiff; search.maxdiff_bitmap = maxdiff;
if ((ret = simdb_search_byid(db, &search, num)) < 0) { if ((ret = simdb_search_file(db, &search, path)) < 0) {
fprintf(stderr, "%s\n", simdb_error(ret)); fprintf(stderr, "%s\n", simdb_error(ret));
return 1; return 1;
} }
for (i = 0; i < search.found; i++) { print_search_results(&search);
printf("%d -- %.1f (bitmap), %.1f (ratio)\n",
search.matches[i].num, if (search.found > 0)
search.matches[i].diff_bitmap * 100, FREE(search.matches);
search.matches[i].diff_ratio * 100);
return 0;
}
int search_similar_byid(simdb_t *db, float maxdiff, int num) {
int ret = 0;
simdb_search_t search;
memset(&search, 0x0, sizeof(simdb_search_t));
search.maxdiff_ratio = 0.2; /* 20% */
search.maxdiff_bitmap = maxdiff;
if ((ret = simdb_search_byid(db, &search, num)) < 0) {
fprintf(stderr, "%s\n", simdb_error(ret));
return 1;
} }
print_search_results(&search);
if (search.found > 0) if (search.found > 0)
FREE(search.matches); FREE(search.matches);
@ -223,7 +253,8 @@ int rec_diff(simdb_t *db, int a, int b, bool show_map) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
simdb_t *db = NULL; simdb_t *db = NULL;
enum { undef = 0, add, del, init, search, bitmap, usage_map, usage_slice, diff } mode = undef; enum { undef = 0, add, del, init, search_byid, search_file,
bitmap, usage_map, usage_slice, diff } mode = undef;
char *db_path = NULL, *sample = NULL, *c = NULL, opt = '\0'; char *db_path = NULL, *sample = NULL, *c = NULL, opt = '\0';
int cols = 64, a = 0, b = 0, ret = 0, db_flags = 0; int cols = 64, a = 0, b = 0, ret = 0, db_flags = 0;
bool show_map = false, need_write = false; bool show_map = false, need_write = false;
@ -232,7 +263,7 @@ int main(int argc, char **argv) {
if (argc < 3) if (argc < 3)
usage(EXIT_FAILURE); usage(EXIT_FAILURE);
while ((opt = getopt(argc, argv, "b:t:A:B:C:D:F:IS:U:W:")) != -1) { while ((opt = getopt(argc, argv, "b:t:A:B:C:D:F:IN:S:U:W:")) != -1) {
switch (opt) { switch (opt) {
case 'b' : case 'b' :
db_path = optarg; db_path = optarg;
@ -274,10 +305,14 @@ int main(int argc, char **argv) {
a = atoll(optarg); a = atoll(optarg);
b = atoll(c + 1); b = atoll(c + 1);
break; break;
case 'S' : case 'N' :
mode = search; mode = search_byid;
a = atoll(optarg); a = atoll(optarg);
break; break;
case 'S' :
mode = search_file;
sample = optarg;
break;
case 'U' : case 'U' :
mode = usage_map; mode = usage_map;
cols = atoi(optarg); cols = atoi(optarg);
@ -337,12 +372,15 @@ int main(int argc, char **argv) {
case init : case init :
/* this case already handled above */ /* this case already handled above */
break; break;
case search : case search_byid :
if (a <= 0) { if (a <= 0) {
fprintf(stderr, "can't parse number\n"); fprintf(stderr, "can't parse number\n");
usage(EXIT_FAILURE); usage(EXIT_FAILURE);
} }
ret = search_similar(db, a, maxdiff); ret = search_similar_byid(db, maxdiff, a);
break;
case search_file :
ret = search_similar_file(db, maxdiff, sample);
break; break;
case bitmap : case bitmap :
if (a <= 0) { if (a <= 0) {

Loading…
Cancel
Save