Picamera и фотограмметрияС Новым годом! В прошлом году ко мне несколько раз обращались за консультацией по вопросу использования Raspberry Pi для получения 3D моделей. Хотя поставившие вопрос исчезли не попрощавшись, задача мне показалась интересной, я начал экспериментировать. В общем виде проблему можно сформулировать как подбор оптимальных объективов и точек съемки для получения серии снимков, пригодных для фотограмметрии. Предполагалось, что будет использовано несколько камер и система для их перемещения. Меня в первую очередь интересовала установка и методика для поиска оптимального расположения камер и целесообразность использования объективов рыбий глаз для уменьшения габаритов установки. Сколько камер и как автоматизировать процесс. Поскольку потенциальные заказчики исчезли, то для работы предполагалось использовать только имеющееся оборудование и программное обеспечение с открытым исходным кодом. В результате, экспериментальная установка была создана, и ниже приведенная статья является для меня шпаргалкой по решению возникавших проблем по ее эксплуатации. В предыдущих двух описанных мной сканерах в статье «3D сканеры Ciclop и Piclop» использовался вращающийся стол. Однако, это не самое удобное устройство для получения серии фотографий для фотограмметрии. С ним у нас получаются снимки объекта с разных сторон, но фон при этом остается постоянным и это сбивает программу с толку. Необходимо либо делать очень ярко освещенный фон, который будет восприниматься на фотографии как равномерно белый, либо его ретушировать, обрабатывая каждую фотографию. Поэтому для получения серии снимков была создана из имеющихся фото кубиков для панорамной съемки установка, при которой камера вращалась вокруг объекта. Установка управлялась по Bluetooth с телефона с помощью программы на De Re BASIC! (с тех пор у языка сменился главный разработчик и в Play Маркет это просто BASIC!) приведенной в моей старой статье. Управление камерой может осуществляться любой из программ, описанных и приведенных в статье «Picamera и дистанционная съемка с живой картинкой». Объективов для Raspberry Pi у меня много, однако только на
некоторых из них написано фокусное расстояние. Поэтому чтобы
приблизительно определить фокусное расстояние, я воспользовался
возможностями калибровки по снимкам шахматной доски из
пакета opencv. Тут возможны два варианта: можно воспользоваться
функцией cv2.fisheye.calibrate и получить фокусное расстояние в
пикселях и 4 коэффициента дисторсии относительно идеальной
геометрии рыбий глаз, или функцией cv2.calibrateCamera,
которая кроме фокусного расстояния дает нам 5 коэффициентов
дисторсии по модели Брауна-Конради. Мы знаем размер матрицы в мм и
размер снимка в пикселях и, следовательно, можем легко
вычислить фокусное расстояние в мм. Для большинства объективов обе
программы дают близкий результат для фокусного расстояния и,
естественно, совершенно разные коэффициенты. calibration_fisheyefmm.py:
# -*- coding: utf-8 -*- calibration.py:
#!/usr/bin/env python ''' camera calibration for distorted images with chess board samples reads distorted images, calculates the calibration usage: calibrate.py [--debug В программе meshroom тоже есть возможность провести калибровку
камеры выбрав в редакторе графов, при нажатой правой кнопке мыши,
пункт CameraCalibration. Далее надо задать папку, в которой
лежат снимки шахматной доски и число клеток в ней. Можно задать и
число коэффициентов дисторсии, но в моей версии программа на это
не реагирует и вычисляет только 3 коэффициента. Результаты
калибровки будут записаны в файл
/MeshroomCache/CameraCalibration/XXXX/cameraCalibration.cal.txt. В дальнейшем, фокусное расстояние и коэффициенты надо будет занести вручную в CameraInit. AliceVision использует фокусное расстояние как ориентир для дальнейшего уточнения и по умолчанию попытается взять фокусное расстояние в мм из заголовка Exif. По умолчанию Raspberry Pi записывает в Exif данные о матрицы, а объектив считает стандартным с фокусным расстоянием 3,6 мм. Реальное значение объектива можно записать программой exiftool, запустив ее в папке с фотографиями. Если используется несколько камер, то надо задать каждой свой серийный номер. exiftool -Make=RaspberryPi -model=RP_OV5647 -FocalLength='3.4' -serialnumber=1002 *.* Поскольку моему компьютеру уже более 10 лет: (Processor : 2x Intel(R) Core(TM)2 Duo CPU E8500 @ 3.16GHz, Memory : 6109MB, GPU : GeForce GTS 450), то предполагалось использовать программу Meshroom/AliceVision версию от 2019 года, поскольку версия 2020 года уже отказывался работать с моей видеокартой. На сайте Хабр есть хороший перевод статьи John Hable "AliceVision: фотограмметрия из командной строки". Там описывается работа с версией 2018 года, она мало отличается по интерфейсу от следующей. Некоторые замеченные мной отличия я отмечу ниже. Программа Meshroom является графическим интерфейсом, написанным на Python для пакета AliceVision. Запускается командой LD_LIBRARY_PATH=/usr/lib/nvidia-384 ./Meshroom, где nvidia-ХХХ папка с драйверами на вашем компьютере. Выполняемые команды отображаются в виде прямоугольников в окне программы. Щелчок по прямоугольнику открывает окно настройки параметров. Можно нажать кнопку Start и начнется последовательное выполнение команд. Команду можно выполнить отдельно нажав правую клавишу мыши на соответствующем прямоугольнике и выбрав в меню пункт Compute. Дополнительные задачи могут быть добавлены, если нажать правую клавишу мыши на пустом месте и из выпадающего меню выбрать необходимую команду, например, CameraCalibration. CameraInit. Интересен для нас тем, что
позволяет задать уточнить фокусное расстояние, тип объектива,
количество параметров дисторсии. FeatureExtraction. Извлекает из изображения
характерные черты. По-английски это SIFT (Scale invariant feature
transform) или по-русски масштабно-инвариантная
трансформация признаков. После выполнения операции, если
нажать на кнопочку Display Features, то можно увидеть и точки,
которые программа выбрала как характерные. Можно выбрать способ
отображения в виде точек или повернутых квадратов разных размеров.
И таким образом оценить, где могут понадобится дополнительные
снимки и, возможно, проекция сетки. ImageMatching. Вычисляет, какие из изображений
логично сопоставлять друг с другом. FeatureMatching. Ищет соответствия между
изображениями. StructureFromMotion. Важный пункт для оценки
пригодности добавленных снимков. После его выполнения программа
показывает рассчитанное положение камер и положения
характерных точек в пространстве. PrepareDenseScene. Устраняет дисторсию в снимках
и складывает в папку, где их можно посмотреть и оценить.
Адрес папки в последней строке свойств. DepthMap. Вычисляет карту глубин для каждого снимка. Этот процесс выполняется GPU, и температура моей видеокарты при этом поднимается на 30 градусов до 73 градусов.
В результате получается два снимка в формате EXR: ХХХdepthMap.exr
и ХХХ simMap.exr. При преобразовании в JPEG файла depthMap.exr я
отредактировал уровни для восприятия глазом. DepthMapFilter. Карты глубин разных снимков
перекрываются. В этом пункте осуществляется принудительное
согласование. Eсли у нас достаточно много характерных точек и они равномерно
распределены, можно обойтись и без карты глубин и сразу попытаться
построить трехмерную модель. В этом случае области, для которых
могла быть построена корректная карта глубин, но для которых нет
характерных точек, пропадут. Однако, для предварительной
быстрой оценки это может быть полезно. Meshing. Генерируется полигональная сетка,
называемая на жаргоне меш (от английского polygon mesh).
Дважды шелкнув по прямоугольнику, ее можно рассмотреть и оценить. MeshFiltering. Сглаживание, устранение больших
треугольников. MeshDecimate. Дополнительная операция, упрощающая сетку. Texturing. Создаёт UV и проецирует текстуры. Сравним финальные результаты в случаях, когда мы использовали карту глубин и когда нет.
Таким образом, есть установка для съемки и программа для
получения 3D модели. Я сделал и обработал более 100 снимков.
Теперь, убирая снимки, надо выяснить, какие из них избыточны и
практически не влияют на качество получаемой модели. Кроме того,
вероятно, не все заданные параметры обработки оптимальны. Для
выяснения всего этого нужны большие вычислительные мощности. Если
я не обновлю свою технику, то скорых результатов и продолжения
этой статьи ждать не приходится. В моих дальнейших планах также
эксперименты с проецируемой сеткой для объектов, на поверхности
которых трудно выделить характерные точки.
24.01.2021
Установите проигрыватель Flash
|
Облако тегов:
...
|