You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.0 KiB
2.0 KiB
Library usage
Database know nothing about location of the source images, records addressed only by some numeric id.
Example usage:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <simdb.h>
int main() {
simdb_t *sdb = NULL;
simdb_search_t search;
simdb_match_t *match = NULL;
const char *path = "/tmp/test.sdb";
const char *files[] = {
"/path/to/file/a.jpg",
"/path/to/file/b.png",
"/path/to/file/c.bmp",
};
int ret = 0;
if (!simdb_create(path)) {
perror("can't create test database");
return 1;
}
sdb = simdb_open(path, SIMDB_FLAG_WRITE | SIMDB_FLAG_LOCKNB, &ret);
if (!sdb) {
fprintf(stderr, "can't open test simdb: %s\n", simdb_error(ret));
return 1;
}
for (int i = 0; i < sizeof(files); i++) {
ret = simdb_record_add(sdb, i, files[i], 0);
if (ret < 0) {
fprintf(stderr, "can't add file from %s: %s\n", files[i], simdb_error(ret));
}
}
simdb_search_init(&search);
/* tune search parameters */
search.d_ratio = 0.1; /* max difference in ratio -- 10% */
search.d_bitmap = 0.08; /* max difference in ratio -- 8% */
/* compare given file against database */
const char *sample = "/path/to/file/d.png";
simdb_search_file(sdb, &search, sample);
/* show search results if any */
if (search.found) {
printf("file %s similar to:\n", sample);
for (int i = 0; i < search.found; i++) {
match = &search.matches[i];
printf("- %s (%d %%)\n", files[match->num], (int) match->d_bitmap * 100);
}
/* free search results */
simdb_search_free(&search);
}
simdb_close(sdb);
unlink(path);
return 0;
}
You may build this example with next command:
gcc -Wall -std=c99 -O0 -pedantic -lsimdb -o simdb-usage-test test.c