как можно из картинки панорамы сделать обычную картинку? То есть программой убрать искривление. Я думал над этим и по идее может сработать, если по картинке двигать каждый пиксель по определённой формуле. Может кто знает как двигать эти пиксели в картинке? В гугле уже 3 день ничего подобного именно на языке свтфт не могу найти. Там есть изменение цвета в пикселе, но не его движение относительно своей системы координат
Если можно менять цвет пикселя, то можно сделать так чтобы цвет менялся на цвет следующего, и по сути оно сдвигаться будет
Сделать цикл для каждого пикселя
Кстати неплохая идея, можно попробовать, так как размер итоговой картинки не должен меняться
Тебе прямая дорога в мир Metal, там можно творить чудеса. Гугли, точно не подскажу, не работал с ним так глубоко
Знаю про метал, но не знаю можно ли с помощью этой технологией сделать что-то подобное
Сказу точнее RenderKit
Почитаю, спасибо
Вопрос интересный. Начать нужно с определения проекции используемой при построении панорамы. В большинстве случаев это равнопромежуточная проекция(aka сферическая или equirectangular). Соответственно тебе нужно замапить это дело в обычную гномоническую проекцию(gnomonic или rectilinear) Теперь уже можно составить нормальный запрос в гугле по типу: convert(map) equirectangular projection to rectilinear projection В целом этот процесс состоит из нескольких этапов(большая часть из которых есть в книге , глава 9.1.6) - - определить используя координаты пикселей панорамы соответствующие сферические координаты; - из сферических координатов вида (sinθ, h, cosθ) определить θ и h; - получить 2D координаты (x, y) на сфере использую полученные θ и h - - сделать билинейную интерполяцию между начальными пикселями и новыми. Реализацию этих шагов можно найти на гитахабе по тем же ключевым словам: equirectangular to rectilinear Но свифта там конечно же не будет - это сильно нишевая задача. --- Касаемо реализации на свифте. Тут у тебя два выбора, это Accelerate: vImage + vDSP , либо Metal. Но Metal можно сразу отбросить, ибо это голое апи, которое нужно во-первых знать(а на это уйдёт много времени), во-вторых придётся написать поверх часть нужных вещей, которые уже есть в Accelerate. В Accelerate перегонишь CGImage в vImage.PixelBuffer, важно это сделать без копирования. Примеры в доке есть. vImage.PixelBuffer предоставляет готовые операции по работе с битмапом, их много, но этого тебе будет недостаточно для всех шагов указанных выше. Придётся поработать ещё с функциями vDSP из того же Accelerate. Они позволят выполнить ещё ряд математических операций над векторами. Не забывай при работе с vDSP, что память в vImage.PixelBuffer выровнена по кэш-линиям процессора и нужно учитывать соотвествующий alignment в строке(в доке тоже это есть). --- Функции Accelerate работают только с указателями и сами распараллелят работу по ядрам. Это нАмного быстрее чем делать такую работу в обычном for loop(даже если учесть что компилятор сможет векторизовать часть циклов) конечно не варинат, сюда можешь даже не смотреть.
Привет! Как жизнь? Куда пропадал?
Привет. Творческий отпуск : )
Обсуждают сегодня