Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим...

29
Максим Решетей ведущий iOS разработчик Coub Наложение видеоэффектов с OpenGL ES 2.0 with Shaders 1

Transcript of Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим...

Page 1: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Максим Решетей

ведущий iOS разработчик

Coub

Наложение видеоэффектов с OpenGL ES 2.0 with Shaders

1

Page 2: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

2

Page 3: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Что такое Coub- Короткие зацикленные видео-ролики со звуком

- Источники: камера, Youtube, Vimeo

- Шеринг в социальные сети

3

Page 4: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Повседневные задачи- Гибкая архитектура

- Обработка данных (download/upload)

- Сложные интерфейсы

- Видео/аудио обработка

4

Page 5: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Обработка видеоProcess

Process

Process

Process5

Page 6: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Виды цифровой обработки

6

- Распознавание образов/текста

- Задачи классификации

- Нейронные сети

- Геометрические преобразования

- Цветовая коррекция

- Наложение эффектов

Page 7: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Обработка изображения

ДЛЯ каждой точки

Color(x, y) = A(x, y)

где A - выбранный алгоритм

0 N

0

N

7

Page 8: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

0

N

0 N

Осветление

ДЛЯ каждой точки

RGB = R+С, G+С, B+С

где С - константа

8

Page 9: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Ч/б фильтр

ДЛЯ каждой точки

RGB = (R+G+B)/3

0

N

0 N

9

Page 10: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Другие популярные фильтрыPixelation Posterization

10

Page 11: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Другие популярные фильтрыHDR Blur

11

Page 12: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Блюр в Coub iOS

12

Page 13: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Размытие по Гауссу (блюр)

где

x, y - координаты точки изображения (пикселя)

𝞼 - стандартное отклонение распределения Гаусса (радиус блюра)

G(x, y) = 12πσ 2

e− x

2+y2

2σ 2

13

Page 14: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Размытие по Гауссу- Вершина колокола - обрабатываемый пиксель

- Значение пикселя - средне-взвешенное значение по окрестности

- Учитываются только пиксели в районе 3𝞼 (правило трех сигм)

14

Page 15: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Размытие по Гауссу, общий алгоритм

1. Построение матрицы свертки размером 3𝞼

2. ДЛЯ каждой точки изображения

Вычисляем средне-взвешенное значение цвета точки по окрестности, используя матрицу свертки.

Note: На практике используют массив вместо матрицы, для достижения O(n)

15

Page 16: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

ШАГ 1 - Построение матрицы свертки A

- A[x,y] =

- Размер матрицы 7x7 (3*2.5)

- Равномерное распределение

0.0000 0.0000 0.0001 0.0003 0.0001 0.0000 0.0000

0.0000 0.0007 0.0065 0.0133 0.0065 0.0007 0.0000

0.0001 0.0065 0.0547 0.1109 0.0547 0.0065 0.0001

0.0003 0.0133 0.1109 0.2250 0.1109 0.0133 0.0003

0.0001 0.0065 0.0547 0.1109 0.0547 0.0065 0.0001

0.0000 0.0007 0.0065 0.0133 0.0065 0.0007 0.0000

0.0000 0.0000 0.0001 0.0003 0.0001 0.0000 0.0000

-3 0 3-2 -1 21

0

-1

-2

-3

1

2

3

12πσ 2

e− x

2+y2

2σ 2

16

Page 17: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

ШАГ 2 - Применение матрицы A к точкам изображения I

′I [x, y]=I[x + i, y + j]*A[i, j]

j=0

∑i=0

∑3σ *3σ

0 N0

N

0.05 0.11 0.05

0.11 0.22 0.11

0.05 0.11 0.05

A

I I'

0 3𝞼

17

Page 18: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Размытие по Гауссу, эффективность на CPU

Картинка 640x480

Радиус блюра 5=

640x480x15x15 =

70 million operations

Видео 640x480

Радиус блюра 5=

70*30 =

2 billion operations18

Page 19: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Что делать?Hints:

- Полный последовательный перебор всех пикселей

- Вычисления ортогональны, независимы друг от друга

19

Page 20: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

CPU vs GPU1 2

3 4

Core

CPU GPU20

Page 21: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

GPU- Много параллельных процессоров

- Векторные операции нативно

- Сравнимая с CPU частота

- Сверх-быстрая видео память

*iPhone6’s GPU GX6450 - 300 Giga FLOPS

21

Page 22: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

OpenGL ES 2.0- Простой интерфейс

- Прямой доступ к GPU

- Поддержка шейдеров

- Широкое распространение

22

Page 23: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Шейдер- GLSL, C-like language

- Вертексные - для вершин объектов сцены

- Пиксельные - для точек изображения

- Встроенные команды для векторных типов и операций, like vec3 color = vec3(1.0, 1.0, 1.0)*0.5

- Не нужно думать как параллелить выполнение

23

Page 24: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Простейший шейдерvoid main(void) {

gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }

24

Page 25: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Размытие по Гауссу на GPU

Вычисляем средне-взвешенное значение для пикселя, используя матрицу свертки

Шаг 1 - CPU

Строим матрицу свертки (единичный набор операций)

Шаг 2 - GPU (шейдер)

25

Page 26: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Шейдер размытия по Гауссуvoid main(void) { fragmentColor = texture2D(image, gl_FragCoord)*convolutionMatrix.mid

int kMatrixSize = 3sigma; for (int i = 0; i < kMatrixSize; ++i) { for (int j = 0; j < kMatrixSize; ++j) {

fragmentColor += texture2D(image, gl_FragCoord + vec2(i, j)) * convolutionMatrix[i][j];

} }

gl_FragColor = fragmentColor / (kMatrixSize*kMatrixSize) }

26

Page 27: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Итоги- Рассмотрели теорию цифровой обработки видео и изображений

- Разобрали примеры простейших алгоритмов

- Подробно изучили как работает размытие по Гауссу

- Узнали о способе быстрой реализации алгоритма на GPU с помощью шейдеров

27

Page 28: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

coub.com

28

Page 29: Наложение видеоэффектов с OpenGL ES 2.0 with Shaders, Максим Решетей

Максим Решетей

ведущий iOS разработчик

Coub

Вопросы?

www.facebook.com/reshetey

[email protected]

29