2016-02-24 10 views
5

Ho difficoltà a trovare le linee su una scacchiera in questa immagine usando HoughLinesP con OpenCV in Python.Parametri houghLinesP OpenCV

Nel tentativo di comprendere i parametri di HoughLinesP, ho fornito con il seguente codice:

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
from matplotlib import image as image 

I = image.imread('chess.jpg') 
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY) 

# Canny Edge Detection: 
Threshold1 = 150; 
Threshold2 = 350; 
FilterSize = 5 
E = cv2.Canny(G, Threshold1, Threshold2, FilterSize) 

Rres = 1 
Thetares = 1*np.pi/180 
Threshold = 1 
minLineLength = 1 
maxLineGap = 100 
lines = cv2.HoughLinesP(E,Rres,Thetares,Threshold,minLineLength,maxLineGap) 
N = lines.shape[0] 
for i in range(N): 
    x1 = lines[i][0][0] 
    y1 = lines[i][0][1]  
    x2 = lines[i][0][2] 
    y2 = lines[i][0][3]  
    cv2.line(I,(x1,y1),(x2,y2),(255,0,0),2) 

plt.figure(),plt.imshow(I),plt.title('Hough Lines'),plt.axis('off') 
plt.show() 

Il problema che sto avendo è che questo prende solo una linea. Se riduco maxLineGap a 1, ne raccoglie migliaia.

Capisco perché questo potrebbe essere, ma come faccio a scegliere un set di parametri adatto per ottenere tutte queste linee co-lineari per unire? Mi sto perdendo qualcosa?

Vorrei mantenere il codice semplice mentre lo utilizzo come esempio di questa funzione in azione.

Grazie in anticipo per qualsiasi aiuto!

Aggiornamento: Funziona perfettamente con HoughLines.

E non sembrano esserci problemi di rilevamento dei bordi poiché Canny funziona correttamente.

Tuttavia, ho ancora bisogno di far funzionare HoughLinesP. Qualche idea??

Immagini qui: Results

risposta

14

Ok, ho finalmente trovato il problema e ho pensato di condividere la soluzione per chiunque altro. Il problema è che nella funzione HoughLinesP esiste un parametro aggiuntivo, "linee" ridondante perché l'output della funzione è lo stesso:

cv2.HoughLinesP (immagine, rho, theta, soglia [, righe [, minLineLength [, maxLineGap]]])

Ciò causa problemi con i parametri man mano che vengono letti nell'ordine errato. Per evitare confusione con l'ordine dei parametri, la soluzione più semplice è quello di specificare al loro interno la funzione in questo modo:

lines = cv2.HoughLinesP(E,rho = 1,theta = 1*np.pi/180,threshold = 100,minLineLength = 100,maxLineGap = 50) 

Questo completamente risolto il mio problema e spero che aiutare gli altri.

+0

Fantastico. Dovresti accettare la tua risposta – Phani

+0

Grazie per il promemoria, Phani! Andrà bene. –

-1

non è HoughLinesP problema, utilizza lo stesso metodo potrà solo tutte le linee rilevate nell'immagine e tornare a voi.

Per essere in grado di ottenere le linee desiderate, sarà necessario uniformare l'immagine prima di utilizzare il metodo. Tuttavia, se si liscia troppo, non ci saranno margini per rilevare HoughLinesP.

È possibile saperne di più su Effetti di levigatura di OpenCV here.

+0

Grazie per essere tornato. Non sembra esserci alcun problema con il livellamento come: (a) funziona perfettamente con HoughLines, (2) I risultati della funzione Canny sono belli (se lo dico io stesso!) E (d) Canny Edge Detection incorpora lisciare comunque. Altre idee? Aiuto! –

+0

La levigatura rimuove i rumori di fondo dell'immagine. Canny non liscia. La sfumatura "sfoca" l'immagine che fornirà i bordi minori dopo il rilevamento del bordo (astuzia). – Meaniegy

+0

Quindi ti ho dato il beneficio del dubbio e ho provato a lisciare. Ho anche controllato il codice della funzione Canny per vedere se è fluido come suggerisce l'algoritmo.(a) Smoothing non ha risolto il problema, ha solo ridotto il numero di spigoli (ma sono contento del numero di spigoli) e (b) il codice Canny include effettivamente il livellamento come dovrebbe, quindi un passaggio di smoothing extra è ridondante. Grazie ancora per il tuo aiuto ma qualche altra idea? –