J'ai une image, prise d'une webcam en direct et je souhaite pouvoir détecter un objet spécifique dans l'image et extraire cette partie pour effectuer un autre traitement. P>
Plus précisément, l'image serait d'un plateau de jeu, disons aux fins de cette question que c'est un plateau de jeu Sudoku. P>
Mon approche initiale consistait à rechercher des zones contrastées et à l'exercer de là, mais je semble me retrouver avec beaucoup de bords potentiels (beaucoup d'erreurs) et aucun indice réel sur la manière de travailler lesquelles sont celles-là. En fait, je veux! P>
Y a-t-il des algorithmes, des bibliothèques, des échantillons de code ou même des idées lumineuses, quant à la manière dont j'aurais participer à la recherche et à l'extraction de la partie pertinente de l'image? P>
10 Réponses :
Vous devez effectuer des filtres opération et masques sur l'image. P>
Vous pouvez également utiliser le seuil d'image pour détecter l'objet. Vous voudrez peut-être regarder ci-dessous la bibliothèque de traitement de l'image. P>
L'un des (je suppose beaucoup de nombreuses possibles) approches: p>
Trouvez un filtre qui "obtient / calcule" lignes droites (bords, etc.) à partir d'une image donnée. P> li>
Vous avez maintenant la collection (tableau) de toutes les lignes (xstart, ystart & xend, yend). Vous pouvez facilement calculer toutes les longueurs de ligne des coordonnées. P> LI>
Edit: Résolution / Programmation Ce type de problèmes est toujours difficile, mais vraiment intéressant en même temps :). P>
Utilisez gratuitement Aforge.net bibliothèque de traitement d'image pour cela. Il y a une tonne de choses cool à jouer avec. p>
Ce n'est pas parce que quelqu'un vous donne marteau ne signifie pas que vous pouvez construire une maison. Avoir des outils est utile, mais vous devez savoir ce que vous allez faire avec l'outil.
Vous pouvez d'abord essayer de trouver les intersections de ligne audacieuses et utilisez-les comme des marques d'enregistrement. p>
Ce serait un bon début car: p>
SO: P>
* Une solution plus sophistiquée serait d'utiliser un net neural au lieu d'un masque pour reconnaître les intersections. Cela vaut peut-être la peine depuis que vous allez probablement utiliser un pour l'OCR des chiffres. P>
+1 pour l'idée, -1 pour suggérer un NN
Les images sont bruyantes et les filets neurones traitent bien les données bruyantes. C'est pourquoi ils sont utilisés dans OCR. Cela dit, je préfère votre suggestion de détection de Harris ... peut-être comme une contribution à un NN? ;-)
Je commencerais à utiliser un détecteur d'angle (le détecteur Harris fonctionne bien) pour trouver les intersections et les coins de la grille Sudoku. P>
Ensuite, j'utiliserais ces points pour faire une rectification d'image pour transformer l'image pour avoir la grille aussi rectangulaire que possible. Maintenant, vous ne devriez pas avoir de mal à trouver chaque carré pour faire OCR. P>
La rectification d'image n'est pas simple et implique beaucoup de mathématiques. P>
Préparez-vous à faire une certaine lecture :) p>
Si les images des panneaux de jeu sont déjà proches de rectangulaires, vous pouvez bien sûr sauter la partie de rectification et utiliser directement les points de coin pour rechercher vos carrés pour OCR. P>
Beaucoup de gens suggèrent d'utiliser des réseaux de neurones. Je suis tout à fait sûr que jeterais un réseau de neurones sur ce problème est totalement non synchronisé. NNS sont (parfois) bien si vous devez classer des objets où la définition de l'objet est vague. "Trouver des voitures à l'image" est un problème qui pourrait avoir une utilisation pour un réseau neuronal puisque les voitures peuvent avoir l'air très différente, mais avoir des caractéristiques identiques. Ainsi, étant donné suffisamment de données, vous pouvez former votre NN pour détecter les voitures. Dans ce problème, vous avez quelque chose qui est très régulier et a toujours l'air presque identique, donc un NN ne fera rien de plus simple ou mieux. P>
+1 pour "être prêt à faire une lecture :)"
sans rejeter aucune des autres idées, l'étape 1 devrait vraiment être la détection de la rotation de l'image. Vous pouvez le faire en déterminant le gradient local à chaque point et en créant un histogramme de celui-ci. Cela aura 4 composants majeurs à 90 degrés compensations. Idéalement, ceux-ci seraient 0, 90, 180 et 270 mais s'ils ne devraient pas faire pivoter votre image. Par exemple. Dans l'image de l'échantillon, vous devriez commencer par une rotation sur environ 8 degrés CW. P>
Utilisez Aforge ColorFiltering fort> Il existe de nombreuses méthodes de filtrage fournies pour C #, principalement je préfère les filtres Aforge, à cette fin, peu de filtres, ils sont P> * ColorFiltering
* ChannelFiltering
* HSLFiltering
* YCbCrFiltering
* EuclideanColorFiltering
Vous devez utiliser Google pour camshift strong> ou Suivi de blob strong> ou Filtres de particules strong>. Ils sont tous utiles pour votre problème. Et la plupart d'entre eux sont expédiés avec OpenCV et c'est C # wrapper Aforge.net. Vous trouverez de belles démos sur YouTube montrant comment ils fonctionnent. P>
bonne chance p>
Jetez un coup d'oeil à: https://github.com/dajuric/accord-net-extensions P>
La bibliothèque "rejoint" la bibliothèque gratuite Aforge.Net et Accord.net et ajoute des algorithmes de traitement de l'image et d'objet. Échantillons inclus:) P>