web-dev-qa-db-fra.com

Comment localiser le code QR dans une image importante pour améliorer la performance de décodage?

Contexte

J'ai besoin de détecter et de décoder un code QR relativement petit (110x110 pixels) dans une grande image (2500x2000) sur un PI de framboise. Le code QR peut être à n'importe quel endroit du cadre, mais l'orientation devrait être normale, c'est-à-dire recharger. Nous utilisons des caméras industrielles et des lentilles industrielles de haute qualité. Les images sont généralement de bonne qualité et de la mise au point.

Actuellement, je suis capable de détecter et de décoder l'image de manière fiable avec pyzbar lorsque je recouvre l'image autour du code QR à l'aide d'une fenêtre d'APROX 600X500. Si j'essaie de décoder l'image complète, le symbole n'est pas détecté/décodé.

Ce que j'ai essayé

J'ai écrit une boucle qui glisse une fenêtre de culture sur l'image et tente de décoder chaque cadre recadré séparément. Je déplace la fenêtre de 50% de chaque itération pour vous assurer que je ne manquez aucun symbole au bord de la fenêtre.

J'ai également essayé d'utiliser OpenCV pour la détection/décodage, mais la performance n'était pas meilleure qu'avec pyzbar

Problèmes avec ma solution

Problèmes qui affectent mon projet actuel:

L'approche de fenêtre coulissante est difficile à régler, inefficace et lente B/C:

  1. il provoque l'analyse de toute la zone presque 4 fois; un effet secondaire du transfert de la fenêtre de 50%,
  2. les tailles de fenêtre les plus fiables ont tendance à être petites et nécessitent de nombreuses itérations,
  3. la taille du symbole peut varier en raison d'être plus proche/plus loin de la caméra.

Des problèmes qui peuvent affecter d'autres projets dans lesquels j'utiliserais cette approche:

  1. La fenêtre coulissante peut attraper un symbole plus d'une fois, ce qui rend difficile la détermination si le symbole était présent plus d'une fois.

La question

Comment puis-je trouver l'emplacement approximatif du (s) code (s) QR (s) afin que je puisse recadrer l'image en conséquence?

Je suis intéressé par des solutions pour améliorer les performances de détection/décodage, mais préférez-les que (a) utilisez des techniques d'apprentissage de la machine (je suis un ml débutant mais disposé à apprendre), (b) Utiliser le pré-traitement de l'image OPENCV ou (c ) apporter des améliorations à mon algorithme de culture de base.

Échantillon d'image

Voici l'une des échantillons d'images que j'utilise pour les tests. C'est une qualité d'éclairage délibérément médiocre de se rapprocher du pire des scénarios, mais les codes individuels détectent-ils et décodent correctement lorsqu'ils sont recadrés.

QR Code Test Image 001

9
Jens Ehrich

Cette solution est assez inefficace car elle est plutôt du côté de la force brute, mais devrait fonctionner donnée: la taille de l'image est de 2000x2000, le seuil de détection est d'environ 500x500 et la taille de code à barres est de 110x110.

Théoriquement, c'est mieux que l'approche de la fenêtre coulissante, mais probablement pas beaucoup, car c'est plus une variation.

L'idée est que si nous ne pouvons pas trouver de manière fiable le code à barres dans l'image, mais nous pouvons le trouver dans une sous-section de l'image, nous pourrons essayer de briser l'image dans les sous-sections, dont on contiendra l'image. Étant donné que nous ne pouvons pas être sûrs que le code à barres ne sera pas rompu lorsque nous le divisions en sections, nous devons nous assurer que ce sera dans l'une des sections possibles.

Premièrement, diviser l'image en grilles 500x500 (4x4) et exécutez Pyzbar sur chacune d'elles. Théorie: Le code à barres est soit dans l'une de ces 16 grilles. Il est divisé par l'une de ces grilles.

Si cela ne trouve pas à trouver un code à barres, puis décaléez la grille de 250 sur l'axe X. Exécutez à nouveau, puis essayez la grille décalée de 250 sur l'axe Y, passez-la à nouveau, puis essayez 250 sur les X et l'axe des Y et tournez-le à nouveau. En théorie, cela devrait s'assurer que le codes à barres existe dans certains 500x500 ou une grille plus petite. Si cela ne fonctionne pas, recommande d'utiliser une grille de 250x250 à la place (bien sûr, cela prendra 4 fois plus long à exécuter), car 250 est encore plus de deux fois la taille du code à barres.

D'autres suggestions fournies ici peuvent être utilisées pour affiner la zone de recherche et jeter les sections qui ne peuvent absolument pas contenir de codes à barres ni de se concentrer sur des sections qui contiennent probablement un code à barres. La réponse de Sebastian travaillerait probablement assez bien pour déterminer ce que les carrés de grille se concentrer sur.

Une autre option peut être de considérer où le code à barres est le plus probablement, je m'attendrais à ce que le code à barres soit plus proche du centre de l'écran. Donc, un motif de recherche en spirale à l'intérieur pourrait vous aider.

0
Nuclearman

Dans chaque code QR, il y a 3 rectangles carrés/rectangles aux coins. Si vous pouvez trouver ces pièces avec OPENCV, il est possible de recadrer la région du code QR.

Aussi j'ai trouvé this

0
enesdemirag