Шейдеры OpenGL ES 1.1 / 2.0 для сравнения изображений на Android

1

Я разрабатываю программное обеспечение, которое сравнивает изображения, и мне нужно сделать это быстро! На самом деле я сравниваю их с помощью простой c, но это слишком медленно.

Я хочу сравнить их с помощью шейдеров и нескольких поверхностей gl (текстур), используя c, а не java, но это не так сильно изменяет ситуацию и возвращает список измененных частей, но я действительно Не знаю, с чего начать.

В основном я хочу использовать что-то вроде инструкции SIMD neon для сравнения цветов пикселей для проверки изменений (ну, мне нужно проверить только цвет первого пикселя, например, только красный... это фотографии, поэтому нереально, что это не меняется), но вместо этого для использования инструкций neon я хочу использовать пиксельные шейдеры для сравнения и получить список измененной части назад

Больше, если это возможно, я хочу использовать параллельное сравнение для одного и того же изображения, разбивая его на блоки:)

Кто-то может дать удар?

note: я знаю, что я не могу вывести обратно список вещей, но, ну, используйте третью текстуру, так как вывод в любом случае хорош для меня (если я наложу текстуру 2-х символов, указывающих x и y я ' m ok и с uint в конце текстуры, сообщающей количество измененных пикселей)

Теги:
shader
opengl-es

1 ответ

2
Лучший ответ

OpenGL ES 1.1 не имеет шейдеров, и лучший способ, который я могу придумать для того, что вы хотите сделать, заканчивается 50-процентным уменьшением точности цвета. Проблемы:

  • без расширений там аддитивное смешивание, но не субтрактивное. Нет проблем, просто загрузите вторую текстуру со всеми инвертированными значениями цвета.
  • OpenGL фиксирует выходные цвета в диапазоне [0, 1] и без расширений, вы ограничены одним байтом на канал. Поэтому вам нужно будет загружать текстуры с 7-битными цветовыми каналами, чтобы вы получили правильные результаты в течение 8 бит, которые возвращаются.

Шейдеры позволят немного обходному пути вокруг этого, потому что вы можете добавлять или вычитать или делать все, что хотите, и можете разделить результаты. Если вы отправляете два трехканальных 24-битных изображения для получения четырехканального 32-битного изображения, очевидно, что достаточно места для размещения в 9 бит на исходный канал, хотя вам придется разделить данные странно и восстановить их позже.

На практике вы будете платить довольно много за загрузку и загрузку изображений с графического процессора, поэтому NEON может быть лучшим выбором не только для того, чтобы избежать особенностей упаковки. Предполагая, что набор Android будет поставлять одни и те же встроенные функции компилятора в качестве набора iPhone (вероятно, поскольку оба они включают GCC), эта страница имеет немного введение, показывающее, как преобразовать изображение в оттенки серого. Таким образом, это не совсем то, что вы ищете, но обработка изображений в C с использованием NEON, поэтому это должно быть хорошим началом.

В обоих случаях вы, скорее всего, получите изображение различий, а не просто счет и список. Счет - это параллельная операция, независимо от того, как вы думаете об этом, так что действительно то, что вы сделали бы в GL или через NEON. Вам нужно будет проверить окончательное изображение, чтобы его обработать.

  • 0
    Я согласен, что загрузка / загрузка может вообще не привести к улучшению. Лучшая попытка - неон или упаковка 4 оттенков серого в 1 регистр (переменная).
  • 0
    большое спасибо, я попробую использовать неон, чтобы сделать сравнение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню