Программирование GPU для обработки изображений


Я работаю над проектом, направленным на управление двуногим гуманоидным роботом. К сожалению, у нас очень ограниченный набор аппаратных ресурсов (плата RB110 и ее графическая карта mini PCI). Я планирую переносить задачи обработки изображений с процессора на процессор графической карты из возможных, но никогда не делал этого раньше... Мне советуют использовать OpenCV, но, похоже, это невозможно, потому что наш процессор графических карт (Volari Z9s)не поддерживается фреймворком. Затем я нашел интересный пост на Linux Журнал. Авторы использовали OpenGL для обработки кадров, полученных с устройства v4l.

Я немного запутался в отношениях между аппаратным API и OpenGL/OpenCV. Чтобы использовать графический процессор, нужно ли аппаратное обеспечение поддерживать графическими платформами программирования (OpenGL/OpenCV)? Где я могу найти такой API?

Я много гуглил о своем оборудовании, к сожалению, поставщик (технология XGI ), кажется, каким-то образом вымер...

2 4

2 ответа:

Чтобы использовать GPU, нужно ли аппаратное обеспечение поддерживать графическими платформами программирования (OpenGL/OpenCV)? Где я могу найти такой API?

OpenCL и OpenGL оба переведены в аппаратные инструкции драйвером GPU, поэтому вам нужен драйвер для вашей операционной системы, который поддерживает эти фреймворки. Большинство драйверов GPU поддерживают некоторые версии OpenGL, так что это должно работать.

Стандарт OpenGL поддерживается группой Khronos , и вы можете найти некоторые учебники в нэхэ.

Как работает OpenGL

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

От version > 2 (или с правыми расширениями ARB) операции, выполняемые над изображением, могут управляться с помощью программ GLSL, называемых вершинными и фрагментными шейдерами (шейдеров больше, но они самые старые). Вершинный шейдер вызывается один раз для каждой вершины, результаты интерполируются и пересылаются в шейдер фрагментов. Шейдер фрагментов будет вызываться каждый раз, когда в результат будет записан новый фрагмент(пиксель).

Теперь это все о чтении и записи изображений, как использовать его для обнаружения объекта? Используйте вершины, чтобы охватить входную текстуру по всему видовому экрану. Вместо вычисления цветов rgb и сохранения их в результате вы можете написать fragmentshader, который вычисляет изображения в оттенках серого / градиентные изображения, а затем проверяет эти текстуры для каждого пикселя, если пиксель находится в центре цикла с определенным размером, частью линии или просто имеет относительно высокий градиент по сравнению с его окружением (хорошая особенность) или действительно анитинг еще можно найти хороший параллельный алгоритм для. (я сам этого не делал)

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

Прежде всего вам нужна поддержка шейдеров (GLSL или asm)

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