## Реализация алгоритма 3D-сканирования на встроенном графическом ускорителе системы на кристалле
## Цель работы
Разработка алгоритма 3D-сканирования для одноплатного компьютера с ARM Mali GPU
## Задачи
* Разработка программного конвейра
* Разработка compute шейдера для нахождения контура на изобржение и преобразование его в множество точек
* Разработка compute шейдера для поворота контура
* Разработка compute шейдера для интерполяции 3D-модели
* Бенчмаркинг и определение узких мест в новой версии
* Сравнение производительности со старой имплементацией на OpenCV
## Описание алгоритма
Алгоритм на вход получает множество изображений с камеры, сделанных под разным углом поворота платформы. Для каждого изображения находится контур, который преобразуется в множество точек. Полученное множество точек записывается в файл, который в конечном содержит облако точек.

## Проблемы старой реализации
### Проблема
* Низкий параллелизм имплементации. Задача нахожденения контора для каждого кадра независима, что позволяет начинать работу с ним до завершения обработки предыдущего кадра
### Возможное решение
* Producer/consumer, где producer содержит очередь кадров. Возможно, что стоит обрабатывать за раз не одно изображение, а сразу тензор
### Проблема
* Алгоритм нахождения контура использует OpenCV и не использует GPU.
### Возможное решение
* Перенос алгоритма нахождения контура на GPU и доработка для повышения точности
### Проблема
* Для маленького угла поворота 3D-модель содержит избыточное количество точек, из-за чего обьем занимаемого диского пространства файлом может достигать неадекватного значения.
### Возможное решение
* Добавление этапа пост-обработки для повышения качества модели и уменьшения модели
### Проблема
* Для большого угла поворота 3D-модель содержит мало точек, из-за чего модель больше похоже на очертание обьекта
### Возможное решение
* Также добавление этапа с интерполяцией в конце
## Схема новой реализации

## Mali GPU architecture

## Текущие задачи
* Разработка compute шейдера для нахождения контура
* Разработка compute шейдера для поворота точек
## Будущие задачи
* Разработка compute шейдера для интерполяции модели
* Обьедение всех шейдеров в один конвейр с максимальной утилизацией
* Бенчмаркинг и определение узких мест в новой версии
* Дальнейшая оптимизация
# Материалы
* [Compute Shaders - Vulkan Guide](https://vkguide.dev/docs/gpudriven/compute_shaders/)
* [ARM compute shaders](https://developer.arm.com/documentation/100587/0100/compute-shaders/about-compute-shaders)
* [ARM Mali GPU Architecture paper](https://armkeil.blob.core.windows.net/developer/Files/pdf/graphics-and-multimedia/Mali_GPU_Architecture.pdf)
* [Arm Mali GPUs Best Practices Developer Guide](https://armkeil.blob.core.windows.net/developer/Arm%20Developer%20Community/PDF/Arm%20Mali%20GPU%20Best%20Practices.pdf)