Расстояние между камерой и распознанным объектом

Я хотел бы рассчитать расстояние между моей камерой и распознанным «объектом». Распознанный «объект» — это, например, черный прямоугольный стикер на белой доске. Я знаю значения прямоугольника (x, y).

Есть ли метод, который я могу использовать для расчета расстояния со значениями моего исходного прямоугольника и значениями изображения прямоугольника, которое я сделал с помощью камеры?

Я искал ответы на форуме, но ни один из них не был указан для расчета расстояния с этими атрибутами.

Я работаю над роботом по имени Нао от Aldebaran Robotics, я планирую использовать OpenCV для распознавания черного прямоугольника.


person Silex    schedule 21.06.2012    source источник
comment
Прямоугольник обращен к камере или может быть под углом? В любом случае, я предлагаю вам начать с круга.   -  person Beta    schedule 21.06.2012
comment
Он может быть под углом, и это не обязательно должен быть прямоугольник ... суть в том, как измерить расстояние от 2D-объекта до изображения, зная атрибуты 2D-формы. Но я клянусь вашим советом! Благодарю вас!   -  person Silex    schedule 22.06.2012


Ответы (3)


Если бы вы могли вычислить угол, под которым находится изображение цели, то расстояние до цели должно быть пропорционально cot (т.е. 1/tan) этого угла. Вы должны обнаружить, что количество пикселей в изображении примерно соответствует углам, но я сомневаюсь, что оно полностью линейно, особенно вблизи.

Поведение объектива вашей камеры, вероятно, повлияет на это измерение, поэтому оно будет зависеть от ваших точных настроек.

Почему бы не измерить размер цели на нескольких расстояниях и не построить график разброса? Затем вы можете подобрать кривую к данным, чтобы получить функцию размера-> расстояния для вашей конкретной системы. Если ваша камера близка к «идеальной» камере, то вы должны увидеть, что этот график выглядит как cot, и вы сможете найти значения a и b, соответствующие dist = a * cot (b * width).

Если вы попробуете этот эксперимент, почему бы не опубликовать ответы здесь, чтобы другие могли извлечь из этого пользу?

[Редактировать: примечание об «идеальных» камерах]

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

Конечно, в реальной жизни камеры работают не через кальку, а с линзами. Очень сложные объективы. Взгляните на схему объектива на эта страница. По разным причинам, на изучение которых можно потратить всю жизнь, очень сложно создать линзу, которая работала бы точно так же, как образец с калькой работал бы при любых условиях. Начните с этой вики-страницы и читайте дальше, если хотите узнать больше.

Таким образом, вы вряд ли сможете вычислить точное соотношение между длиной пикселя и расстоянием: вы должны измерить его и построить кривую.

person Rich    schedule 21.06.2012
comment
Большое спасибо за Ваш ответ! Мне очень нравится ваша идея, я должен был подумать об этом... Один вопрос: почему мой график должен быть похож на раскладушку? Я представил это как линейный график (потому что, когда я двигаюсь по прямоугольнику, он становится линейно (?) больше). (Извините, если мой вопрос покажется глупым! :/) - person Silex; 21.06.2012
comment
P.S.: эта идеальная камера для меня в новинку, не могли бы вы дать мне ссылку, где я могу прочитать об этом? - person Silex; 21.06.2012
comment
Почему это нелинейно: представьте, что вы смотрите на дерево, двигаясь от него от него. Если бы угловая высота дерева уменьшалась линейно, то за конечное время она упала бы до нуля. Вместо этого он становится все меньше, но все медленнее и никогда полностью не исчезает, как бы далеко вы ни ушли. - person Beta; 22.06.2012
comment
Благодарю вас! Теперь понятно, почему он нелинейный! Спасибо и за дополнение идеальной камеры! Я опубликую свои результаты о методе кривой, который вы предложили, вероятно, примерно на следующей неделе! - person Silex; 22.06.2012
comment
Извините, что не ответил. Я все еще в проекте, но OpenCV не так прост, как я думал (по крайней мере, для первого пользователя...). :) В качестве временного решения я использовал лазерные и сонарные датчики на роботе, чтобы избежать столкновения с объектами и остановиться перед стеной на расстоянии 20 см. - person Silex; 15.08.2012

Это большая тема. Если вы хотите использовать одно изображение, посмотрите эта старая статья А. Криминиси . Для более подробного ознакомления прочитайте его кандидатскую диссертацию. Тезис. Затем начните играть с подпрограммами OpenCV в разделе «проективная геометрия».

person Francesco Callari    schedule 22.06.2012
comment
По указанной вами ссылке нет документа. Да, я сделаю это. - person Silex; 22.06.2012
comment
Вот это cs.illinois.edu/~dhoiem/courses /vision_spring10/источники/ - person Francesco Callari; 24.06.2012

Я также работал над распознаванием изображений/объектов. Я только что выпустил Android-приложение, запрограммированное на Python (перенесенное на Android), которое распознает объекты, людей, автомобили, книги, логотипы, деревья, цветы... что угодно :) выложите его в качестве теста за 99 центов в google play. Вот ссылка, если вам интересно, есть также видео в действии: https://play.google.com/store/apps/details?id=com.davecote.androideyes

Наслаждаться! :)

person Dave Cote    schedule 20.07.2012