J'essaie de trouver les cadres de délimitation du texte dans une image et j'utilise actuellement cette approche:
// calculate the local variances of the grayscale image
Mat t_mean, t_mean_2;
Mat grayF;
outImg_gray.convertTo(grayF, CV_32F);
int winSize = 35;
blur(grayF, t_mean, cv::Size(winSize,winSize));
blur(grayF.mul(grayF), t_mean_2, cv::Size(winSize,winSize));
Mat varMat = t_mean_2 - t_mean.mul(t_mean);
varMat.convertTo(varMat, CV_8U);
// threshold the high variance regions
Mat varMatRegions = varMat > 100;
Lorsqu'on lui donne une image comme celle-ci:
Ensuite, quand je montre, varMatRegions
j'obtiens cette image:
Comme vous pouvez le voir, il combine un peu le bloc de texte gauche avec l'en-tête de la carte, pour la plupart des cartes, cette méthode fonctionne très bien, mais sur les cartes plus chargées, cela peut causer des problèmes.
La raison pour laquelle la connexion de ces contours est mauvaise est que la zone de délimitation du contour occupe presque toute la carte.
Quelqu'un peut-il suggérer une manière différente de trouver le texte pour assurer une détection correcte du texte?
200 points à celui qui peut trouver le texte dans la carte au-dessus de ces deux.
Réponses:
Vous pouvez détecter du texte en trouvant des éléments de bord proches (inspirés d'un LPD):
Usage:
Résultats:
une. element = getStructuringElement (cv :: MORPH_RECT, cv :: Size (17, 3));
b. element = getStructuringElement (cv :: MORPH_RECT, cv :: Size (30, 30));
Les résultats sont similaires pour l'autre image mentionnée.
la source
n
? Merci pour la solution, cela fonctionne très bien!cv::Rect a;
. Agrandie par n:a.x-=n/2;a.y-=n/2;a.width+=n;a.height+=n;
.J'ai utilisé une méthode basée sur le gradient dans le programme ci-dessous. Ajout des images résultantes. Veuillez noter que j'utilise une version réduite de l'image pour le traitement.
version c ++
version python
la source
rect
. Il y en a unpyrdown
, donc multipliezx, y, width, height
lerect
par 4.Voici une approche alternative que j'ai utilisée pour détecter les blocs de texte:
Ci-dessous, le code écrit en python avec pyopencv, il devrait être facile à porter en C ++.
L'image d'origine est la première image de votre message.
Après le prétraitement (niveaux de gris, seuil et dilatation - donc après l'étape 3), l'image ressemblait à ceci:
Voici l'image résultante ("contoured.jpg" dans la dernière ligne); les cadres de délimitation finaux pour les objets de l'image ressemblent à ceci:
Vous pouvez voir que le bloc de texte sur la gauche est détecté comme un bloc séparé, délimité de son environnement.
En utilisant le même script avec les mêmes paramètres (sauf pour le type de seuillage qui a été modifié pour la deuxième image comme décrit ci-dessous), voici les résultats pour les 2 autres cartes:
Réglage des paramètres
Les paramètres (valeur seuil, paramètres de dilatation) ont été optimisés pour cette image et cette tâche (recherche de blocs de texte) et peuvent être ajustés, si nécessaire, pour d'autres images de cartes ou d'autres types d'objets à trouver.
Pour le seuillage (étape 2), j'ai utilisé un seuil noir. Pour les images où le texte est plus clair que l'arrière-plan, comme la deuxième image de votre message, un seuil blanc doit être utilisé, remplacez donc le type de retenue par
cv2.THRESH_BINARY
). Pour la deuxième image, j'ai également utilisé une valeur légèrement plus élevée pour le seuil (180). La variation des paramètres de la valeur de seuil et du nombre d'itérations pour la dilatation entraînera différents degrés de sensibilité dans la délimitation des objets dans l'image.Recherche d'autres types d'objets:
Par exemple, réduire la dilatation à 5 itérations dans la première image nous donne une délimitation plus fine des objets dans l'image, trouvant approximativement tous les mots de l'image (plutôt que des blocs de texte):
Connaissant la taille approximative d'un mot, j'ai ici écarté les zones qui étaient trop petites (moins de 20 pixels de largeur ou de hauteur) ou trop grandes (plus de 100 pixels de largeur ou de hauteur) pour ignorer les objets qui sont peu susceptibles d'être des mots, pour obtenir les résultats en l'image ci-dessus.
la source
cv2.findContours
. Il ditValueError: too many values to unpack
.cv2.findContours
renvoie 3 arguments et que le code d'origine n'en capture que 2.L'approche de @ dhanushka était la plus prometteuse, mais je voulais jouer en Python alors je suis allé de l'avant et je l'ai traduit pour le plaisir:
Maintenant pour afficher l'image:
Pas le plus pythonique des scripts, mais j'ai essayé de ressembler le plus possible au code C ++ original pour que les lecteurs le suivent.
Cela fonctionne presque aussi bien que l'original. Je serai heureux de lire des suggestions sur la façon dont il pourrait être amélioré / corrigé pour ressembler pleinement aux résultats originaux.
la source
drawContours
cet état "La fonction dessine des contours de contour dans l'image si l'épaisseur> 0 ou remplit la zone délimitée par les contours si l'épaisseur <0." C'est fait pour que nous puissions vérifier le rapport de pixels non nuls pour décider si la boîte contient probablement du texte.Vous pouvez essayer cette méthode développée par Chucai Yi et Yingli Tian.
Ils partagent également un logiciel (basé sur Opencv-1.0 et il devrait fonctionner sous la plate-forme Windows.) Que vous pouvez utiliser (bien qu'aucun code source ne soit disponible). Il générera toutes les zones de délimitation du texte (affichées dans les ombres de couleur) dans l'image. En appliquant à vos exemples d'images, vous obtiendrez les résultats suivants:
Remarque: pour rendre le résultat plus robuste, vous pouvez davantage fusionner les cases adjacentes.
Mise à jour: Si votre objectif ultime est de reconnaître les textes de l'image, vous pouvez consulter gttext , qui est un logiciel gratuit OCR et un outil de vérification au sol pour les images couleur avec texte. Le code source est également disponible.
Avec cela, vous pouvez obtenir des textes reconnus comme:
la source
Au-dessus de la version Code JAVA: Merci @William
Et utilisez ce code dans la pratique:
la source
Implémentation Python pour la solution @ dhanushka:
la source
Ceci est une version C # de la réponse de dhanushka utilisant OpenCVSharp
la source
il s'agit d'une version VB.NET de la réponse de dhanushka utilisant EmguCV .
Quelques fonctions et structures d'EmguCV nécessitent une considération différente de la version C # avec OpenCVSharp
la source