3

J'essaie de développer un programme capable de détecter les voies sur la route. J'ai expérimenté avec Hough Line Transform et Probabilistic Hough Line Transform. Cependant, aucun d'entre eux n'obtient les résultats que je veux.Le programme de détection de voie routière ne parvient pas à détecter correctement la voie

image originale:

enter image description here

Hough Transform Ligne

enter image description here enter image description here

probabilistes Hough Transform Ligne

enter image description here Il semble que pour Hough Line Transform, je puisse au moins détecter la totalité de la voie, mais malheureusement, la ligne continue indéfiniment (jusqu'à ce qu'ils quittent l'image), au point où les lignes se croisent , ce qui n'est pas un bon marqueur de détection de voie graphique.

J'ai également essayé Probalistic Hough Line Transform, et la ligne verte utilisée pour la détection de voie ne va pas à l'infiniment comme l'autre, mais elle ne parvient pas à marquer et à détecter toute la voie.

Je suis en train de reproduire les résultats ici (en l'écrivant en Python)

http://www.transistor.io/revisiting-lane-detection-using-opencv.html

Que puis-je faire pour résoudre ce problème?

code:

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
from PIL import Image 
import imutils 

def invert_img(img): 
    img = (255-img) 
    return img 

def canny(imgray): 
    imgray = cv2.GaussianBlur(imgray, (5,5), 200) 
    canny_low = 5 
    canny_high = 150 

    thresh = cv2.Canny(imgray,canny_low,canny_high) 
    return thresh 

def filtering(imgray): 
    thresh = canny(imgray) 

    minLineLength = 1 
    maxLineGap = 1 


    lines = cv2.HoughLines(thresh,1,np.pi/180,0) 
    #lines = cv2.HoughLinesP(thresh,2,np.pi/180,100,minLineLength,maxLineGap) 
    print lines.shape 

    # Code for HoughLinesP 
    ''' 
    for i in range(0,lines.shape[0]): 
     for x1,y1,x2,y2 in lines[i]: 
      cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) 
    ''' 

    # Code for HoughLines 

    for i in range(0,5): 
     for rho,theta in lines[i]: 
      a = np.cos(theta) 
      b = np.sin(theta) 
      x0 = a*rho 
      y0 = b*rho 
      x1 = int(x0 + 1000*(-b)) 
      y1 = int(y0 + 1000*(a)) 
      x2 = int(x0 - 1000*(-b)) 
      y2 = int(y0 - 1000*(a)) 

      cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) 


    return thresh 


img = cv2.imread('images/road_0.bmp') 


imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

img = imutils.resize(img, height = 500) 
imgray = imutils.resize(imgray, height = 500) 

thresh = filtering(imgray) 

cv2.imshow('original', img) 
cv2.imshow('result', thresh) 
cv2.waitKey(0) 

Répondre

0

sujet Cool! Tout d'abord, pourquoi avez-vous ajouté le flou gaussien? Votre article source ne le mentionne pas du tout. Si j'enlève ça, j'obtiens instantanément des lignes folles, que je peux atténuer avec canny_low et canny_high. Le meilleur que j'ai pu trouver était faible = 100 et élevé = 180.

screenshot of algorithm finding road lines

Deuxièmement, vous avez fait un très bon travail de traduire l'article à Python. Cependant, je pense que vous avez omis un détail crucial. L'auteur écrit:

// Canny algorithm 
Mat contours; 
Canny(image,contours,50,350); 
Mat contoursInv; 
threshold(contours,contoursInv,128,255,THRESH_BINARY_INV); 

Vous implémentez la fonction Canny (cv2.canny()), mais vous ne l'appelez pas la fonction de seuil. Selon documentation I found, cette fonction "applique un seuil de niveau fixe à chaque élément de réseau". J'ai expérimenté avec votre code et suis venu avec ce qui suit.

#thresh = canny(imgray) # original 
edges = canny(imgray) # docs refer to return value as "edges" 

retval, dst = cv2.threshold(edges, 128, 255,cv2.THRESH_BINARY_INV) 

Deux valeurs sont retournées - retval n'est pas particulièrement important pour nous en ce moment. dst est le tableau 2D de destination des données d'image après le seuillage. Vous devez ensuite mettre à jour votre appel à cv2.HoughLines et cv2.HoughLinesP en remplaçant "thresh" par "dst." Quand je l'ai fait, j'ai eu un comportement beaucoup plus intéressant, bien que je n'ai pas pu trouver les valeurs d'accord correctes pour que les lignes fonctionnent bien. Donc, j'espère que cela vous donne quelques conseils. Essayez mes conseils, et lisez aussi l'article une ou deux fois plus pour vérifier que vous avez le même flux de programme que l'auteur.Cela semble être un projet amusant, amusez-vous!

+0

Merci pour les conseils, mais je reçois des résultats étranges comme ceci: http://s13.postimg.org/ok14ocw2v/image.jpg J'ai probablement reproduit votre code de manière incorrecte, cela vous dérange modifier votre commentaire pour inclure le code complet tu as utilisé? Merci – user3377126

+0

Ah, je m'excuse. Ce n'était probablement pas clair à partir de ce que j'ai écrit. Cette image que j'ai posté est simplement le résultat de la «première» étape que j'ai décrite. Lorsque j'implémente l'étape "Deuxième", j'obtiens aussi l'image complète presque entièrement remplie, semblable à votre image. Je ne sais pas pourquoi c'est. Cependant, je suppose que c'est sur la bonne voie, car il suit de près l'article. Je suppose que c'est un problème avec la modification de ces valeurs (128, 255, canny_low, canny_high). En outre, il pourrait y avoir un code supplémentaire que nous n'avons pas encore ajouté à partir de l'article original. \\ J'espère que cela aide! – nshiff