AstraScanner2
**Программное обеспечение для 3D сканирования и реконструкции с открытым исходным кодом**
[](https://www.microsoft.com/windows)
[](https://www.qt.io/)
[](LICENSE.MD)
[Обзор](#обзор) • [Функциональность](#функциональность) • [Сборка](#сборка) • [Использование](#использование) • [Документация](#документация)
Обзор
AstraScanner2 — это приложение с открытым исходным кодом для 3D сканирования и реконструкции с использованием RGB-D камер. Программное обеспечение захватывает облачные точки с камеры Astra Pro (или в режиме эмуляции) и предоставляет инструменты для обработки, фильтрации, реконструкции меша и регистрации множественных сканов.
Основные возможности
- ✅ Реальное 3D сканирование с камерой Astra Pro
- ✅ Оптическое отслеживание на основе круговых маркеров (CCTag)
- ✅ Оценка позы с помощью ИИ с ONNX Runtime
- ✅ Продвинутая фильтрация и очистка облачных точек
- ✅ Реконструкция поверхности Пуассона для замкнутых мешей
- ✅ Регистрация ICP для объединения множественных сканов
- ✅ Управление проектами с постоянным хранением
- ✅ Экспорт в несколько форматов (PLY, STL, OBJ, PCD)
Функциональность
GPU-ускорение (CUDA, опционально)
При сборке с -DASTRA_ENABLE_CUDA=ON и наличии NVIDIA GPU (CC 5.0+):
- VoxelGrid — децимация облака через Thrust
sort_by_key + reduce_by_key
- NormalEstimation — оценка нормалей через cell-based PCA на GPU
- SOR — Statistical Outlier Removal через cell-based KNN
- ROR — Radius Outlier Removal через cell-based radius search
- NeuralTracker — инференс ONNX через
CUDAExecutionProvider
При отсутствии GPU — автоматический fallback на CPU PCL.
📸 3D Сканирование
- Захват в реальном времени с RGB-D камеры (Astra Pro с OpenNI2)
- Режим эмуляции для тестирования без оборудования
- Контроль глубины (настраиваемые минимальные/максимальные расстояния)
- Пропуск кадров для оптимизации производительности
- Поток RGB/Глубины с живым предпросмотром
🔍 Отслеживание на основе маркеров
- Обнаружение CCTag - надежные круговые кодовые маркеры
- Карта маркеров для оценки позы объекта
- Отслеживание уникального ID (ID 0-99 на маркер)
- Устойчивость к перекрытию с субпиксельной точностью
- Режим поворотного стола для автоматического сканирования 360°
🧠 Отслеживание с нейронной сетью
- Модель ONNX для оценки позы
- Поддержка ускорения GPU (опционально)
- Обнаружение ключевых точек для идентификации маркеров
- Уточнение позы с помощью глубокого обучения
🧹 Обработка облачных точек
| Фильтр |
Описание |
| Воксельная сетка |
Уменьшение размера с настраиваемым размером ячейки |
| SOR (Статистический) |
Удаление статистических выбросов |
| ROR (Радиусный) |
Удаление выбросов на основе радиуса |
| Магическая палочка |
Комбинация SOR + Воксельная сетка |
| Удаление фона |
Сегментация плоскости для удаления поверхности стола |
| Рост региона |
Сегментация главного объекта путем кластеризации |
🏗️ Реконструкция поверхности
- Реконструкция поверхности Пуассона - создает замкнутые меш-сетки
- Оценка нормалей с настраиваемым радиусом поиска
- Ориентация нормалей на основе точки обзора
- Распространение BFS для согласованной ориентации
- Опция переворота нормалей для коррекции
🔗 Регистрация множественных сканов
- Регистрация ICP (Iterative Closest Point)
- Последовательное объединение с эталонным якорем
- Проверка сходимости с опцией пропуска
- Финальное упрощение вокселями для контроля размера
🎨 Постобработка меша
- Сглаживание (vtkSmoothPolyDataFilter) - снижает шум и неровности, уважает топологию меша
- Упрощение меша - уменьшает количество полигонов
- Заполнение отверстий - закрывает пробелы в меше
- Базовая постобработка меша для недеструктивного рабочего процесса
📂 Управление проектами
- Метаданные JSON для структуры проекта
- Хранение PLY для облачных точек
- Множественные сканы на проект
- Функция переименования/изменения порядка
- Сохранение/Загрузка полного состояния проекта
📤 Экспорт
| Формат |
Описание |
| PLY |
Stanford Polygon (облачные точки и меш-сетки) |
| PCD |
Данные облачных точек (формат OpenCV) |
| STL |
StereoLithography (3D печать) |
| OBJ |
Wavefront OBJ (меш с материалами) |
Системные требования
Минимальное оборудование
- CPU: Intel Core i5 или аналог
- RAM: минимум 8 ГБ (рекомендуется 16+ ГБ)
- GPU: Выделенный GPU с OpenGL 3.2+ (для визуализации VTK)
- Хранилище: 50 ГБ свободного места
Поддерживаемая камера
- Orbbec Astra Pro (с OpenNI2 SDK)
- Режим эмуляции: Работает без камеры с использованием синтетических данных
Сборка из исходного кода
Предварительные требования
- CMake 3.22 или выше
- Visual Studio 2019/2022 с поддержкой C++
- vcpkg менеджер пакетов
- Python 3.8+ (для генерации маркеров)
Зависимости (через vcpkg)
# Установка зависимостей
vcpkg install cctag pcl vtk opencv4 qtbase --triplet x64-windows
Шаги сборки
- Клонировать репозиторий
git clone https://gitverse.ru/klischa/AstraScanner2.git
cd AstraScanner2
- Настроить с помощью CMake
cmake -S . -B build `
-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake
- Собрать проект
cmake --build build --config Release
- Запустить приложение
.\build\Release\AstraScanner.exe
Примечание: репозиторий называется AstraScanner2, а имя исполняемого файла
в текущей конфигурации сборки — AstraScanner.exe.
Сборка с поддержкой OpenNI2
Для включения поддержки камеры Astra Pro:
cmake -S . -B build `
-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake `
-DOPENNI2_ROOT="C:/orbbec/OpenNI_2.3.0.86_202210111950_4c8f5aa4_beta6_windows/Win64-Release/sdk"
cmake --build build --config Release
Автоматические задачи после сборки
Система сборки автоматически копирует:
- Плагины платформы Qt (
platforms/)
- DLL-файлы runtime vcpkg
- DLL ONNX Runtime (
onnxruntime.dll)
- OpenNI2 SDK (если включен)
- Модель ИИ (
models/pose_regressor.onnx)
- Директория данных (
data/)
Руководство по использованию
Первый запуск
- Запустить приложение
.\build\Release\AstraScanner.exe
- Создать новый проект
- Файл → Новый проект
- Выбрать директорию проекта
- Ввести название проекта
- Настроить сканер
- Настройки → Параметры…
- Установить диапазон глубины (например, 0.3-1.5 метра)
- Настроить размер вокселя (0.005 = 5 мм)
- Установить пропуск кадров для производительности
Рабочий процесс сканирования
Базовое сканирование
- Нажмите кнопку “Сканировать” для начала
- Двигайте объект или камеру
- Нажмите “Стоп” при завершении
- Предпросмотр результата в 3D просмотрере
Режим поворотного стола
Для сканирования 360° с вращающимся поворотным столом:
- Включите флажок “Поворотный стол”
- Установите количество сканов (например, 4 оборота)
- Установите интервал между сканами (например, 5 секунд)
- Нажмите “Сканировать” и дождитесь завершения
Отслеживание на основе маркеров
- Распечатайте маркеры CCTag (см. Руководство по маркерам)
- Закрепите маркеры на поворотном столе или объекте
- Перейдите в Настройки → Параметры
- Установите размер маркера и тип детектора
- Используйте режим отслеживания “На основе маркеров”
Рабочий процесс обработки
- Применить фильтры (Настройки → Параметры → Фильтры)
- Реконструировать меш (вкладка Обработка → Poisson)
- Объединить сканы, если существует несколько сканов
- Сгладить/упростить меш по мере необходимости
- Экспортировать в нужный формат
Рабочий процесс экспорта
- Выберите скан из списка проекта
- Нажмите кнопку “Экспорт”
- Выберите формат (PLY/STL/OBJ/PCD)
- Сохраните в нужное местоположение
Настройка камеры
Конфигурация Astra Pro
- Установить OpenNI2 SDK
- Скачать с сайта Orbbec
- Установить с поддержкой драйвера
- Настроить OpenNI2 в CMake
-DOPENNI2_ROOT="C:/orbbec/OpenNI_2.3.0.86_202210111950_4c8f5aa4_beta6_windows/Win64-Release/sdk"
- Проверить камеру
- Приложение должно обнаружить Astra Pro
- Зеленый индикатор статуса = камера активна
- Если активируется режим эмуляции, проверьте установку драйвера
Режим эмуляции
Если камера не подключена, приложение автоматически переходит в режим эмуляции и генерирует синтетические тестовые кадры.
Руководство по маркерам (CCTag)
Что такое маркеры CCTag?
Маркеры CCTag (Circular Code Tag) - это круговые сигнальные маркеры с уникальными ID. Они обеспечивают:
- Уникальную идентификацию (IDs 0-99 на маркер)
- Надежное обнаружение при частичном перекрытии
- Субпиксельную точность для оценки позы
- Ориентацию по черному внешнему кольцу
Генерация маркеров
Предварительные требования
Генерация сетки маркеров (A4)
# Маркеры с 3 кольцами (ID 0-29, 2 на ID)
cd markers
python generate_markers_grid.py --rings 3 --addId --generatePdf --generatePng
# Маркеры с 4 кольцами (ID 0-29, 2 на ID)
python generate_markers_grid.py --rings 4 --addId --generatePdf --generatePng
Генерация индивидуальных маркеров
# 100 маркеров с 3 кольцами
python generate.py --rings 3 --num 100 --outdir markers3 --margin 100 --addId
# 100 маркеров с 4 кольцами
python generate.py --rings 4 --num 100 --outdir markers4 --margin 100 --addId
Характеристики маркеров
| Параметр |
3-Кольцевой |
4-Кольцевой |
| Сектора |
24 |
32 |
| Максимальный ID |
16,777,215 |
4,294,967,295 |
| Рекомендуемый размер |
60-100 мм |
60-100 мм |
| Рекомендуемое расстояние |
0.5-3 м |
0.5-5 м |
Рекомендации по печати
- Используйте матовую бумагу для снижения отражений
- Высокое разрешение (минимум 300 DPI)
- Проверьте размер перед резкой
- Закрепите на неразъемной поверхности
Использование маркеров в приложении
- Настроить параметры маркеров (Настройки → Параметры)
- Размер маркера (например, диаметр 300 мм)
- Тип детектора: CCTag
- Количество колец: 3 или 4
- Минимальная вероятность идентификации: 1e-6
- Разместите маркеры на объекте или поворотном столе
- Начните сканирование - маркеры будут автоматически обнаружены
- Используйте отслеживание на основе маркеров для стабильной оценки позы
Файлы конфигурации маркеров
- Рабочая конфигурация приложения:
data/marker_disk_config.json
- Пример конфигурации:
marker_disk_config.example.json
Приложение читает именно файл из data/. Если вы меняете параметры диска
или детекции, редактируйте этот файл.
Устранение неполадок
Приложение не запускается
Проблема: Отсутствуют DLL-файлы или папка platforms
Решение:
- Пересобрать проект
- Проверить, что
build/Release/ содержит:
- папку
platforms/
- файл
onnxruntime.dll
- все DLL-файлы vcpkg
Камера не обнаружена
Проблема: Активируется режим эмуляции вместо Astra Pro
Решения:
- Проверить установку OpenNI2 SDK
- Проверить путь OpenNI2 в конфигурации CMake
- Убедиться, что драйверы Orbbec установлены
- Проверить диспетчер устройств на наличие Astra Pro
Маркеры не обнаружены
Проблема: Детектор CCTag не находит маркеры
Решения:
- Увеличить размер маркера (минимум 30 пикселей радиус)
- Улучшить освещение
- Использовать 4-кольцевые маркеры для лучшей надежности
- Уменьшить расстояние до камеры
- Проверить качество печати маркеров
Плохое качество сканирования
Проблема: Зашумленное или редкое облачное облако
Решения:
- Уменьшить размер вокселя (например, 0.003 = 3 мм)
- Настроить диапазон глубины ближе к объекту
- Уменьшить пропуск кадров для большего количества кадров
- Применить фильтры SOR/ROR после захвата
- Убедиться в хорошем освещении объекта
Низкая производительность
Проблема: Низкий FPS или высокое использование CPU
Решения:
- Увеличить пропуск кадров (например, 5-10)
- Увеличить размер листа вокселя
- Отключить цветную камеру, если не требуется
- Использовать GPU для ONNX, если доступно
- Закрыть другие приложения
Документация
Дополнительные ресурсы
Структура проекта
Файлы вида *REPORT.md и исторические .yaml-артефакты являются
служебными/историческими материалами и не считаются основным источником
актуальной документации по сборке и использованию.
AstraScanner2/
├── CMakeLists.txt
├── README.md
├── README-DEV.md
├── TESTS.md
├── MARKERS.md
├── KNOWN_LIMITATIONS.md
├── data/
├── models/
├── src/
│ ├── main.cpp
│ ├── gui/
│ ├── controllers/
│ ├── capture/
│ ├── calibration/
│ ├── filters/
│ ├── services/
│ ├── marker_tracker/
│ ├── tracking/
│ ├── project/
│ ├── export/
│ ├── settings/
│ └── models/
├── tests/
├── aiservice/
├── deploy/
└── markers/
Начиная с текущей архитектуры проект разделён на три уровня:
- binders — собирают крупные UI-блоки,
- controllers — управляют пользовательскими flow и асинхронным orchestration,
- services — реализуют прикладную обработку облаков, регистрацию и реконструкцию.
Ключевые классы
| Класс |
Назначение |
MainWindow |
Тонкий UI-shell: связывает вкладки, контроллеры и состояние интерфейса |
ProjectUiController |
Диалоги и пользовательские сценарии проекта/экспорта |
CaptureSessionController |
Жизненный цикл захвата: thread, worker, сигналы, запуск/остановка |
ProcessingController |
Асинхронный orchestration обработки, реконструкции и merge-операций |
ViewerCoordinator |
Координация main/proc viewer и переключение cloud/mesh display |
TurntableController |
Flow логики режима поворотного стола |
AstraCamera |
Драйвер камеры (OpenNI2 + эмуляция) |
CaptureWorker |
Фоновый pipeline захвата и трекинга |
PointCloudFilters |
Совместимый facade над сервисами обработки |
CloudFiltersService |
Очистка и постобработка облаков точек |
RegistrationService |
ICP-регистрация и merge сканов |
ReconstructionService |
Poisson-реконструкция поверхности |
MeshProcessingService |
Сглаживание, упрощение и заполнение дыр в меше |
ProjectManager |
Постоянство проекта и сериализация метаданных |
ExportManager |
Экспорт облаков и мешей в файлы |
MarkerTracker |
Управление детекторами маркеров |
NeuralTracker |
Оценка позы ИИ через ONNX Runtime |
SettingsManager |
Централизованное хранилище настроек приложения |
Разработка
Запуск тестов
# Настройка тестов
cmake -S . -B build_test `
-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake `
-DAstraScanner_BUILD_TESTS=ON
# Сборка тестов
cmake --build build_test --config Release
# Запуск всех тестов
ctest -C Release -V
Добавление новых функций
- Создать ветку функции
- Реализовать в соответствующей поддиректории
src/
- Добавить юнит-тесты в
tests/
- Обновить документацию
- Отправить pull request
Стиль кода
- Стандарт C++17
- Соглашения по коду Qt
- Комментарии Doxygen для публичных API
- Реализации, безопасные для потоков
Лицензия
MIT Лицензия - см. LICENSE.MD для подробной информации.
Благодарности
Зависимости
- Qt6 - Прикладной фреймворк
- OpenCV - Компьютерное зрение
- PCL - Библиотека облачных точек
- VTK - Инструмент визуализации
- ONNX Runtime - Инференс нейронных сетей
- CCTag - Обнаружение маркеров
- Eigen3 - Линейная алгебра
- vcpkg - Управление зависимостями
Авторы
- Команда AstraScanner
- Внесли вклад Klischa и другие
Список изменений
v1.1.0 (Текущая версия)
- GPU-ускорение (CUDA): VoxelGrid, NormalEstimation, SOR, ROR через Thrust
- Neural + ICP confirm: подтверждение нейросетевой позы итеративным ICP
- Surfel Coverage Tracker: оценка качества покрытия поверхности (угловое, стабильность)
- Quality Heatmap: визуализация качества сканирования в реальном времени
- Контекстная справка: встроенный HelpDialog с поиском по якорям
- Исправления: 30+ багов (потокобезопасность, падения, маркеры, CUDA, сборка)
v1.0.0
- Полная функциональность 3D сканирования
- Обнаружение и отслеживание маркеров CCTag
- Оценка позы с нейронной сетью
- Реконструкция поверхности Пуассона
- Регистрация ICP множественных сканов
- Система управления проектами
- Экспорт в PLY/STL/OBJ/PCD
- Комплексный набор фильтров
- Режим автоматизации поворотного стола
**Приятного сканирования! 🚀**
[Репозиторий](https://gitverse.ru/klischa/AstraScanner2) •
[Лицензия](/LICENSE.MD)