Вычисление расстояния в реальном мире с использованием расстояния в пикселях

У меня есть два изображения как здесь транспортное средство въехало в регион и другое изображение как здесь транспортное средство выехало из региона

Я сделал эти снимки с помощью одной камеры видеонаблюдения, установленной на дороге.

Теперь я хочу вычислить реальное расстояние, пройденное им, чтобы найти скорость транспортного средства. Я использую обнаружение объектов, чтобы получить ограничивающие рамки для номерного знака автомобиля на обоих изображениях, я могу вычислить расстояние в пикселях. Я могу сопоставить расстояние в пикселях с реальным миром только тогда, когда плоскость изображения и плоскость дороги параллельны друг другу (я использую эту технику, но она не дает точных результатов). Поскольку моя камера наклонена под углом к ​​дороге, я не мог использовать этот прием.

Я пробовал несколько исследовательских работ, но не смог найти никакой полезной информации, относящейся к моей проблеме. Кто-нибудь, пожалуйста, поделитесь информацией о том, как это сделать, это будет полезно.


person Looters    schedule 16.04.2020    source источник


Ответы (1)


В этой задаче у нас есть вид с одной камеры, поэтому вы не можете найти реальное расстояние между объектами, используя геометрию вида камеры. Хотя мы можем преобразовать пиксели изображения в единицы реального мира, рассматривая определенные эталонные объекты с известными значениями длины в единицах реального мира.

На захваченном образце изображения вы можете идентифицировать маркеры дорожных полос, как показано ниже на изображении, и, зная их длину в реальных единицах измерения, вы можете найти расстояние в пикселях до реального мира.

Ниже приведена быстрая и базовая реализация подхода к обнаружению маркеров дорожных полос. Это также даст вам контуры в таких объектах, как автомобиль, велосипед на изображении, но вы можете удалить такие контуры, наложив маску на эти объекты, как только вы узнаете их ограничивающие рамки объекта.

img = cv2.imread("road_lane.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.blur(gray, (3, 3))
# Find Canny edges
edged = cv2.Canny(blur, 30, 200)

# Finding Contours
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
boundRect = []
for i, c in enumerate(contours):
    #ignore large and small contours
    if len(c) < 300 and len(c) > 100 :
        box = cv2.boundingRect(c)
        #check for vertical rectangles
        if box[2] < box[3]:
           boundRect.append(box)

for i in range(len(boundRect)):
    cv2.rectangle(img, (int(boundRect[i][0]), int(boundRect[i][1])), (int(boundRect[i][0] + boundRect[i][2]), int(boundRect[i][1] + boundRect[i][3])), (255, 0, 0), 5)

введите здесь описание изображения

person flamelite    schedule 16.04.2020