Devo rilevare la corsia stradale da un video. Ecco il mio modo di farlo.Python e OpenCV - Miglioramento dell'algoritmo di rilevamento corsia
- Determinare la regione di interesse (ROI) da affettare l'immagine (che si concentra la parte centrale)
- scala di grigi il ROI
- equalizzato il ROI scala di grigi con
cv2.equalizeHist
- Applicare sfocatura gaussiana a (3)
- Threshold (4) utilizzando
cv2.adaptiveThreshold
- skeletonize (5) utilizzando
skimage.morphology.skeletonize
- Applicare il 012.su (6)
Per la cv2.HoughLines
, ho regolato in modo che:
- Se
rho
è positivo (cioè la retta è inclinata verso destra (bottom-up), sarà disegnare la linea solo se si trova a determinati angoli (ho impostato il raggio dell'angolo)) - Se
rho
è negativo (la linea retta è inclinata a sinistra (dal basso verso l'alto), essa disegna la linea solo se è ad alcuni angoli)
Questo è il mio codice per disegnare le linee:
lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50)
try:
range = lines.shape[0]
except AttributeError:
range = 0
for i in xrange(range):
for rho, theta in lines[i]:
if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10):
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(roi, (x1, y1), (x2, y2), (0, 255, 0))
if rho < 0 and (np.pi*7/10 < theta < np.pi*9/10):
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(roi, (x1, y1), (x2, y2), (0, 255, 0))
Se non ho fatto quello che ho appena fatto in precedenza per la funzione cv2.HoughLines
, credo che ci saranno un sacco di linee disegnate non necessari.
Dopo aver regolato i parametri e così via, ho ottenuto un risultato abbastanza buono, ma questo vale per una sola immagine. Non penso che andrà bene per un video che continuerà a cambiare. Quello che mi infastidisce di più è il mio algoritmo per disegnare le linee necessarie (cioè la corsia). C'è un modo migliore? Almeno meglio del mio.
Questo è il mio risultato:
equalizzato istogramma, thresholded, e l'immagine scheletrato del ROI:
Come posso "cucire" le linee? Scusa, sono ancora un principiante sia nella programmazione che nell'elaborazione delle immagini. – Hilman
Ho aggiunto alcune note. Ci scusiamo per non aver fornito alcun codice. È in C++ e la particolare implementazione è molto diversa dalla tua, in pratica non ho abbastanza tempo per adattarla alla tua applicazione. – Aenimated1