Python Comment détecter les lignes horizontales et verticales dans une image avec HoughLines avec OpenCV?
Je m en essayant d'obtenir un seuil de l'étalonnage de l'échiquier. Je ne peux pas détecter directement l'échiquier des coins, car il y a un peu de poussière que j'observe un micro échiquier.
J'ai essayer plusieurs méthodes et HoughLinesP semble être l'approche la plus facile. Mais les résultats ne sont pas bons, comment améliorer mes résultats?
import numpy as np
import cv2
img = cv2.imread('lines.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
print img.shape[1]
print img.shape
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100)
a,b,c = lines.shape
for i in range(a):
cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)
cv2.imwrite('houghlines5.jpg',img)
Comme vous pouvez le voir sur la figure ci-dessous, je ne peux pas obtenir mon échiquier, les lignes sont tracées dans beaucoup de directions... (l'image d'origine : https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg)
- L'utilisation de seuillage, ou d'essayer de réduire les petits points (éroder, dilater).
- J'ai déjà essayer mais il n'est pas couplé avec hough lignes. Peut-être qu'il pourrait aider à obtenir les lignes? merci pour votre htfepb 😉
- Je voudrais vraiment seuillage donner une autre chance!
- Pouvez-vous télécharger l'image originale? Je suis également d'accord avec le don de seuillage un essai combiné avec l'analyse morphologique. Je peux donner à ceci un essai moi-même si j'avais l'image d'origine.
- Aussi, est-il spécifiquement requis pour l'utilisation de la Transformation de Hough? Si vous supprimez une partie du bruit, effectuer une assez grande fermeture puis de trouver les coins (Harris par exemple), ce qui devrait résoudre votre problème.
- Ok je le fais que je l'ajoute dans la question 😉
- J'ai essayer de supprimer le bruit avec filtre médian, mais elle n'est pas suffisante ou à labellize la place de l'isoler. Mais le résultat n'est pas très bonne, je veux dire l'erreur de reprojection est parfois important (RMS > 1)
- si vous n'êtes pas tenu de mettre en œuvre votre propre solution, vous pouvez essayer avec un déjà mis en œuvre la méthode docs.opencv.org/2.4/doc/tutorials/calib3d/...
- Yep je sais 😉 mais l'image est trop bruyant, il ne marche pas c'est pourquoi je fais cette solution 😉
Vous devez vous connecter pour publier un commentaire.
Vous utilisez une valeur trop faible pour rho.
Essayer le code ci-dessous:-
Noter, le changement de valeur de rho, valeur pi et maxLineGap pour réduire les valeurs aberrantes.
Image D'Entrée
Bords De L'Image
De L'Image De Sortie
Divers - Conseils pour les Débutants
Beaucoup de la Vision par Ordinateur algorithmes supposent certaines hypothèses, et bien, comment l'entrée devrait être. Lors de la construction de la Preuve-de-Concept, essayez de toujours afficher les intrants intermédiaires, vous générez avant l'application de ces algorithmes.
Rapide hack, si un algorithme accepte certains paramètres, utilisez une boucle sur les valeurs possibles de ces paramètres et de voir les résultats varient. Lien à une réponse sur la façon de générer rapidement de ces valeurs possibles.
Pour vraiment comprendre l'algorithme, lu sur le wiki ou encore mieux les sources où si nécessaire. Et puis encore une fois/encore faire le au-dessus de hack(point 2). Il sera en outre clairement de votre compréhension.
cv2.imwrite('imagename.jpg',gray)
, avant de dessiner hough lignes, c'est à dire avant l'exécution de la commandecv2.line
et l'utilisationimwrite
en dehors de la boucle.Je préfère écrire ce qu'un commentaire, mais malheureusement je ne peux pas. Vous devriez changer le minLineLength et minLineGap. Ou si sa juste sqaures que vous avez à trouver, je voudrais obtenir toutes les lignes et de vérifier les angles entre eux pour obtenir des lignes le long carrés de. J'ai travaillé avec HoughLineP avant et c'est bien fondée sur le dessus de deux arguments. En outre, essayez de l'aide Bilatérale de filtrage. J'ai vraiment l'aide quand l'affûtage à l'aide de filtre médian n'aide pas.
Filtre Bilatérale
en traitement d'images, ils sont quelques-uns des rôles que vous avez à parcourir, tels que les filtres avant d'aller pour les bords de détection, de votre état, la poussière est juste un bruit que vous avez à enlever par le filtre, utilisez gausse ou blure après que l'utilisation de seuillage et ensuite utiliser futés pour les bords et dans opencv ils sont cornere de détection, vous pouvez l'utiliser, ou vous pouvez simplement aller pour le point clé après threshholding si je ne me trompe pas.. essayer de faire ces étapes et de voir les resulte