Я работаю над проектом, связанным с распознаванием дорог из стандартного представления Google Map. Некоторые функции навигации будут добавлены в проект позже.
Я уже выделил все белые пиксели (представляющие дорогу на карте) в соответствии с критериями RGB. Кроме того, я сохранил все координаты белого пикселя (дороги) (2D) в одном списке с именем "all_roads". Теперь я хочу извлечь каждую дорогу с точки зрения координат пикселей и поместить их в разные списки (одна дорога в одном списке), но мне не хватает идей.
Я бы хотел использовать алгоритм Дейкстры для расчета кратчайший путь между двумя точками, но мне нужно создать «узлы» на каждом пересечении дорог. Вот почему я хотел бы сохранить каждую дорогу в соответствующем списке для дальнейшей обработки.
Я надеюсь, что кто-то может предложить некоторые идеи и методы. Спасибо!
Примечание. Критерии RGB (операторы "if" в методе "threshold") кажутся ненужными для скриншота выбранной карты, но становятся полезными на некоторых других скриншотах карты с другими цветами дороги, отличными от белого. (В любом случае, не в этом суть вопроса, но я надеюсь избежать ненужной путаницы)
# Import numpy to enable numpy array
import numpy as np
# Import time to handle time-related task
import time
# Import mean to calculate the averages of the pixals
from statistics import mean
# Import cv2 to display the image
import cv2 as cv2
def threshold(imageArray):
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Purpose: Display a given image with road in white according to pixel RGBs
Argument(s): A matrix generated from a given image.
Return: A matrix of the same size but only displays white and black.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
newAr = imageArray
for eachRow in newAr:
for eachPix in eachRow:
if eachPix[0] == 253 and eachPix[1] == 242:
eachPix[0] = 255
eachPix[1] = 255
eachPix[2] = 255
else:
pass
return newAr
# Import the image
g1 = cv2.imread("1.png")
# fix the output image with resolution of 800 * 600
g1 = cv2.resize(g1,(800,600))
# Apply threshold method to the imported image
g2 = threshold(g1)
index = np.where(g2 == [(255,255,255)])
# x coordinate of the white pixels (roads)
print(index[1])
# y coordinate of the white pixels (roads)
print(index[0])
# Storing the 2D coordinates of white pixels (roads) in a list
all_roads = []
for i in range(len(index[0]))[0::3]:
all_roads.append([index[1][i], index[0][i]])
#Display the modified image
cv2.imshow('g2', g2)
cv2.waitKey(0)
cv2.destroyAllWindows()