То, на что вы смотрите, проще говоря, проблема теоремы Пифагора a ^ 2 + b ^ 2 = с ^ 2. Однако, когда дело доходит до приложений на основе камеры, не так-то просто точно определить. Вы нашли половину деталей, необходимых для «a», однако найти «b» или «c» намного сложнее.
Краткий ответ
В основном это невозможно сделать с помощью одной камеры. Но это можно сделать с помощью двух камер.
Длинный ответ (подумал, что объясню более подробно, без каламбура)
Я попытаюсь объяснить, скажем, мы выделяем две точки на нашем изображении и перемещаем камеру влево. Мы знаем, что расстояние от камеры до каждой точки B1 составляет 20 мм, а от точки B2 - 40 мм. Теперь предположим, что мы обрабатываем изображение и наши измерения равны A1 (0,2) и A2 (0,4), они связаны с B1 и B2 соответственно. Теперь A1 и A2 не измерения; это пиксели движения.
Теперь нам нужно умножить изменение в A1 и A2 на вычисленную константу, которая будет реальным расстоянием в мире в точках B1 и B2. ПРИМЕЧАНИЕ. Каждый из них отличается в зависимости от размера B *. Все это относится к углу обзора или, более часто называемому полем зрения в фотографии на разных расстояниях. Вы можете точно рассчитать константу, если знаете размер каждого пикселя на ПЗС-матрице камеры и число f объектива, установленного внутри камеры.
Я ожидал, что это не так, поэтому на разных расстояниях вам нужно разместить объект, длина которого вам известна, и посмотреть, сколько пикселей он занимает. Вблизи вы можете использовать линейку, чтобы упростить задачу. С этими измерениями. Вы берете эти данные и формируете кривую с линией наилучшего соответствия. Где ось X будет расстоянием до объекта, а ось Y будет константой отношения пикселя к расстоянию, на которое вы должны умножить свое движение.
Итак, как нам применить эту кривую. Что ж, это работа наугад. Теоретически, чем больше измерение движения A *, тем ближе объект к камере. В нашем примере наши отношения для A1> A2 говорят 5 мм и 3 мм соответственно, и теперь мы бы знали, что точка B1 переместилась на 10 мм (2x5 мм), а B2 переместилась на 6 мм (2x6 мм). Но давайте посмотрим правде в глаза - мы никогда не узнаем B, и мы никогда не сможем определить, составляет ли перемещенное расстояние 20 пикселей объекта, который близко не движется далеко, или объекта, движущегося очень далеко. Вот почему такие вещи, как Xbox Kinect, используют дополнительные датчики для получения информации о глубине, которую можно привязать к объектам на изображении.
То, что вы пытаетесь сделать, можно попробовать с двумя камерами, поскольку известно, что расстояние между этими камерами, движение может быть более точно рассчитано (эффективно, без использования датчика глубины). Математика, стоящая за этим, чрезвычайно сложна, и я бы посоветовал поискать несколько журнальных статей по этой теме. Если вы хотите, чтобы я объяснил теорию, я могу попытаться.
Весь мой опыт связан с разработкой высокоскоростного сбора видео и обработки изображений для моего PHD, так что поверьте мне, это невозможно сделать с одной камерой, извините. Надеюсь, что-то из этого поможет.
Ваше здоровье
Крис
[РЕДАКТИРОВАТЬ]
Я собирался добавить комментарий, но это проще из-за большого количества информации:
Поскольку это Kinect, я предполагаю, что у вас есть некоторая важная информация о глубине, связанная с каждой точкой, если нет, вам нужно будет выяснить, как ее получить.
Уравнение, с которого вам нужно будет начать, относится к полю обзора (FOV):
o / d = i / f
Где:
f равно фокусному расстоянию объектива, которое обычно указывается в мм (т. е. 18 28 30 50 - стандартные примеры).
d - это расстояние до объектива, полученное на основе данных Kinect.
o - размер объекта (или "поле зрения", перпендикулярное оптической оси и деленное на нее пополам).
i - размер изображения (или "полевой упор", перпендикулярный оптической оси и деленный на нее пополам).
Нам нужно вычислить i, где o - наше неизвестное значение, поэтому для i (диагональное измерение)
Нам понадобится размер пикселя на компакт-диске, это будет в микрометрах или мкм, которые вам понадобятся, чтобы найти эту информацию. Знаю, мы примем его как 14 мкм, что является стандартом для камеры сканирования среднего диапазона.
Итак, сначала нам нужно определить i горизонтальный размер (ih), который представляет собой количество пикселей ширины камеры, умноженное на размер пикселя ccd (мы будем использовать 640 x 320).
так: ih = 640 * 14um = 8960um
= 8960/1000 = 8.96mm
Теперь нам нужен i вертикальный размер (iv), такой же процесс, но высота.
так: iv = (320 * 14um) / 1000 = 4,48 мм
Теперь i находится по теореме Пифагора теорема Пифагора a ^ 2 + b ^ 2 = c ^ 2
так: i = sqrt (ih ^ 2 _ iv ^ 2)
= 10.02 mm
Теперь предположим, что у нас есть объектив 28 мм. Опять же, это точное значение необходимо будет выяснить. Итак, наше уравнение перестраивается и дает нам o:
o = (i * d) / f
Помните, что o будет диагональным (предположим, что объект или точка находятся на расстоянии 50 мм):
o = (10,02 мм * 50 мм) / 28 мм
17.89mm
Теперь нам нужно определить горизонтальный размер (oh) и вертикальный размер (ov), так как это даст нам расстояние на пиксель, на которое объект переместился. Теперь, поскольку FOV α CCD или i прямо пропорционален o, мы определим соотношение k
k = ввод / вывод
= 10.02 / 17.89
= 0.56
so:
o горизонтальный размер (о):
ой = ih / k
= 8,96 мм / 0,56 = 16 мм на пиксель
o вертикальный размер (ov):
ov = iv / k
= 4,48 мм / 0,56 = 8 мм на пиксель
Теперь у нас есть необходимые константы, давайте воспользуемся ими в качестве примера. Если наш объект на 50 мм перемещается из положения (0,0) в положение (2,4), тогда измерения в реальной жизни следующие:
(2*16mm , 4*8mm) = (32mm,32mm)
Опять же, теорема Пифагора: a ^ 2 + b ^ 2 = c ^ 2
Общее расстояние = sqrt (32 ^ 2 + 32 ^ 2)
= 45.25mm
Я знаю, что это сложно, но если у вас есть это в программе, это будет проще. Таким образом, для каждой точки вам придется повторить хотя бы половину процесса, так как d будет меняться на o для каждой точки, которую вы исследуете.
Надеюсь, это поможет вам,
Ура Крис
person
Chris
schedule
12.09.2011