8
votes

Sauvegarder les vecteurs d'orb sur OpenCV4android (API Java)

J'ai un ensemble d'images de formation, pour chacun desquels j'ai détecté et Calculé Les vecteurs de fonctionnalités (utilisant des descripteurs de fonctionnalité Orb . Les questions sont : car je dois enregistrer ces fonctionnalités pour les réutiliser pour la correspondance contre des images de test (à l'aide du classificateur SVM); Quelle est la meilleure façon de stocker les vecteurs de fonctionnalités, localement sur le Dispositif Android?

Les vecteurs de fonctionnalité à enregistrer sont de taille variable par image et sont donc celles avec des tailles non maximales sont rembourrées avec des zéros pour unifier toutes les tailles de vecteurs. La taille maximale est actuellement de 500 rangées x 32 cols; Ainsi, 16K fonctionnalités.

Voici les options que je pourrais atteindre jusqu'à présent;

  • J'ai entendu parler de l'opencv's Filetstorage , mais lorsque vous traversez la documentation Java, j'ai remarqué une méthode Enregistrer pour Caractéristiques de porc (non orb). De plus, je ne sais pas si vous enregistrez des fonctionnalités utilisant les options de stockage de fichiers d'OPENCV serait la plus optimale de mémoire mémoire pour les téléphones Android, étant donné que le fichier XML serait trop grand pour charger.
  • Mon choix actuel consiste à opter pour une base de données SQLLITE, ayant une table avec deux cols; ID et fonctionnalité (comme fréquemment suggéré en ligne); Tabiner toutes les fonctionnalités de 16K dans SQLLITE. Cela semble plutôt intensif du stockage téléphonique, mais c'est la solution la plus raisonnable que je puisse trouver.

    existe-t-il une méthode courante pour manipuler les vecteurs de fonctionnalités sur les téléphones Android? Cela englobe-t-il l'une des méthodes ci-dessus? Si non, pouvez-vous offrir des directives sur la manière de mettre en œuvre une telle solution de stockage?

    Merci.


0 commentaires

3 Réponses :


0
votes

Je suggérerais de stocker les vecteurs de fonctionnalités comme des images pour avoir une représentation simple et compacte. Vous pouvez même utiliser une compression non destructive telle que PNG pour minimiser la taille du fichier.


0 commentaires

5
votes

À mon avis, le moyen le plus universel de stocker les claviers est de les convertir d'abord en un format de données-interchange comme JSON.

Après avoir capable de faire cette conversion, vous avez beaucoup de flexibilité pour la stocker. JSON est facilement converti en chaîne et / ou envoyé via une connexion réseau.

avec openc c ++ Vous êtes en mesure de stocker des données comme YAML , mais qui n'est pas disponible pour Android.

Pour analyser JSON en Java Vous pouvez Utilisez cette optique facile à utiliser bibliothèque google gson .

et voici ma première tentative de faire exactement que: xxx


0 commentaires

0
votes

Je vois que vous avez envisagé d'utiliser la base de données Android SQLite:

Mon choix actuel consiste à opter pour une base de données SQLLITE, ayant une table avec deux cols; ID et fonctionnalité (comme fréquemment suggéré en ligne); Tabiner toutes les fonctionnalités de 16K dans SQLLITE. Cela semble plutôt intensif du stockage téléphonique, mais c'est la solution la plus raisonnable que je puisse trouver.

est un moyen d'enregistrer et de récupérer matofkeyypoint à la base de données SQLite avec une efficacité raisonnable.

Utilisation de la base de données a l'avantage de ne pas avoir besoin de demander une autorisation de stockage externe en écriture de l'utilisateur (bien que cette autorisation soit nécessaire pour une autre des fonctions de vos applications).

Il existe une solution complète Android, avec code Java qui peut être trouvé dans Cette réponse de Stackoverflow répond .

Vous trouverez ci-dessous une description de ce qui se passe dans le code de cette réponse ...

MATOFKEYPOING à Ayte [] et certains attributs

Pour enregistrer dans la base de données, vous devez enregistrer dans un objet octet [] . Utilisation de la méthode MATOFKEYPOINKOINT.GET () , vous pouvez obtenir un float [] peuplé [] . Ensuite, en utilisant bytebuffer.putfloat () , vous pouvez faire boucler tous vos flotteurs, enfin obtenir un octet peuplé [] à l'aide de bytebuffer.array () .

Vous devez également enregistrer quelques attirbutes matofkeyypoint.Rows () , matofkeyypoint.cols () et matofkeypoint.type () à Votre base de données, ainsi que le blob de octet [] .

Blob de la base de données (octet []) à MatofkeyPoint

Pour reconstituer votre MatofkeyPoint de la base de données, vous devez d'abord créer un float [] hors de votre blob. Utilisez bytebuffer.wrap (blob) , puis exécutez bytebuffer.asfloatbuffer () , et enfin floatbuffer.get () avec un nouveau < code> flotteur [] .

Maintenant que vous avez YourflatArray Vous exécutez MatofkeyPoint.Create (lignes, cols, type) , ces trois choses provenant de l'enregistrement de base de données. Enfin, vous exécutez matofkeyypoint.put (0, 0, Vecfloatarray) .


0 commentaires