9
votes

Détecter un objet dans une image de caméra en C #

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.

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.

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!

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?


0 commentaires

10 Réponses :


3
votes

Vous devez effectuer des filtres opération et masques sur l'image.

Je pense qu'il n'y a pas de façons simples pour aller chercher de l'objet à partir de l'image, vous devez utiliser des algorithmes de détection de pointe, un coupure et définir les critères d'objets / image valides.

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.

  1. filtres API pour C, C ++, C #, Visual Basic .NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG plus riche que ci-dessus, mais elle est écrite en C ++

0 commentaires

1
votes

L'un des (je suppose beaucoup de nombreuses possibles) approches:

  1. Trouvez un filtre qui "obtient / calcule" lignes droites (bords, etc.) à partir d'une image donnée.

  2. 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.

  3. Maintenant, compte tenu de savoir que vous pouvez toujours (!) Attendez-vous à l'image «un-plus grand carré / rectangle», il serait assez facile de trouver et de calculer la région recherchée-Sudoku-Rectangle et de la récolter de l'image à l'image. faire un autre traitement.

    Edit: Résolution / Programmation Ce type de problèmes est toujours difficile, mais vraiment intéressant en même temps :).


0 commentaires

9
votes

Utilisez gratuitement Aforge.net bibliothèque de traitement d'image pour cela. Il y a une tonne de choses cool à jouer avec.


1 commentaires

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.



0
votes

Vous pouvez d'abord essayer de trouver les intersections de ligne audacieuses et utilisez-les comme des marques d'enregistrement.

Ce serait un bon début car:

  • Ils sont assez formés de manière uniforme
  • vous savez combien il y a
  • Vous savez où (à peu près) ils devraient être par rapport aux autres
  • peut tolérer les variations d'échelle

    SO:

    1. Appliquez un filtre Edge
    2. Scannez un masque * de ce que l'idéal + doit ressembler à l'image, enregistrant tout ce qui est un bon match
    3. Choisissez l'ensemble qui correspond le mieux à vos attentes, en fonction de l'emplacement relatif aux autres
    4. Vous savez maintenant également où les chiffres doivent être, afin que vous puissiez facilement les extraire.

      * 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.


2 commentaires

+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? ;-)



1
votes

Vous pouvez essayer d'utiliser transformation de Hough .


0 commentaires

1
votes

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.

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.

La rectification d'image n'est pas simple et implique beaucoup de mathématiques.

Préparez-vous à faire une certaine lecture :)

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.

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.


1 commentaires

+1 pour "être prêt à faire une lecture :)"



1
votes

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.


0 commentaires

1
votes

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


0 commentaires

0
votes

Vous devez utiliser Google pour camshift ou Suivi de blob ou Filtres de particules . 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.

bonne chance


0 commentaires

1
votes

Jetez un coup d'oeil à: https://github.com/dajuric/accord-net-extensions

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:)


0 commentaires