Я пытаюсь обнаружить линии на стоянке, как показано ниже
Я надеюсь получить четкие линии и (x, y) позицию в пересеченной линии, однако результат не очень перспективен
Я думаю, это связано с двумя основными причинами
-
некоторые линии очень сломаны или отсутствуют, даже человеческие глаза могут четко идентифицировать их. (Даже HoughLine может помочь связать некоторые недостающие строки, так как HoughLine иногда соединял ненужные строки вместе, поэтому я предпочел бы сделать это вручную)
-
есть несколько повторяющихся строк
Общий трубопровод для работы показан ниже
1. выберите некоторые конкретные цвета (белые или желтые)
import cv2
import numpy as np
import matplotlib
from matplotlib.pyplot import imshow
from matplotlib import pyplot as plt
# white color mask
img = cv2.imread(filein)
#converted = convert_hls(img)
image = cv2.cvtColor(img,cv2.COLOR_BGR2HLS)
lower = np.uint8([0, 200, 0])
upper = np.uint8([255, 255, 255])
white_mask = cv2.inRange(image, lower, upper)
# yellow color mask
lower = np.uint8([10, 0, 100])
upper = np.uint8([40, 255, 255])
yellow_mask = cv2.inRange(image, lower, upper)
# combine the mask
mask = cv2.bitwise_or(white_mask, yellow_mask)
result = img.copy()
cv2.imshow("mask",mask)
2. повторите дилатацию и эрозию до тех пор, пока изображение не будет изменено (ссылка)
height,width = mask.shape
skel = np.zeros([height,width],dtype=np.uint8) #[height,width,3]
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
temp_nonzero = np.count_nonzero(mask)
while(np.count_nonzero(mask) != 0 ):
eroded = cv2.erode(mask,kernel)
cv2.imshow("eroded",eroded)
temp = cv2.dilate(eroded,kernel)
cv2.imshow("dilate",temp)
temp = cv2.subtract(mask,temp)
skel = cv2.bitwise_or(skel,temp)
mask = eroded.copy()
cv2.imshow("skel",skel)
#cv2.waitKey(0)
3. примените canny для фильтрации линий и используйте HoughLinesP для получения строк
edges = cv2.Canny(skel, 50, 150)
cv2.imshow("edges",edges)
lines = cv2.HoughLinesP(edges,1,np.pi/180,40,minLineLength=30,maxLineGap=30)
i = 0
for x1,y1,x2,y2 in lines[0]:
i+=1
cv2.line(result,(x1,y1),(x2,y2),(255,0,0),1)
print i
cv2.imshow("res",result)
cv2.waitKey(0)
Я удивляюсь, что после первого шага выбора определенного цвета линии со сломанными и шумами, я бы подумал, что на этом этапе мы должны сделать что-то, чтобы сделать ломаную линию полной, менее шумной линией, а затем попытаться применить что-то, чтобы сделать Линии Canny и Hough, любые идеи?