3D Scanner собственными руками

3D Scanner собственными руками

Высшее назначение математики состоит в том, чтобы находить скрытый порядок в хаосе, который нас окружает
Норберт Винер

Здравствуйте!
Этот материал про то, как собственными руками создать 3d Scanner. Я постараюсь на пальцах объяснить логику его работы.

Вдохновившись вот этим:
http://en.wikipedia.org/wiki/3d_scanner
захотелось тоже сделать себе такую штуковину. Точнее это один вариант решения этой задачи из бесчисленного множества. Это, конечно же, не будет сверхточным прибором, но я надеюсь, что вам будет интересно.

Что необходимо для того чтобы завести сканер:

1. Web-камера.
2. Лампа.
3. Два квадратных листа перпендикулярных друг другу.

Web-камеры сейчас стоят очень дешево: обошлась мне в 600 р. (D-Link DSB C320). Разумеется, что чем лучше камера, тем лучше результаты.

Я с гордостью представляю вам свой девайс:

Картонка для отбрасывания тени (должна быть плоской и отбрасывать тень в одной плоскости). Это будет имитировать работу лазера, который светит в плоскости, который вы тоже можете использовать, если он у вас есть (вы его можете заказать в интернете, он стоит около 20 у.е.). Естественно, лазер лучше лампы.

Теперь о принципе работы. Давайте посмотрим на эту картинку:

Мы видим, как падает тень. Линия тени должна быть чётко видна как на квадратных плоскостях, так и на сканируемом объекте. Угол ABC (как вы уже должны были догадаться) - прямой.

Давайте взглянем на то, что нам из этого нужно поближе:

Обратите внимание на линию пересечения с квадратными плоскостями и линию сканирования. Все точки на этих линиях лежат в одной плоскости. Если вы внимательно посмотрите на линию пересечения с плоскостями, то обнаружите, что они образуют три точки (A,B,C) пересечения с плоскостями. Значит, нам известны три точки из плоскости, в которой лежит линия сканирования (и линия пересечения). Три точки это всё что необходимо для построения уравнения плоскости.

Зная координату камеры, можем испустить луч из камеры на линию сканирования. Пересечение с плоскостью тени и будут будущим 3d объектом.

Рассчитать координату камеры имея точки 0,1,2,3,4,5 очень трудно. Однако мы можем калибровать камеру вручную в 3д редакторе.

Я предпочитаю Maya и буду делать в ней и описывать всё на языке MEL.

Если вдуматься, то всё очень просто. Я даже полагаю, что человеческий мозг руководствуется теми же принципами, когда оценивает расстояние одним глазом. Если мы посчитаем картинку без тени, то предметы будут «висеть в воздухе», т.е. глазомер не может определить месторасположение объекта. Его координату можно вычислить только если объект движется … однако я загнался.

И так. Если вы не понимаете, что такое уравнение плоскости, то я постараюсь рассказать, как это понимаю я.
Несмотря на неоценимую мощь, плоскость описывается просто:
Ax + By + Cz + D = 0 (где A,B,C и D - постоянные, причём A,B и C одновременно не равны нулю)
Это общее уравнение плоскости. В прочем, в интернете вы можете много чего найти про плоскость.

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

На языке MEL плоскость можно описать так:
float $plane[4];

Это просто четыре числа. Получить их можно из трёх точек (три точки – это три вектора). Пример решения на MEL:

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

Как находить плоскость уже догадываемся. Теперь жизненно необходима позиция камеры. Чтобы рассчитать луч из камеры до линии сканирования.

Калибровка камеры является очень сложной математической задачей. И я не решился мучить себя и (не дай бог) Вас этим занятием. Я подумал, что проще всего в ручную настроить камеру и снимать с неё координату.

Для этого создал сцену, в которой создал персональную камеру и каркас для подгона будущих точек, которые тоже будут назначаться вручную.
Да… это не очень уж быстро, нудно, но нет никаких ограничений по материалу санируемого объекта и его окружению. Так что плюсов в этом способе предостаточно (лучшим плюсом является, пожалуй, - простота реализации).

Калибровку камеры удобно совершать, когда картинка подгоняется к Resolution Gate.

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

Можно долго на словах объяснять, как рассчитывать пересечение:

Как видите, решение весьма изящное:

Ну вот математика и кончилась.
Непосредственно сам процесс сканирования выглядит так:

Функция ( createScannerPoint ) создает точки (сферы) будущего объекта и помещает их в специальную группу (final_group), которую удобно проявлять и убирать из виду с помощью дополнительных кнопок на интерфейсе:

Если это можно назвать интерфейсом. А что тут собственно ещё такого придумаешь. Мне кажется, что код сложных интерфейсов крайне неудобно читать (даже если ты сам его написал), а это всё-таки ещё и урок.

Ресурсы:

1) Проект Maya 8.5 (ma)
2) Script

Запускаем проект майя и скрипт (source "3dScanner.mel";).

Смотрим, как всё устроено: дёргаем локаторы. Теперь снимаем видео с web-камеры:

Подгоняем main_camera вместе с подключённым Image Plane (с включённым проигрыванием секвенции кадров из avi). Как я уже говорил подгонять удобно по Resolution Gate:

Чтобы повысить точность сначала воспользуйтесь alt и мышью, а потом Move Tool, Rotate Tool и чуть угол обзора подкрутить, если нужно. После подгона сделайте камере Lock ( в дополнительных инструментах окошка это делается одной кнопкой ).

У меня моя горе-цифромыльница умеет снимать максимум 640*480 и делает это ужасно. В принципе, можно использовать цифровой фотоаппарат или видеокамеру подключённые к компьютеру. Раз 640*480, то и в настройках Image Size должны быть эти числа.

Теперь, не нервничая, вручную двигаем прицел (target) по линии сканирования, не забывая перемещать локаторы, образующие плоскость тени (p1,p2,p3). Удобно также проставить на хот кей команду createScannerPoint или использовать кнопку G, после запуска команды из Script Editor.

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

На этом всё.

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

Вы можете из каждой сканированной линии делать NURBS кривую и по ним в итоге запустить loft поверхность. Или же написать скрипт, который строит сетку по полученным точкам, координаты которых вы можете снимать со сфер.

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

Надеюсь, что вам было интересно и спасибо за внимание.

694 0 850 38
27
2007-10-09
Я хотел бы добавить, что метод не имеет привязки к программе. Вы можете реализовать это в любом приложении 3д графики, имеющим встроенный интерпретатор.
2007-10-09
Может я конечно не много далек от тонкостей программирования сканеров, но мне чтот вообще не улыбнуло то что это все делается в самой майе, вопрос вытекает - а зачем вообще надо так издеваться над программой? если и так есть уже бесплатные программы с подобными возможностями и даже лучше, могу позавидовавть тока в одном - это в том что MEL знать это архи важно для майя, а так поставлю средний бал.
2007-10-10
Да интересно конечно же всё это, но на практике пользы мало.....
2007-10-10
Бесплатного софта для этого нет (они работают бесплатно, но не сохраняют ничего (без лицензии) и необходим лазер). И тот, что есть, имеет массу ограничений, хоть и стоит недорого. Польза появляется, если использовать HD камеру и лазер. А их у меня нет. Точности моей web-камеры катастрофически не хватает. В связке с лампой особенно. Но даже в таких условиях я могу отсканировать чайник. Для этого мне потребуется немного времени. Если увеличить размер листов, достать очень яркую лампу (желательно лазер за 20 баксов), то можно отсканировать лицо человека. И в этом случае нету ограничения на материал (кожа просвечивается и может запутать алгоритмы поиска луча). Вы сами можете судить о том, какого качества были мои исходники. И их доступности. В платных (я про самые дешевые) девайсах (написано в инструкции) нужно ВВОДИТЬ координату камеры. Я считаю, что калибровка в Maya в тысячу раз удобнее, точнее и быстрее. Хотел, чтобы было интересно. Всё же, я думаю, все понимают, что от настольной лампы ожидать большую пользу неразумно, но с ней весело играть :) Описание построения поверхности по точкам заслуживает отдельной статьи. Я предложил лишь делать Loft по отсканированным кривым. Это должно сработать.
2007-10-10
Если вас это заинтересовало :) То почитайте вот это [url]http://www.vision.caltech.edu/bouguetj/index.html[/url] Решения на маленьких скриптах, очень гибки и изменяются под необходимые нужды за полчаса. Обратите внимание на этот пример: [url]http://www.vision.caltech.edu/bouguetj/SunScan/images/car_anim.gif[/url] Если найдёте такую же площадку с машиной, и проведёте замеры высоты стенки, то вы сможете смоделировать этот набросок в Maya (блендер, кси, 3дмакс…) и рассчитывать уравнение плоскости по тени, которую отбрасывает палка, которую он вручную перемещает. После того как калибровали в камеру. [url]http://www.vision.caltech.edu/bouguetj/SunScan/images/car6s.gif[/url] [url]http://www.vision.caltech.edu/bouguetj/SunScan/images/car4s.jpg[/url] На мой взгляд, очень весело. Гибкость, которую предоставляют 3д редакторы сложно переоценить.
2007-10-10
[quote]если и так есть уже бесплатные программы с подобными возможностями[/quote] dimson3d, этот урок доказывает, что возможности Мауа практически безграничны. Урок интересный и оригинальный. 5\5 Конечно на практике это мало где применимо, но всё же))
2007-10-10
я всегда знал, что вы, товаристч, псих! В ИСКЛЮЧИТЕЛЬНО ХОРОШЕМ СМЫСЛЕ :)))))))) 5/5
2007-10-10
Ничего не понял. 5/5 :)
2007-10-10
я , вроде, видел этот урок (похожий) где-то в другом месте не знаю кто был автар, но скрестим пальцы что вы, и что вы его не утащили:) а ваще качество получивших ся моделий не очень:)
2007-10-11
Не хорошо людей в плагиате обвинять. Ссылки на исходники я представил в начале статьи. Уверен, что видели вы не туториал, а платные программы.
2007-10-11
Это не совсем плагиат... Такого типа сканер был озвучен здесь же на render.ru. Но для него шла отдельныя программа и использвал он строительеый уровень (лазерный) Так что идея не его но молодец что перенёс в макс.... Хотя толку от этого мало.. Пограммы легко экспаритируют в *.3DS. Да и не акткально это... Чайник нарисовать 10 скунд, а если хочешь большего например голову получится с этого сканера такая лажа что смотреть страшно будет. Я пока придерживаюсь дедовских методов, если надо чё та смаделить мы это пологончиками
2007-10-11
Три недели писал эту статью. Несколько реализаций. Мне чертовки обидны обвинения. Не соревновался я с платными проектами: я писал статью про то как самому это реализовать и считаю, что справился с этой задачей.
2007-10-12
[quote]Три недели писал эту статью. Несколько реализаций. Мне чертовки обидны обвинения. Не соревновался я с платными проектами: я писал статью про то как самому это реализовать и считаю, что справился с этой задачей.[/quote] Начало неплохое. Мне понравилось. И тема актуальная. Все-таки, если усовершенствовать систему, то может очень пригодиться в будущем. Но данный урок я считаю незаконченным, т.к. присутствует только результат сканирования. А стоило бы продолжить до момента окончательного моделирования сканированного объекта. Поэтому с меня 5/4. А то что урок писался три недели, то это еще немного. Я думаю те, кто делал похожие платные программы или скрипты, работали над этой темой не один месяц. А поэтому и качество у них лучше. И соревноваться с ними не надо. Если тебя такой принцип работы сканера устраивает, то не обязательно что это понравится другим. Мой совет автору продолжать развивать тему и усовершенствовать технику сканирования. Ато надоело что все хорошее изобретается на Западе. Глядишь через пару лет скрипт превратиться в полноценный программный продукт. Чего я и желаю.
2007-10-12
"Картонка для отбрасывания тени (должна быть плоской и отбрасывать тень в одной плоскости). Это будет имитировать работу лазера, который светит в плоскости, который вы тоже можете использовать, если он у вас есть (вы его можете заказать в интернете, он стоит около 20 у.е.). Естественно, лазер лучше лампы." Я в детсве от нечего делать просвечивал лазерной указкой через всё, что просвечиывалось и вот заметил интересную для данного случая особенность, что если перед лазерной укакой поместить пробирку из школьной хим. лаборатории, то лазерный лучь преламывается в плоскость, если вспомнить фильм "Чужой" в котором космический корабль сканировался... В общем я хотел сказать, что выше указанный принцип можна довести до ума, вместо пробирки использывать какуе-то призму или пипетку и т.п. разместить на штатив и двигать с лёгкостью руки и не тратить 20$ на буржуйское устройство...
2007-10-12
>Бесплатного софта для этого нет (они работают бесплатно, но не сохраняют ничего (без лицензии) твое заявление не соответствует действительности http://www.david-laserscanner.com/ прогарамма бесплатна, сохраняет в obj, дает весьма удовлетворительные результаты вместо предложенной автором статьи калибровки прогармма использует специальный шаблон, который значительно упрощает эту процедуру >И в этом случае нету ограничения на материал отсканируй стеклянный предмет
2007-10-12
кстати, упомянутая программа не только сохраняет в obj геометрию, но и захватывает текстуру, UV (все это в бесплатном модуле)
2007-10-12
>лазерный лучь преламывается в плоскость, если вспомнить фильм "Чужой" в котором космический корабль сканировался... вот это очень инетресно! а вообще, подойдет лазерный уровень - они дешевы и доступны
2007-10-12
Обваляю в муке и отсканирую %) ps У меня эта программа не запустилась. И я могу отсканировать автомобиль :) Эта программа может отсканировать автомобиль при помощи забора? Прежде чем критиковать прочтите урок, пожалуйста, он ж е не про то совсем.
2007-10-12
Можно так же использовать солнечный свет и палку. В теории, если лазерную указку поместить на быстрый моторчик, то в кадре должна получаться линия %) (но не пробовал) Много чего можно придумать. Про это и хотел сказать.
2007-10-14
Как идея,интересна,правда, не ново.Понимаю что работы проделано не мало,но согласитесь,что "сыровато"... За старания 5/5
2007-10-15
Купил диск "Дежавю". В дополнениях было упоминание на 3d сканер LIDAR, который применяли для создания трехмерных помещений. Вот что пока накопал: [url]http://www.fxguide.com/article114.html[/url] Обратите на строку: [quote]A Lidar scan was completed of a real church interior located in Los Angeles to serve as a guide for the look of the CG church. Pixel Magic's 3D department modified the geometry of the Lidar scan in order to give the illusion of a 300ft height ceiling, and to add more detail where needed. Lighting of the virtual set was matched to a master clip of the real church interior.[/quote] И еще: [url]http://en.wikipedia.org/wiki/LIDAR[/url]
2007-10-16
>Обваляю в муке и отсканирую %) отмывать потом сам будешь? :) >И я могу отсканировать автомобиль :) Эта программа может отсканировать автомобиль при помощи забора? в принципе, да по крайней мере человеческое тело в полный рост кто-то сканировал >Прежде чем критиковать прочтите урок, пожалуйста, он ж е не про то совсем кто ж критикует? просто ты сказал, что вот бесплатных программ нет, что они ничего не сохраняют - а я тебя поправил а так - довольно интересная статья
2007-10-16
У меня есть прикольная фигурка кошки. Подумал, что её было бы клёво отсканировать. Но она матово чёрная. Чувствительности камеры не хватало, чтобы увидеть освещённую часть. Решил вывалять её в муке. Для этого растворил сахар чтобы она стала липкой и обвалял в муке. Фигня получилась %) нельзя это чудо было показывать тут. Хотя в принципе сработало бы.
2007-10-17
Статья понравилась, сама идея сделать все в домашних условиях, планирую попробовать реализовать своими силами... благо на работе есть доступ к лазерным сканерам штрихкодов как одноплоскостным так и много плоскостным, да и камеры HiRes есть. Если что и получится и результат будет лучше то обязательно поделюсь опытом реализации.
2007-10-27
Народ а кто знает сколько стоит недорогой 3Д сканнер в Москве, например?
2007-12-24
Можно так же использовать солнечный свет и палку. В теории, если лазерную указку поместить на быстрый моторчик, то в кадре должна получаться линия %) (но не пробовал) Много чего можно придумать. Про это и хотел сказать. Ржу-нимагу....зачем на маторчик? Обыкновенную лазерную указку и стеклянную трубочку пойдёт даже от пипетки прикрепить их под 90градусов в форме буквы (Т) пропустить луч лазера через пипетку и будет вам ровная линия хоть комнату сканируйте!
2010-03-06
есть программы который по фотографиям очень качественно делают 3д модели и самое главное текстурят их. и никакого гемора.
RENDER.RU