C ++ / SIFT / SQL – S'il existe un moyen de comparer efficacement un descripteur SIFT d'une image avec un descripteur SIFT dans une database SQL?

Je voudrais find un moyen qui permettrait de comparer un descripteur SIFT d'une image (requête) avec des descripteurs dans une database SQL qui contient beaucoup de descripteurs de différentes images.

En fait, mon but final est de faire une application qui permette de comparer une image avec beaucoup d'image dans une database (pas dans mon appareil) mais dans une database SQL.

La première chose que je pensais était de stocker chaque descripteur sur la database SQL et de comparer chaque descripteur à un autre en utilisant la méthode Brute Force ou la méthode FlanneBased. Le problème est que, dans une database SQL, il faudrait beaucoup de time pour calculer une correspondance en raison des "mathématiques" derrière la correspondance (la distance euclidienne est par exemple sqrt (a² + b² + …)) et ce n'est pas possible faire ce genre de comparaison dans une énorme database.

Par exemple, un descripteur SIFT contient 128 numbers si je ne me trompe pas alors imaginez le time de comparer chaque nombre de chaque descripteurs set.

S'il y a une autre façon de faire ça? Je sais que dans une database SQL, les requêtes sont efficaces lorsque vous utilisez quelque chose comme "SELECT a FROM b WHERE …"

Par conséquent, je me request s'il existe un moyen de stocker les descripteurs EIPD de manière efficace? Par exemple, j'ai pensé à «crypter» les descripteurs en une sorte de grande string de strings et chaque string serait unique et donc je pourrais les comparer set mais je ne sais pas si c'est une bonne solution.

J'ai déjà lu cet article: Comparer les fonctionnalités SIFT stockées dans une database mysql mais cela ne m'a pas aidé. Je vous remercie.

Si j'étais vous, je préférerais comparer les descripteurs dans le code, plutôt que dans SQL. SQL n'est pas fait pour ça. Je ferais ce qui suit: –

1. Pre-load N descriptors from SQL onto memory. 2. Compare distances to query descriptor, descriptor by descriptor. 3. If distance<threshold, push to possiblematches. 4. When you reach N/2 descriptors, push the next N. 5. Compare all matches, choose the best one or the best D descriptors, as per your requirement. 

Cependant, pour cela, je préfère utiliser la class embeddede FileStorage d'OpenCV qui fournit des E / S sur les files XML et YAML; il résout le problème de l'parsing manuelle des valeurs des descripteurs.

Il n'est pas optimal d'utiliser une database SQL pour comparer SIFT. OpenCV propose des coupleurs point-key plus efficaces. Vous pouvez find un exemple dans ./samples/cpp/matcher_simple.cpp avec des descripteurs SURF facilement adaptables à SIFT. Basicaly, le kernel est

 BFMatcher matcher(NORM_L2); vector<DMatch> matches; matcher.match(descriptors1, descriptors2, matches); 

Autant que je m'en souvienne, certains coupleurs (par exemple Flann) ne fonctionnent qu'avec des descripteurs d'un certain type (CV_32F).