Alex 'AdUser' Z
8 years ago
3 changed files with 121 additions and 0 deletions
@ -0,0 +1,23 @@ |
|||||||
|
Overview |
||||||
|
-------- |
||||||
|
|
||||||
|
This library provides fast and reliably way to find visually similar images. |
||||||
|
|
||||||
|
Requirements |
||||||
|
------------ |
||||||
|
|
||||||
|
Runtime: |
||||||
|
|
||||||
|
* libimagemagick / libgraphicsmagick (optional, may be disabled if no new samples needed) |
||||||
|
|
||||||
|
Compile-time: |
||||||
|
|
||||||
|
* headers for library above |
||||||
|
* C compiler with -std=c99 support |
||||||
|
* cmake >= 2.6 |
||||||
|
|
||||||
|
See also |
||||||
|
-------- |
||||||
|
|
||||||
|
* [build notes](docs/build.md) |
||||||
|
* [usage example](docs/usage.md) |
@ -0,0 +1,26 @@ |
|||||||
|
Build notes |
||||||
|
----------- |
||||||
|
|
||||||
|
General build flow as simple as this three commands: |
||||||
|
|
||||||
|
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release . |
||||||
|
make |
||||||
|
sudo checkinstall -- make install |
||||||
|
|
||||||
|
Now, cmake options explained: |
||||||
|
|
||||||
|
* `CMAKE_INSTALL_PREFIX` -- is root of place where to install the library |
||||||
|
* `CMAKE_BUILD_TYPE` -- tunes build options for warious presets (Release, Debug, ...) |
||||||
|
|
||||||
|
Project-specific options explained: |
||||||
|
|
||||||
|
* `SIMDB_SAMPLER` -- selects a library for use for making image samples. Now available: |
||||||
|
* magick -- for this time is only production-ready sampler (both ImageMagick and GraphicsMagick supported) |
||||||
|
* random -- backend for testing, generates sample with random data |
||||||
|
* dummy -- empty backend, always fails (use only if you don't need to add new image samples) |
||||||
|
* `WITH_TOOLS` -- build some usefull tools |
||||||
|
* simdb-tool -- manual manipulation of samples database |
||||||
|
* simdb-upgrade -- upgrades database format to latest known version |
||||||
|
* `WITH_HARDENING` -- enable some additional compiler sanity checks |
||||||
|
|
||||||
|
`checkinstall` on last step is optional, but recommended tool, unless you don't care garbage in your system. |
@ -0,0 +1,72 @@ |
|||||||
|
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 |
Loading…
Reference in new issue