Как обнаружить зеленые полосы и границы футбольного поля? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь как-то очень точно обнаружить зеленые полосы и границу футбольного поля.

Вот если мой код и результат выглядят так, как будто я что-то пропустил, и я думаю, что результат может быть намного лучше

img = cv2.imread(im_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

kernel_size = 3

bilarImg = cv2.bilateralFilter(gray,7,7,7)
image_enhanced = cv2.equalizeHist(bilarImg)

plt.imshow(image_enhanced)

masked_edges = cv2.Canny(image_enhanced, 100, 170, apertureSize = 3)

plt.imshow(masked_edges, cmap='gray')

# Define the Hough transform parameters
# Make a blank the same size as our image to draw on
rho = 2 # distance resolution in pixels of the Hough grid
theta = np.pi/180 # angular resolution in radians of the Hough grid
threshold = 110     # minimum number of votes (intersections in Hough grid cell)
min_line_length = 90 #minimum number of pixels making up a line
max_line_gap = 20   # maximum gap in pixels between connectable line segments

line_image = np.copy(img)*0 #creating a blank to draw lines on

# Run Hough on edge detected image
lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]),
                            min_line_length, max_line_gap)

# Iterate over the output "lines" and draw lines on the blank
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,255,255),2)

# Create a "color" binary image to combine with line image
color_edges = np.dstack((masked_edges, masked_edges, masked_edges)) 

# Draw the lines on the edge image
combo = cv2.addWeighted(color_edges, 0.8, line_image, 1, 0) 

# remove small objects
se1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
combo = cv2.morphologyEx(combo, cv2.MORPH_OPEN, se1)

cv2.imwrite("gray.png", image_enhanced)
cv2.imwrite("res.png", combo)

Вот изображение src: src image

и результаты enter image description here enter image description here

В идеале я бы оставил только границы поля и вертикальные линии зеленых полос.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Рекомендую разбить цветовое пространство на RGB и Green.Вы можете использовать функцию Split .

0 голосов
/ 27 августа 2018

Я не пробовал. Но я думаю, что вы можете использовать локальный бинарный паттерн для различения зеленых полос и границы футбольного поля. Вот хороший учебник с исходным кодом, который может дать вам хорошую идею. https://www.pyimagesearch.com/2015/12/07/local-binary-patterns-with-python-opencv/

0 голосов
/ 26 августа 2018

Это действительно сложная задача.Я думаю, вы должны найти маску для этого поля.Маска поможет вам идентифицировать поле без людей и шума (как вариант, чтобы использовать сегментацию по цвету).Как вы сказали, вы можете метод Hough к определенным линиям.Вы должны поиграться с параметрами для лучшего результата.В сумме вы можете найти уравнение каждой строки и вычислить tan (a) .С помощью tan (a) вы можете определить по горизонтали и по вертикали линии футбольного поля.

...