Вычисление реального размера предмета на картинке

248 views
Skip to first unread message

Victor Sheyanov

unread,
Sep 6, 2013, 9:18:31 AM9/6/13
to ruf...@googlegroups.com
Коллеги, подскажите в каком направлении двигаться.

Опыта в 3D нет, поэтому пока даже не знаю, какую информацию в гугле искать.

Исходные данные: есть камера, которая смотри на стол. Известна высота до стола, угол который видит камера.


В начале мы руками вводим размер предмета, которых находится посередине (что-то вроде калибровки).

Задача - найти длину линии, которую я на экране могу начертить.

В случае, если камера смотрит вертикально - вопросов нет.

Но если камера смотри на стол под углом, то все явно усложняется.


В случае с этим столом - размер тарелки (красная линия) я задал, и говорю, что он 40см
Я знаю высоту от камеры до стола, знаю угол, под которым камера смотрит на стол, угол обзора камеры.

Длину синей линии я еще более менее представлю как можно вычислить, а вот желтой - нет.

Буду благодарен за любые советы.



fresh-flash

unread,
Sep 6, 2013, 10:48:57 AM9/6/13
to ruf...@googlegroups.com
Можно переводить 3д координаты(для объектов на сцене они будут постоянны) в 2д и вычислять расстояния между 2д-точками потом.
В away3d делается так:
var _positionOn2D:Vector3D = view.project(_3dObject.scenePosition);

Alexandr Mosotovoy

unread,
Sep 6, 2013, 2:18:21 PM9/6/13
to ruFlash
У вас недостаточно данных для точного вычисления.
То что линия лежит на плоскости стола - убирает некоторую неопределенность (иначе бы у вас было огромное число решений)
Но вам необходимо знать
1. Угол наклона стола к плоскости (теоретически вы можете его вычислить предполагая что тарелка круглая, т.е. нужна вторая линия для калибровки)
2. Перспективные искажения камеры (от изометрической до широкоугольной).

Для калибровки легче использовать плоскость перпендикулярную камере. Например ножки табуретки. Тогда из отношений длинн ножек в разных плоскостях (а точнее расстояний от центра перспеутивы до ножек) можем получить величину перспеутивных искажений.
 Смысл в том что если мы возьмем две одинаковые плоскости X'Y' и X"Y", точнее одну и туже в разных положениях на оси Z (перпендикулярной камере, т.к.)., то положение всех точек XY будут линейно зависимы от координаты Z и величины перспективных искажений. Т.Е. все точки плоскости  X"Y" это просто соскейленные точки плоскости X'Y' на величину зависящую линейно от их расстояния Z до камеры. (А мы для удобства берем систему такую координат в которой эти плоскости перпендикулярный)

scale(z) = (z/d + 1)
x' = x0 + x/scale;
y' = y0 - y/scale; (если у нас Y  в обратную сторону направлен)
где x0, y0 - координаты центра перспетивы
x',y' - координаты на фотографии (координаты в плоскости перпендикулярной камере)
x,y - виртуальные координаты в 3D пространстве. (в них уже можете выситывать расстояние между точками по теореме пифагора) 

У нас задача наоборот, найти исходный x и y
(x' - x0)*scale = x
(y' + y0)*scale = y

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

А вот с задачей где отрезки лежат на наклонной плоскости немного сложнее, нужно вначале вычислить угол наклона плоскости из известных отрезков. Сходу сложно сформулировать точную формулу для отрезка на наклонной плоскости , нужно вычислять учитывая наклон стола, но что бы вам было легче вычилить по приведенным формулам представть что обе точки искомого отрезка отложены на 2-х паралельных гранях куба, расположенных перпендикулярно камере (т.е. Куб не лежит на столе!!! и его наклон относительно стола нужно вычислить)  на которых нанесена координатная сетка XY.





--
С уважением,
Александр Мостовой

site: http://ushan.org
skype: alexmost
icq: 149-844-621
ph: +380978116838

Victor Sheyanov

unread,
Sep 9, 2013, 2:42:41 AM9/9/13
to ruf...@googlegroups.com
Александр, спасибо за ответ. Попробую использовать, чтобы начать :)

У нас безусловно есть упрощения, так как миллиметры с вебкамеры все равно не измерить:
1) стол без наклона
2) угол наклона камеры к столу известен всегда (камера возвращает данные наклона, поворота, зума)
3) калибровка идет в плоскости стола
4) не учитываем, что предметы имеют объем, интересует только длина в плоскости стола (на картинке мы измеряем 'n')
5) искажения камеры мы не знаем, знаем лишь угол обзора камеры, который меняется в зависимости от зума.

fresh-flash
3D движок тоже стоит рассмотреть, как как задача выглядит достаточно стандартной. Спасибо.

Виктор

пятница, 6 сентября 2013 г., 22:18:21 UTC+4 пользователь Ushanos написал:
Reply all
Reply to author
Forward
0 new messages