iOS Image Manipulation (Искажение) - PullRequest
4 голосов
/ 17 февраля 2012

Изначально я подошел к этой проблеме, имея в виду CoreImage (потому что мне также нужно распознавать лица), но понял, что, к сожалению, фильтры искажения CI еще не включены в iPhone.

Я попытался погрузиться в GLImageProcessing, CImg и ImageMagick, хотя у меня было много проблем с поиском отправной точки для изучения любого из них.

Учитывая количество приложений, которые искажают изображение, я знаю, что это не может быть невероятно сложно.

Я не знаю C или C ++, и у меня нет времени изучать эти языки, если в этом нет крайней необходимости. Это станет необходимым, если одна из этих библиотек является окончательной библиотекой для выполнения этой задачи.

Кто-нибудь имеет опыт работы с любой из этих библиотек?

Какие-нибудь книги, которые касаются этого специально для iOS5?

Ресурсы, которые я нашел:

1 Ответ

14 голосов
/ 18 февраля 2012

Как вы говорите, текущие возможности Core Image на iOS немного ограничены. В частности, нехватка пользовательских ядер, которые вы найдете на рабочем столе, разочаровывает. Другие альтернативы, которые вы перечисляете (за исключением GLImageProcessing, который не сможет выполнять такую ​​фильтрацию), - это библиотеки с привязкой к ЦП, и они будут слишком медленными для выполнения фильтрации в реальном времени на мобильном устройстве.

Однако я могу указать вам на фреймворк с открытым исходным кодом под названием GPUImage , который я только что развернул, потому что не смог найти что-то, что позволило бы вам создавать пользовательские эффекты. Как видно из названия, GPUImage выполняет ускоренную обработку графических процессоров неподвижных изображений и видео с использованием шейдеров OpenGL ES 2.0. Вы можете написать свои собственные эффекты, используя их, так что вы сможете делать практически все, что только можете придумать. Сам фреймворк - Objective-C и имеет довольно простой интерфейс.

В качестве примера фильтра искажения, следующий шейдер (на основе кода в ответ Дэнни Пфлюгофта ) выполняет эффект «рыбий глаз»:

varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;

const mediump float bulgeFactor = 0.5;

void main()
{
    mediump vec2 processedTextureCoordinate = textureCoordinate - vec2(0.5);
    mediump float radius = processedTextureCoordinate.x * processedTextureCoordinate.x + processedTextureCoordinate.y * processedTextureCoordinate.y;
    mediump vec2 distortedCoordinate = vec2(pow(radius, bulgeFactor)) * processedTextureCoordinate + vec2(0.5);

    gl_FragColor = texture2D(inputImageTexture, distortedCoordinate);
}

Создает такой эффект для видеопотока:

Fisheye effect filter

В моих тестах GPUImage обрабатывает изображения в 4 раза быстрее, чем Core Image на iPhone 4 (в 6 раз быстрее, чем обработка с привязкой к процессору), а видео в 25 раз быстрее, чем Core Image (в 70 раз быстрее, чем на процессоре). Даже в самом худшем случае, который я мог бы бросить, он соответствует Core Image по скорости обработки.

Фреймворк все еще довольно новый, так что количество стоковых фильтров, которые у меня там сейчас, невелико, но я добавлю кучу в ближайшее время. Тем временем вы можете написать свои собственные шейдеры искажения для обработки ваших изображений, а исходный код для всего, что вы можете настроить по мере необходимости. В моем вводном посте об этом есть немного больше подробностей о том, как использовать это в своих приложениях.

...