Зная частоту сбора данных, теперь вы должны найти расстояние между последовательными позициями маркера.
Чтобы найти это расстояние, я предлагаю вам оценить позу маркера для каждого изображения. Грубо говоря, «поза» - это матрица преобразования, выражающая координаты объекта относительно камеры. Получив эти последовательные координаты, вы можете вычислить расстояние, а затем скорость.
Оценка позы - это процесс вычисления положения и ориентации известного 3D-объекта относительно 2D-камеры. Результирующая поза - это матрица преобразования, описывающая референс объекта в референции камеры.
OpenCV реализует алгоритм оценки позы: Позиция . Док говорит:
Учитывая некоторые 3D точки (в объекте
система координат) объекта, в
минимум четыре некомпланарные точки, их
соответствующие 2D проекции в
изображение и фокусное расстояние
камера, алгоритм способен
оценить позу объекта.
Это означает:
- Вы должны знать фокусное расстояние вашей камеры
- Вы должны знать геометрию своего маркера
- Вы должны быть в состоянии совпасть с четырьмя известными точками вашего маркера на 2D-изображении
Возможно, вам придется рассчитать фокусное расстояние камеры, используя процедуры калибровки , предоставляемые OpenCV. Я думаю, у вас есть два других необходимых данных.
Edit:
// Algorithm example
MarkerCoords = {Four coordinates of know 3D points}
I1 = take 1st image
F1 = focal(I1)
MarkerPixels1 = {Matching pixels in I1}
Pose1 = posit(MarkerCoords, MarkerPixels1, F1)
I2 = take 2nd image
F2 = focal(I2)
MarkerPixels2 = {Matching pixels in I2 by optical flow}
Pose2 = posit(MarkerCoords, MarkerPixels2, F2)
o1 = origin_of_camera * Pose1 // Origin of camera is
o2 = origin_of_camera * Pose2 // typically [0,0,0]
dist = euclidean_distance(o1, o2)
speed = dist/frequency
Редактировать 2: (Ответы на комментарии)
«Какова частота сбора данных?»
Вычисление скорости вашего транспортного средства эквивалентно вычислению скорости маркера. (В первом случае ссылка является маркером, прикрепленным к земле, во втором случае ссылка является камерой, прикрепленной к автомобилю.) Это выражается следующим уравнением:
speed = D/(t2-t1)
С:
D
расстояние [o1 o2]
o1
положение маркера в момент времени t1
o2
положение маркера в момент времени t2
Вы можете получить истекшее время, извлекая t1
и t2
из метаданных ваших фотографий или с частоты получения вашего устройства обработки изображений: t2-t1 = T = 1/F
.
"Не лучше ли помечать простые вещи, такие как плакаты? И если мы не будем рассматривать это как двумерный объект?"
Это невозможно с алгоритмом Posit (или с любым другим алгоритмом оценки позы, насколько мне известно): для этого требуется четыре некомпланарных балла. Это означает, что вы не можете выбрать 2D-объект, встроенный в 3D-пространство, вы должны выбрать объект с некоторой глубиной.
С другой стороны, вы можете использовать действительно простую форму, поскольку это объем. (Например, куб.)