Перейти к содержанию
  • записей
    48
  • комментариев
    308
  • просмотров
    27719

Про 2D и 3D


Аюпа

1692 просмотра

blog-0835469001404763726.jpeg

Когда человек идет в 3D кинотеатр или – если он буржуй – смотрит кино на 3D телевизоре, то трехмерное восприятие картинки может создаваться разными способами, так или иначе сводящимися к одному простому принципу: на левый глаз подается одно изображение, на правый - другое. Думаю, любознательные уже имеют представление о тех или иных методах – поляризационных очках, цветовых фильтрах и тому подобном. Отмечу лишь, что путем длительных тренировок и медитаций можно развить в себе способность смотреть трехмерное телевидение без всякой спецаппаратуры. Однако компьютер или иное средство воспроизведения должен при этом воспроизводить видео с левой камеры и видео с правой параллельно на двух окнах. Надо только приучить себя смотреть левым глазом на видео с левой камеры, а правым глазом – на видео с правой. Сам я так никогда не пробовал, но познавшие дзен говорят, что делать это легче если правое видео располагается слева от левого.

Человек использует два глаза для того, чтобы воссоздать в своей голове трехмерную картинку окружающего пространства. Летучие мыши, козодои, киты и дельфины используют для тех же целей эхолокацию, электрический угорь, рыба-нож и нильские мормирусы – радиолокацию на сверхдлинных волнах. Летучим мышам кстати дико лениво пользоваться своими эхолотами, поэтому не охотясь они предпочитают летать по памяти. Говорят, что когда в Нью-Йорке построили эмпайр-стейт-билдинг, то первые несколько месяцев у его подножия находили трупы кожанов, которые, не зная ничего о строительстве, въебывались со всей дури в стены. Биологи, кстати, в способности рукокрылых в эхолокации убедились совсем недавно – лет этак 50 назад. У меня в Уфе остался потрепанный Брем 41 года издания, перед самой войной подаренный бабушке за успешное окончание какого-то там класса, так там написано, что у летучих мышей столь тонкое осязание, что они чувствуют завихрения воздуха перед крупными и мелкими объектами.

1334874075_00a6aere.jpg

Теперь возникает вопрос – а что же делать роботу или иной автоматической либо автоматизированной системе, если она хочет подобно человеку и другим жывотным заиметь некое представление о структуре окружающего пространства? Да в принципе она вольна воспользоваться всем тем же самым, чем пользуются живые существа и даже кое-чем, чем они воспользоваться не умеют. Эхолотами – правда, как говорят, хуевыми - активно пользуются автоматизированные рыболовы и автоматические гаишники. Радиолокация и вовсе активно юзается доблестными ВВС и ПВО более 70 лет (у меня, например, дед в свое время два диссера по противодействию радиолокации защитил и вроде бы его результаты даже использовались против пиндосов во вьетнамской войне). Но речь у нас все же не об авиации и гаишниках, а о роботе который хочет научиться ловить мяч. А чтобы поймать надо прежде всего уметь видеть, где он находится. То есть по большому счету нам даже не нужна 3D-реконструкция окружающего пространства – нужно только установить наличие в окружающем пространстве определенного объекта и его в нем расположение относительно робота.

В принципе для таких вещей потребна и одна единственная камера – при условии, что нам точно известны линейные размеры объекта. Тогда по размеру объекта на изображении можно определить расстояние до него, а по расположению – направление. Аналогичным образом в мире людей даже какая-нибудь Аска-одноглазка может ходить по квартире не натыкаясь на все подряд именно потому, что в силу жизненного опыта имеет представление о размерах вещей.

Если же мы хотим определять размеры объекта по ходу дейcтвия или например хотим получить представление о том, что вокруг лежит, нам нужно что-то посерьезнее, как минимум еще одна камера. Две камеры, обзирающие некий один участок пространства и исползуемые для построения 3d модели этого участка, именуются в простонародье стереопарой.

Кстати немного терминологии (не официально, а скорее что под этим понимается):

Компьютерное зрение (Computer Vision) – извлечение программными методами разной полезной информации из видеоданных.

Машинное зрение (Machine Vision) –автоматическое ориентирование в окружающем пространстве в реальном времени с использованием предыдущего пункта.

КЗ и МЗ легко спутать, но на деле это разные области научной деятельности. КЗ более абстрактно и им занимаются информатики. МЗ – вещь скорее прикладная, помимо собственно анализа изображений подразумевает выбор и расстановку осветительного оборудования, выбор и расстановку камер, при необходимости использование других сенсоров, определение частоты кадров и интеграция всей этой байды в систему, работу которой она поддерживает. МЗ – раздел роботехники / прикладной кибернетики, в общем задачи тут более инженерные, чем вычислительные. МЗшники и КЗшники делают общее дело, хотя и находятся в легких контрах в силу того, что вторым зачастую похуй на многие достаточно критичные для первых требования, например, на реальное время.

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

То есть, чтобы построить трехмерную модель обзираемой области надо принципиально узнать две вещи:

1) Какой пиксель на левом изображении соответствует какому пикселю на правом – согласование изображений (Stereo Matching).

2) Каково взаимное расположение камер друг относительно друга – калибровка стереопары (Calibration).

Триангуляция – процесс построения 3D модели пространства. Если СИ и КС прошли годно, то это достаточно простая задача.

СИ –интересная задача со множеством подводных камней (например, как согласовать два изображения плоской белой стены, сделанных под разными углами, как определить, что данный пиксель левого изображения вообще есть на правом и т. д.) включает много хитрых и интересных алгоритмов, которые активно меняются и развиваются в последние годы, но самое прекрасное в этой задаче то, что нам ее решать не надо: летящий мяч распознается отдельно на правом и левом снимке и после распознавания мы уже знаем, каковы пиксельные координаты его центра.

Что касается калибровки, то задача эта достаточно рутинная и на редкость муторная. Очевидно, что ее в отличие от СИ можно решать не для каждого изображения отдельно: взаимное расположение жестко зафиксированных камер со временем вроде как не меняется. Правда рекомендуется все же калибровать камеры по новой перед каждой серией экспериментов и после каждого прикосновения к камерам. Потому что ты например подпрыгнул и от сотрясения пола принципиальная точка одной из камер сместилась аж на четверть миллиметра: калибровка уже не точная.

Сама калибровка проводится так (вообще существуют разные способы, мы пользовались более или менее стандартным): Папа-Карло берет шахматную доску и поочередно ее фотографирует, располагая в разных точках наблюдаемой зоны – при этом желательно охватить всю область, в которой нам нужны точные измерения. Минимум нужно 20 фоток, а лучше 30-40.Потом фотки грузятся на комп и с помощью специального матлабовского тулбокса на них нужно отметить углы (места сочленения двух черных клеток). Крайние углы доски нужно указать вручную, с помощью перемещаемого окошка 15х15 пикселей (если взять большее, определитель начинает дико глючить и ошибаться, при этом дефолтный размер окна почему-то 23х23; подлянка в том, что изображение при этом нельзя увеличивать, а значит нужно иметь глаз-алмаз), остальные находятся автоматически если заранее указать количество клеток на доске по горизонтали вертикали. Далее ты говоришь тулбоксу, каков размер одной клетки (как будет показано ниже, желательно с точностью до 10 микрон), а все остальное он проделывает сам: вычисляет параметры каждой из камер и определяет расстояние и угол поворота от одной камеры до другой. Потом уже можно определять положение точек в пространстве, зная их пиксельные координаты.

10314576_654971151261457_4700401340998402350_n.jpg

Умножение числа камер сверх необходимых двух уже не дает качественных изменений, но может улучшить ситуацию количественно: можно повысить точность и площадь покрытия. Многокамерные системы, покрывающие большую территорию и позволяющие контроллировать на ней происходящее – отдельное и богатое на еду научное пастбище. Я помнится уже вспоминал тут одну научную группу из Кипра, разрабатывающую алгоритмы патрулирования территории роботами-охранниками. Предполагалось, что это может быть использовано в заповедниках в отдаленном светлом будущем, но мы-то знаем. Постановка задачи – часть территории контроллируется стационарным камерами, часть мертвая зона, отряд роботов (снабженных камерами ессно) должен разделившись осмотреть все мертвые зоны за минимальное время.

Есть еще такое замечательное изобретение человечества как Киннект в котором одна камера комбинируется с ИК-сенсором глубины, который определяет расстояние до объекта без всяких калибровок. Киннект активно используют для построения 3D моделей пространства (опять-таки слушал доклад чувака, который использовал киннект для построения трехмерных моделей сисек по заказу извращенцев производителей бюстгальтеров). Проблема с киннектом одна – это говноприставка для развлечения говногеймеров (точнее говноконтроллер к говноиксбоксу). Потому у нее дофига низкая точность – ошибка в пять миллиметров есть совершенно обычная ситуация. Нам же нужна такая система, которая позволяет говорить о точности в пределах хотя бы двух-трех мм.

И вот тут мы подобрались к сути. У нас была установка из двух камер, образующих стереопару, нам хотелось знать, с какой точностью она определяет положение объекта. Как это сделать?

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

10259933_654971067928132_6472596415195323554_n.jpg

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

1. На пол кладется оконное стекло

2. На него с наивозможнейшей ровностью клеится лист миллиметровки формата А0.

3. В мастерской в подвале института рабочие вытачивают три стойки прецизионной длинны.

4. Стойки ставятся на миллиметровку, шары крепятся на стойки

5. ???

6. ПРОФИТ.

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

1. Делаешь стереоснимок.

2. Выбираешь какой-то из узлов на миллиметровке.

3. Смотришь на левую фотографию и записываешь в каком пикселе находится этот угол

4. То же самое для правой фотографии

5. Повторить пункты 2.-5. Для нового узла

6. Измерить расстояние между узлами и сравнивать с номинальным.

И вот мы многократно проделывали этот процесс и обнаружили странное. Вот меряем мы допустим расстояние между точками, лежащими в 350 мм друг от друга. А вычисления бац – и раз за разом показывают 349. Ну что за х – явно систематическая погрешность какая-то, а не случайная. В итоге доперли: принтер показывал, что ширина одной клети на шахматной доске – 17,5 мм, а вдруг она на самом деле 17,6. Мы взяли штангенциркуль (при этом оказалось, что словом Stangenzirkel в немецком обозначается обычный циркуль, а вовсе не штанген. Когда я рассказал всю эту историю папе, тот поведал что в пору его ставропольского детства, в Ставрополе располагался один из двух в Союзе заводов по производству оных штангенциркулей. Некоторые пацаны из его класса подрабатывали на этом заводе и тащили оттуда бракованные нёниусы: из них получались отличные заточки, прочные и с высокой пробивной силой) померили – действительно чуть больше, что-то типа 17 555 микрон. Ну окей что-ли, внесли поправки, распечатали более точную шахматную доску, систематическую погрешность практически убрали, осталась только случайная, но та не больше полумиллиметра.

Дальше измерения непосредственно на шарах:

10402402_654971147928124_4354538161218479709_n.jpg

Кстати, стойка большая и круглая, чтобы поставить ее центр в точности над узлом сетки, пришлось прецизионно выпиливать метки через каждые 90 градусов основания. Установка стойки на позицию: поставить стойку на миллиметровку и потом долго двигать ее так, чтобы каждый из четырех пропилов находился на сантиметровой линии. Работа вроде бы несложная, но поскольку у нас 26 позиций и три стойки – итого эту операцию нужно было повторить 78 раз (некоторые снимки были неудачные). В общем под конец стоять враскоряку над огромным стеклянным листом, который ни в коем случае нельзя случайно сдвинуть ни на миллиметр, тщательно выравнивать на нем железную хуетень под палящим и слепящим светом прожекторов (высокочастотным камерам нужно до хрена света) – в общем под конец это слегка задалбывает, хотя несомненно вызывает чувство глубокого удовлетворения. Впрочем, осознаю, что это скорее я зажрался на своей мозговой работе.

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

А главное – компаньон утверждает, что такой херней до нас еще никто не страдал, а значит результаты вполне тянут на статью в какой-нибудь не слишком хардкорной конференции.

3 Комментария


Рекомендуемые комментарии

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

Ссылка на комментарий
Гость
Добавить комментарий...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...