Самый быстрый способ вычислить сходство / расстояние текстуры OpenGL? - PullRequest
1 голос
/ 30 декабря 2011

Вот что у меня есть:

  1. Я загружаю текстуру с диска, скажем 256x256, скажем, изображение пингвина
  2. Я создаю другую текстуру с такими же размерами и рисую некоторые вещина нем

Я хочу найти расстояние между двумя текстурами openGL КАК БЫСТРО, КАК ВОЗМОЖНО (точность функции расстояния важна НАИМЕНЕЕ).

На самом деле, это могут быть не текстурына первом месте.Я мог бы также сравнить область кадрового буфера с загруженной текстурой или сделать какую-то другую «магию».

Как сделать это супер-быстро?

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

На самом деле это не имеет ничего общего с OpenGL. OpenGL - это просто «драйвер» для 3D растеризации.

Основная идея - получить алгоритм расстояния / подобия, что является сложной задачей. Для начала вы можете использовать алгоритм Среднеквадратичное отклонение . Это даст вам количество отдаленных значений пикселей.

Когда вы реализуете его на CPU, вы можете сравнить его с вашими потребностями и, возможно, конвертировать в OpenCL. Я не думаю, что загрузка «пингвина» в графический процессор только для сравнения его с другими фигурами, которые вы готовите, сама по себе является сверхбыстрым процессом.

Постарайтесь быть более конкретным со своим следующим вопросом и избегайте высказываний «У меня очень хороший микроскоп, как мне очень быстро бить его ногтями?»

2 голосов
/ 30 декабря 2011

Вы можете использовать Pearson-Product для сопоставления разных изображений. Вы можете найти его на моем ответе . Вместо того, чтобы сопоставлять шаблон с меньшими размерами, чем исходное изображение, вы можете напрямую сопоставить два изображения.

Вскоре вы получаете отклонение каждого текстового элемента от среднего, что дает вам коэффициент корреляции.

Но улучшить этот алгоритм с помощью шейдеров может быть немного сложно. Во-первых, вам нужно вычислить среднее значение textel: возможно, какое-то расширение OpenGL (например, гистограмма) может помочь вам в этой задаче.

Затем вы можете использовать фрагментные шейдеры для выполнения однокомпонентных вычислений (разница между каждым textel с усредненным, вычисленным ранее. Средний textel должен быть передан как равномерный, а результат должен быть сохранен в текстуре с плавающей точкой (вы можете отобразить его на объекте framebuffer).

Затем вы должны суммировать все тексели полученной текстуры, чтобы получить корреляцию между двумя исходными текстурами.

Это может стоить в случае, если изображения очень большие. В противном случае я думаю, что лучше всего выполнить алгоритм на процессоре, используя набор инструкций SIMD (например, MMX, SSE, AVX).

...