Использование открытых исходных кодов для разработки 3D сканера и соответствующего программного обеспечения для 3D реконструкции моделей.
LVEE 2017
Введение и предпосылки
В настоящее время 3D-сканирование используется в различных сферах деятельности, таких как инженерный анализ, промышленный дизайн, цифровое архивирование, развлечение и игры, медицина и ортопедия и др. Множество конструкций современных 3D-сканеров можно разделить на два типа: лазерные и оптические. На текущий момент существуют свободные аппаратные реализации как лазерных1, так и оптических2 3D-сканеров. Однако нам довелось познакомиться с 3D-сканированием поближе при решении достаточно специфической задачи – в ходе разработки оптического 3D-сканера с возможностью сканирования объектов размерами до 3 метров, в связи с чем существующие свободные решения в их исходном виде были неприменимы.
При реализации проекта ставились следующие основные цели: относительно невысокая стоимость сканера, высокая скорость 3D-сканирования и реконструкции, использование открытых источников (исходные коды, библиотеки, SDK) для создания программного обеспечения управления 3D-сканером и работы с 3D-моделями.
Выбор метода 3D-реконструкции
Задача 3D-реконструкции объекта заключается в определении координат точек объекта в трехмерном пространстве – то есть в получении облака точек объекта. Существует множество различных технологий построения оптических 3D-сканеров: например, камера и поворотный стол3, различное количество камер (4 и более, между которыми помещают объект), камера и проектор, и другие. Нами была выбрана открытая технология Structed Light4 (метод структурной подсветки). В методе структурной подсветки задача реконструкции решается с помощью проектора и камеры: проектор проецирует на объект специальное изображение (структурная подсветка), а фотоаппарат регистрирует объект со специальным изображением (рис. 1).
Рис. 1 Выбранная конструкция 3D-сканера
Подробнее о разработке
В разработке 3D-сканера, соответствующего ПО к нему и, соответственно, в самом процессе сканирования можно выделить следующие элементы:
- Конструкция сканера. В разработанном сканере используются две камеры Canon серии EOS и LCD-проектор разрешением 1920×1080 пикселей. Выбранные камеры предоставляют возможность удаленного управления через интерфейс USB. Для написания клиентского приложения, управляющего камерами, использовался родной SDK Canon EOS5, реализованный на языке C.
- Калибровка. Калибровка 3D-сканера состоит из двух этапов: внутренней калибровки отдельных частей сканера, в результате которой рассчитываются фокусные расстояния и дисторсии камер и проектора, и внешней или геометрической калибровки установки, в результате которой мы получаем матрицы поворота и смещения для сопоставления системы координат проектора и камеры. Самым распространенным и простым способом калибровки камеры в данный момент считается метод Zhengyou Zhang6, основанный на использовании плоского шаблона в виде шахматной доски. Данный метод реализован в открытой библиотеке OpenCV7,8, распространяемой на условиях лицензии BSD (написана на C/C++, а также имеет биндинги для Python, Java, Ruby, Lua и др. популярных языков).
- Сканирование. Основным недостатком метода с использованием нескольких камер без проектора является сложность сопоставления точек двух изображений (т.е. определения координат одной и той же точки на одном и втором изображении). Точка должна обладать характерными особенностями, чтобы ее можно было однозначно идентифицировать. В методе структурной подсветки эта проблема решается за счет правильно подобранного проецируемого шаблона – в итоге мы получаем больше точек (в идеале – все освещенные проектором точки объекта) при меньшем количестве изображений. Т.е. основная задача состоит в выборе такого способа подсветки, который позволит однозначно определить, какая точка изображения проектора освещает точку объекта, зарегистрированную камерой. Мы выбрали для исследования серые коды, как более точные для декодирования. На объект проецируются серые коды для вертикальных и горизонтальных линий. В Structed Light есть реализация двух технологий декодирования: ray-ray (пересечение луча камеры и луча проектора) и ray-plane (пересечение луча камеры с плоскостью проектора). К преимуществам метода ray-ray следует отнести более высокую точность реконструкции в сравнении с методом ray-plane за счет использования как вертикальных, так и горизонтальных линий паттернов, что приводит к увеличению времени сканирования.
- 3D-реконструкция. Построение 3D-облака состоит из следующих этапов: декодирование, расчет оптических лучей камеры и проектора (для метода ray-ray) или расчет оптических лучей камеры и плоскости проектора (для метода ray-plane). Координата точки пересечения лучей камеры и проектора (или плоскости проектора) и является искомой координатой точки 3D-облака. Для работы с 3D-облаками используется Point Cloud Library (PCL)9 – кроссплатформенная открытая библиотека (Linux, MacOS, Windows и Android/IOS), которая также распространяется в условиях лицензии BSD. В данной библиотеке реализованы различные методы обработки 3D-облаков, такие как сглаживание, фильтрация, совмещения облаков и т.д. Данная библиотека позволяет сохранять 3D-облака в общеизвестных форматах (*.ply, *.obj, *.stl). Начиная с версии 1.8.0 PCL поддерживает распараллеливание расчетов некоторых алгоритмов на GPU. Результат 3D-реконструкции представлен на рис. 2.
Рис. 2 Пример 3D-реконструкции - Построение поверхности. Облако точек объекта дискретно, и размер точки определяется размером минимально различимого на изображении элемента – пикселя изображения. Чтобы получить данные о всей поверхности объекта, необходимо интерполировать пространство между точками некими поверхностями или функцией. В случае больших и сложных объектов интерполяция одной функцией невозможна. Поэтому обычно применяется интерполяция набором геометрических фигур – «кусочков» плоскостей. Самый простой способ – интерполяция треугольниками (триангуляция). Три точки треугольника однозначно определяют плоскость в пространстве. Для создания триангуляции мы использовали программу с открытым исходным кодом MeshLab10. Данная программа распространяется под лицензией GPLv2, имеет реализацию под Linux, Windows и MacOS и предоставляет большой функционал по обработке 3D-облаков и поверхностей.
Заключение
В заключении хотелось отметить, что использованные особенности конструкции и описанные программные компоненты позволилил создать 3D-сканер с высокой высокой точностью реконструкции (относительная погрешность порядка 1 мм), быстрой скоростью съемки и обработки данных (менее 1 минуты от начала процесса сканирования до получения результата).
Источники
1 http://www.instructables.com/id/DIY-Arduino-3D-Laser-Scanner/
2 http://www.makerscanner.com/docs/1-makerscanner.html
3 http://photopizza.ru/
4 http://mesh.brown.edu/byo3d/source.html
5 https://www.developersupport.canon.com
6 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf
7 http://opencv.org
8 http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html
9 http://pointclouds.org/
10 http://www.meshlab.net/#description
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Назад