В этой задаче у нас один вид камеры, поэтому невозможно найти реальное расстояние между объектами, используя геометрию вида камеры. Хотя мы можем преобразовать пиксели изображения в единицу реального мира, рассматривая определенные эталонные объекты с известными значениями длины в единицах реального мира.
В снятом образце вы можете идентифицировать маркеры дорожных полос, как показано на рисунке ниже, и, зная их длину в единицах реального мира, вы можете найти пиксели до расстояния реального мира.
Ниже быстрая и основополагающая c реализация подхода обнаружения маркеров дорожных полос. Это также даст вам контуры на объектах, таких как автомобиль, велосипед на изображении, но вы можете удалить такие контуры, применив маску к этим объектам, как только вы узнаете их ограничивающие рамки.
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)