Найти скорость автомобиля по изображениям - PullRequest
7 голосов
/ 02 февраля 2011

Я делаю проект, чтобы найти скорость автомобиля по изображениям.Мы берем эти изображения изнутри автомобиля.Мы будем отмечать некоторый объект с 1-го изображения в качестве ссылки.Используя свойства того же объекта на следующем изображении, мы должны рассчитать скорость движущегося транспортного средства.Может кто-нибудь помочь мне здесь ???Я использую Python OpenCV.Мне удалось найти отмеченный пиксель на втором изображении с помощью метода оптического потока.Может ли кто-нибудь помочь мне с остальными?

1 Ответ

11 голосов
/ 02 февраля 2011

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

Чтобы найти это расстояние, я предлагаю вам оценить позу маркера для каждого изображения. Грубо говоря, «поза» - это матрица преобразования, выражающая координаты объекта относительно камеры. Получив эти последовательные координаты, вы можете вычислить расстояние, а затем скорость.

Оценка позы - это процесс вычисления положения и ориентации известного 3D-объекта относительно 2D-камеры. Результирующая поза - это матрица преобразования, описывающая референс объекта в референции камеры.

Pose description

OpenCV реализует алгоритм оценки позы: Позиция . Док говорит:

Учитывая некоторые 3D точки (в объекте система координат) объекта, в минимум четыре некомпланарные точки, их соответствующие 2D проекции в изображение и фокусное расстояние камера, алгоритм способен оценить позу объекта.

Это означает:

  1. Вы должны знать фокусное расстояние вашей камеры
  2. Вы должны знать геометрию своего маркера
  3. Вы должны быть в состоянии совпасть с четырьмя известными точками вашего маркера на 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-пространство, вы должны выбрать объект с некоторой глубиной.

С другой стороны, вы можете использовать действительно простую форму, поскольку это объем. (Например, куб.)

...