Смекни!
smekni.com

«бесполезных полигонов» (стр. 1 из 2)

Санкт-Петербургский Государственный Университет

Математико-механический факультет

Кафедра системного программирования

Исправление краевых дефектов 3D скана лица и торса

Курсовая работа студента 445 группы

Добролеж Анны Борисовны

Научный руководитель ………………. И.Г. Антипов

Санкт-Петербург

2010


Оглавление

1.Введение

2.Реализация

3. Решение задачи

3.1.Удаление «бесполезных полигонов»

3.2.Удаление несвязанных частей

3.3.Отсечение плоскостями

3.4.Очистка модели торса

4.Заключение

5.Список литературы


Введение

С данной работе представлена очистка 3D модели частей тела человека, а именно исправление краевых дефектов трёхмерной модели лица и торса.

Определим некоторые понятия.

Трёхмерная модель – это модель объекта в трёхмерной графике, представляющая собой совокупность вершин и рёбер, которая определяет форму отображаемого многогранного объекта. В моём случае, каждая грань (полигон составляющей трёхмерную модель)

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

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

Задачей данной курсовой работы было подготовить трёхмерную модель к последующей работе путём исправления всех перечисленных дефектов автоматически восстановленной модели.

Практическое применение

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

Подготовка же модели торса необходима при работе с моделью пластического хирурга, так же как и модели лица.

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


Реализация

Для реализации поставленной задачи был выбран язык C#. Выбор обоснован возможностью быстрого создания прототипа на данном языке, и наличием необходимых математических библиотек. Для работы с текстурой была использована оболочка над известной библиотекой OpenCv, которая реализована на C++, OpenCvSharp[1].

OpenCvSharp была выбрана из трёх наиболее распространённых оболочек над OpenCv (EmguCv[2], OpenCvDotNet[3], OpenCvSharp[1]) по ряду причин. Во-первых, процент покрытия функций OpenCV у этой библиотеки достаточно высоко. Во-вторых, имеется полная документация, предоставленная разработчиками библиотеки. В-третьих, совместно с библиотекой, предоставляется большое количество примеров использования, что, несомненно, является большим плюсов при ознакомлении с технологией.

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

Для тестирования и просмотра результатов была использована обёртка над библиотекой OpenGl, реализованная на языке C# Tao Framework[2].


Решение задачи

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

Изначально модель имеет вид:

Рис. 1

Этапы делаются в следующем порядке:

1) удаление «бесполезных» полигонов

2) удаление несвязанных областей

3) отсечение плоскостями

Каждый из указанных этапов будет ниже рассмотрен подробнее.

Удаление «бесполезных полигонов»

Изначально модель, с которой ведётся работа, представляет собой замкнутый 3D объект, в котором присутствуют все полигоны, полученные из фотографии, а так же определённое замыкание произвольными полигонами, в тех местах, где данные отсутствуют. На приведённых изображениях такие полигоны имеют чёрный цвет и не несут никакой смысловой нагрузки. Зачастую, количество таких полигонов доходило до 65%, что при сильной детализации модели приводило к излишне большим объёмам данных (более чем в 2 раза относительно объема данных, полученном в результате исполнения этого этапа очистки). Этим обуславливается желание не хранить множество бесполезной информации, т.е. удалить все такие полигоны.

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

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

Результат на первом этапе достигается следующий:

Рис. 2

На картинке отмечены части, не относящиеся к основной модели и не связанны с ней. На удаление подобных частей будет направлен следующий этап.

Удаление несвязанных частей

Далее происходит удаление частей, не связанных с основной моделью.

Вся полигональная модель представляется в виде графа, имеющего несколько компонент связанности. Далее, поиском в ширину по графу находятся все его компоненты связанности.

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

Результат после данного этапа получается следующий.


Рис. 3

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

Для удаления этих ненужных элементов реализован третий этап.

Отсечение плоскостями

Эта часть очистки обусловлена тем, что при восстановлении модели, помимо необходимой части восстанавливается так же края, случайно попавшие в кадр. Так, для модели торса это руки, для модели головы – волосы и плечи.

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

В интерфейсе можно задать 2 числа, которые будут указывать процент полигонов, который надо отсечь каждой стороны.

Отсечение происходит следующим образом (алгоритм для отсечения плоскостью параллельной X = threshold, для любой другой оси аналогично)

1. Граничное значение высчитывается как vertices[(P/100)*n] .X, где vertices – упорядоченный по координате Х массив вершин, P – процент отсечения, n – количество элементов в массиве, .X – его Х-я координата.

2. Удаляются все вершины, значение Х координаты которых лежит за пределами граничного значения.

3. Треугольники, все три вершины которых удалены, удаляются целиком.

4. Если все три вершины не удалены – треугольник сохраняется

5. Если удалено две вершины, то этот треугольник удаляется, но добавляется новый, первой вершиной которого является неудалённая вершина старого треугольника, а две новые лежат на отрезке, соединяющем первую вершину с двумя удалёнными и имеющими Х координату равную граничному значению