Шейдеры OpenGL ES 1.1 / 2.0 для сравнения изображений на Android - PullRequest
1 голос
/ 05 апреля 2011

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

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

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

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

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

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

1 Ответ

2 голосов
/ 05 апреля 2011

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

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

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

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

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

...