2013-02-21 3 views
2

Я работаю над обработкой неподвижных изображений, и GPUImage - действительно потрясающая структура (спасибо, Брэд Ларсон!).GPUImage: влияние YUV или RGBA на производительность?

Я понимаю, что:

  • некоторые фильтры можно сделать только один компонент. В этом случае изображение должно быть YUV (YCbCr), и мы используем только Y (luma = уровень изображения серый).
  • другие фильтры должны всю информацию о цвете от 3-х компонентов - R, G и B.
  • YUV - обеспечивается> преобразование RGB (в GPUVideoCamera), RGB -> YUV может быть жестко закодированы в пиксельный шейдер (например, : GPUImageChromaKeyFilter)

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

Какова стоимость/потеря информации для таких последовательных преобразований, и вы порекомендовали бы какой-либо дизайн?

Спасибо!

(PS: в чем проблема с iPhone4 YUV-> RGB преобразование & AVCaptureStillImageOutput пиксель-формате)

ответ

6

Использование YUV в GPUImage является довольно новым дополнением, и то, что я до сих пор экспериментируют с. Я хотел потянуть YUV, чтобы попытаться улучшить производительность фильтра, уменьшить использование памяти и, возможно, повысить точность воспроизведения. Пока мои модификации достигли только одного из этих трех.

Как вы можете видеть, я вытягиваю кадры YUV с камеры, а затем решаю, что с ними делать на последующих этапах в конвейере фильтра. Если для всех фильтров, для которых вход камеры предназначен только для монохромных входов, вход камеры отправляет только необработанную текстуру Y-канала по трубопроводу. Если для любого из фильтров требуется вход RGB, вход камеры будет выполнять преобразование на основе шейдеров с YUV-> RGB.

Для фильтров, которые выполняются в монохромном режиме, это может привести к значительному повышению производительности благодаря устранению фазы преобразования RGB (выполняется AV Foundation при запросе данных BGRA или в моем шейдере преобразования), а также избыточном преобразовании RGB обратно к яркости. На iPhone 4 производительность фильтра обнаружения края Sobel, работающего на кадрах 720p, составляет от 36,0 мс за кадр с RGB-входом до 15,1 мс с использованием прямого Y-канала. Это также позволяет избежать небольшой потери информации из-за округления от преобразования YUV в RGB и обратно к яркости. 8-битные цветные каналы имеют только такой динамический диапазон.

Даже при использовании входов RGB перемещение этого преобразования из AV-фона и в мой шейдер приводит к выигрышу в производительности. На iPhone 4S запуск фильтра насыщения с входами 1080p снижается с 2,2 мс на кадр до 1,5 мс на фрейм с моим шейдером преобразования вместо встроенного выхода BGRA от AV Foundation.

Потребление памяти почти одинаково между двумя подходами RGB, поэтому я экспериментирую с возможностью улучшить это. Для монохромных входов использование памяти значительно падает из-за меньшего размера текстур входов.

Реализация конвейера все-YUV является более сложной задачей, поскольку вам необходимо поддерживать параллельные пути переноса и шейдеры для Y и UV-плоскостей с отдельными входными и выходными текстурами для обоих.Извлечение планарного YUV из RGB сложно, потому что вам нужно каким-то образом вытащить два выхода с одного входа, что не поддерживается в OpenGL ES. Вам нужно сделать два прохода рендера, что довольно бесполезно. Interleaved YUV444 может быть более практичным в качестве цветового формата для многоступенчатого конвейера, но я еще не играл с этим.

Опять же, я только начинаю возиться с этим.

+1

Мое короткое тестирование на iPhone 4 показало, что у BGRA не было штрафа за производительность на 420v/420f, кроме очевидного использования памяти/полосы пропускания, тогда как на iPhone 3G yuvs потребляли много CPU в медиабере, а 2vuy и BGRA в порядке. Поскольку yuvs по существу заменен байтом 2vuy, он должен быть только медленнее BGRA, если BGRA не конвертирует. Я также искал уменьшенную полосу яркости в кадрах BGRA и не нашел. Тем не менее, я не тестировал с момента появления iOS 4.3. –

+0

Спасибо за довольно полный ответ: номера производительности интересны! Что касается дизайна, в моем случае я вычисляю статические изображения, и я играю с другими цветовыми пространствами (HSV, возможно, CIELab ...). Думаю, я мог бы использовать «исходный» образ - YUV или RGB - и возвращаться к этому источнику при необходимости (я представляю независимые манипуляции с изображениями, основанные на одном и том же исходном изображении, каждый из которых предоставляет информационную обратную связь, которую я затем использую для преобразования исходного изображения. .. Мне еще предстоит выяснить, соответствует ли это моим потребностям) – Vinzzz

Смежные вопросы