web-dev-qa-db-fra.com

Python Comment détecter les lignes verticales et horizontales dans une image avec HoughLines avec OpenCV?

J'essaie d'obtenir un seuil de l'échiquier d'étalonnage. Je ne peux pas détecter directement les coins de l'échiquier car il y a de la poussière alors que j'observe un micro échiquier. J'essaie plusieurs méthodes et HoughLinesP semble être l'approche la plus simple. 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 de nombreuses directions ... (l'image d'origine: https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg )

enter image description here

15
user3601754

Vous utilisez une valeur trop petite pour rho.

Essayez le code ci-dessous: -

import numpy as np
import cv2

gray = cv2.imread('lines.jpg')
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite('edges-50-150.jpg',edges)
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80)

a,b,c = lines.shape
for i in range(a):
    cv2.line(gray, (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',gray)

Notez, le changement de valeur rho, valeur pi et maxLineGap pour réduire les valeurs aberrantes.

Image d'entrée Input Image

Image des bords Edges Image

Image de sortie Output Image

Divers - Conseils pour les débutants

  1. Un grand nombre d'algorithmes de vision par ordinateur supposent certaines hypothèses, eh bien, sur la façon dont l'entrée devrait être. Lors de la création de Proof-of-Concept, essayez toujours de visualiser les entrées intermédiaires que vous générez avant d'appliquer de tels algorithmes.

  2. Pour un hack rapide, si un algorithme accepte certains paramètres, utilisez une boucle for sur les valeurs possibles de ces paramètres et voyez comment les résultats varient. Lien pour une réponse sur la façon de générer rapidement ces valeurs possibles.

  3. Pour vraiment comprendre l'algorithme, lisez sur wiki ou même de meilleures sources si nécessaire. Et puis encore/toujours faire le hack ci-dessus (point 2). Cela clarifiera davantage votre compréhension.

33
saurabheights

Je préfère écrire ceci comme un commentaire mais malheureusement je ne peux pas. Vous devez modifier minLineLength et minLineGap. Ou si ce sont juste des carrés que vous devez trouver, j'obtiendrais toutes les lignes et vérifierais les angles entre elles pour obtenir des lignes uniquement le long des carrés. J'ai déjà travaillé avec HoughLineP et il est à peu près basé sur les deux arguments ci-dessus. En outre, essayez d'utiliser le filtrage bilatéral. J'aide vraiment lorsque la netteté à l'aide du filtre médian n'aide pas.

Filtre bilatéral

1
Rick M.