Comment classer les nombres flous avec openCV

je voudrais saisir le nombre de ce genre de photos.

enter image description here

j'ai essayé la correspondance multi-échelle à partir du lien suivant.

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

Tout ce que je veux savoir c'est le numéro rouge. Mais le problème est que le nombre Rouge est flou pour le modèle de reconnaissance/correspondance openCV. Y aurait-il un autre moyen possible de détecter ce numéro rouge sur le fond noir?

21
demandé sur en_Knight 2016-06-05 21:52:26

2 réponses

Classifier Les Chiffres

vous avez clarifié dans les commentaires que vous avez déjà isolé la partie nombre de la pré-détection d'image, donc je vais commencer par cette hypothèse.

peut-être Pouvez-vous vous rapprocher des effets de perspective et de "flou" du nombre en le traitant comme un nombre écrit à la main. Dans ce cas, il existe un ensemble célèbre de données de chiffres manuscrits pour la formation en classification appelé mnist.

Yann LeCun a énuméré l'état de l'art sur ce jeu de données ici mnist écrite à la main dataset.

taux d'erreur incroyablement bas (fractions d'erreur de 1%). Pour une solution plus simple, les k-les voisins les plus proches utilisant la deskewe, l'élimination du bruit, le flou, et le déplacement de 2 pixels, ont produit environ 1% d'erreur, et est significativement plus rapide à mettre en œuvre. Python opencv a une implémentation. Réseaux neuronaux et vecteur de soutien les machines avec deskewing ont aussi des taux de performance assez impressionnants.

notez que les réseaux convolutionnels ne vous font pas choisir vos propres caractéristiques, de sorte que l'information importante couleur-différentielle ici pourrait simplement être utilisé pour rétrécir la région d'intérêt. D'autres approches, où vous définissez votre espace caractéristique, pourrait incorporer la différence de couleur connue plus précisément.

Python supporte beaucoup de techniques d'apprentissage machine dans le paquet terrific sklearn - voici des exemples de sklearn appliqué à mnist. si vous cherchez une explication tutorialisée de l'apprentissage machine en python,le propre tutoriel de sklearn est très verbeux

à Partir de la sklearn lien: Classifying mnist

ce sont les types d'éléments que vous essayez de classer si vous apprenez en utilisant cette approche. Pour souligner à quel point il est facile de commencer la formation certains de ces classificateurs, voici une section abrégée du code exemple dans le paquet sklearn lié:

digits = datasets.load_digits() # built-in to sklearn!
data = digits.images.reshape((len(digits.images), -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])

si vous êtes marié à openCv (peut-être parce que vous voulez transférer sur un système en temps réel dans le futur), opencv3/python a un tutoriel sur ce sujet trop! Leur démo utilise k-near-neighbor (listée dans la page LeCun), mais ils aussi svms et les nombreux autres outils de sklearn. Leur page de Roc utilisant SVMs utilise deskewing, qui pourrait être utile avec l'effet de perspective dans votre problème:

Deskewed digit


mise à jour: j'ai utilisé l'extérieur de la boîte skimage approche décrite ci-dessus sur votre image, fortement réduite, et il correctement classé. beaucoup plus de tests seraient nécessaires pour voir si c'est rhobust dans la pratique

enter image description here

Je l'ai converti au format correct en le faisant passer à la gamme mnist en utilisant

number = scipy.misc.imread("cropped_image.png")
datum  =  (number[:,:,0]*15).astype(int).reshape((64,))
classifier.predict(datum) # returns 8

Je n'ai rien changé d'autre de l'exemple; ici, je n'utilise que le premier canal pour la classification, et pas de calcul intelligent de fonctionnalité. 15 regardé à droite de moi; vous aurez besoin de l'accorder pour obtenir dans la portée de la cible ou (idéalement) Donnez votre propre formation et jeu d'essais


Détection D'Objets

si vous n'avez pas isolé le numéro dans l'image, vous aurez besoin d'un détecteur d'objet. L'espace de littérature sur ce problème est gigantesque et je ne vais pas commencer par ce terrier de lapin (Google Viola et Jones, peut-être?) ce blog couvre les bases d'un détecteur de "fenêtre coulissante" en python. Adrian Rosebrock semble même être un contributeur sur Donc, et cette page a quelques bons exemples de détecteurs d'objets basés sur opencv et python et assez tutorialisés (vous avez en fait lié ce blog dans votre question, Je ne m'en suis pas rendu compte).

en bref, classez les fenêtres à travers l'image et choisissez la fenêtre de la plus haute confiance. Réduire l'espace de recherche avec une région d'intérêt sera bien sûr le rendement d'énormes améliorations dans tous les domaines de la performance

19
répondu en_Knight 2016-09-21 19:59:11

Vous avez un couple de choses que vous pouvez utiliser à votre avantage:

  • le numéro est à l'intérieur de la lunette rectangulaire noire et une couleur
  • le nombre semble être un affichage de type LCD segmenté, si oui, il y a seulement un nombre fini de segments qui sont off ou on.

Donc je vous suggère:

  • calibrez votre caméra et pré-traitez l'image pour supprimer la distorsion de l'objectif
  • Rectifier l'écran rectangle:
    • Détecter le rectangle d'affichage en utilisant soit l'intersection de hough lignes, ou Détection de bord suivi d'une détection de contour et puis de choisir les contours les plus grands et les plus clairs!--7-->
    • utiliser GetPerspectiveTransform pour obtenir la transformation entre les coordonnées de l'image et un rectangle idéal, puis transformer l'image d'entrée en utilisant WarpPerspective
  • divisez l'image en canaux R, G et B et travaillez sur