Как извлечь каждую дорогу с точки зрения координат пикселей из скриншота карты Google и поместить их в разные списки? - PullRequest
1 голос
/ 25 марта 2020

Я работаю над проектом, связанным с распознаванием дорог из стандартного представления 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()

enter image description here

...