4 votes

Programmation GPU pour le traitement d'images

Je travaille sur un projet visant à contrôler un robot humanoïde bipède. Malheureusement, nous disposons d'un ensemble de ressources matérielles très limitées (un La carte RB110 et sa carte graphique mini PCI ). J'ai l'intention de transférer les tâches de traitement d'image du CPU vers la carte graphique, si possible, mais je ne l'ai jamais fait auparavant... On me conseille d'utiliser OpenCV mais cela semble impossible car notre carte graphique (Volari Z9s) n'est pas supportée par le framework. Puis j'ai trouvé un poste intéressant sur Linux Journal. L'auteur a utilisé OpenGL pour traiter des images récupérées d'un périphérique v4l.

Je suis un peu confus quant à la relation entre l'API matérielle et OpenGL/OpenCV. Afin d'utiliser un GPU, le matériel doit-il être supporté par des cadres de programmation graphique (OpenGL/OpenCV) ? Où puis-je trouver une telle API ?

J'ai fait beaucoup de recherches sur mon matériel, malheureusement le fournisseur ( Technologie XGI ) semble en quelque sorte avoir disparu...

5voto

josefx Points 8417

Afin d'utiliser un GPU, le matériel doit-il être supporté par des cadres de programmation graphique (OpenGL/OpenCV) ? Où puis-je trouver une telle API ?

OpenCL et OpenGL sont tous deux traduits en instructions matérielles par le pilote du GPU. Vous avez donc besoin d'un pilote pour votre système d'exploitation qui prenne en charge ces cadres. La plupart des pilotes de GPU prennent en charge une version d'OpenGL, ce qui devrait fonctionner.

La norme OpenGL est maintenue par la Groupe Khronos et vous pouvez trouver des tutoriels à nehe .

Comment fonctionne OpenGL

OpenGL accepte les triangles en entrée et les dessine selon l'état qu'il a au moment où le dessin est émis. La plupart des fonctions OpenGL sont là pour modifier les opérations effectuées en manipulant cet état. La manipulation de l'image peut être faite en chargeant l'image d'entrée comme une texture et en dessinant plusieurs sommets avec la texture active, résultant en une nouvelle image (ou plus génériquement une nouvelle grille de données 2D).

À partir de la version > 2 (ou avec les bonnes extensions ARB), les opérations effectuées sur l'image peuvent être contrôlées par des programmes GLSL appelés vertex et fragment shaders (il existe d'autres shaders, mais ce sont les plus anciens). Un vertex shader sera appelé une fois par vertex, les résultats de celui-ci sont interpolés et transmis au fragment shader. Un fragment shader sera appelé à chaque fois qu'un nouveau fragment (pixel) est écrit dans le résultat.

Maintenant que tout cela concerne la lecture et l'écriture d'images, comment l'utiliser pour la détection d'objets ? Utilisez les sommets pour étendre la texture d'entrée sur toute la fenêtre. Au lieu de calculer des couleurs rgb et de les stocker dans le résultat, vous pouvez écrire un fragmentshader qui calcule des images en niveaux de gris / images de gradient et ensuite vérifie ces textures pour chaque pixel si le pixel est au centre d'un cycle avec une taille spécifique, une partie d'une ligne ou a juste un gradient relativement élevé par rapport à son environnement (bonne caractéristique) ou vraiment tout ce que vous pouvez trouver un bon algorithme parallèle pour. (je ne l'ai pas fait moi-même)

Le résultat final doit être relu par le processeur (vous pouvez parfois utiliser des shaders pour réduire l'échelle des données avant de le faire). OpenCL donne une impression moins graphique et offre beaucoup plus de liberté, mais est moins bien supporté.

1voto

JAre Points 3841

Tout d'abord, vous avez besoin du support des shaders ( GLSL o asm )

La méthode habituelle consiste à rendre un quadrant plein écran avec votre image (texture) et à appliquer un shader de fragment. Cela s'appelle Post-traitement Et limité par le jeu d'instructions et les autres limitations de votre matériel. Au niveau de base, il vous permet d'appliquer une fonction simple (unique) sur un grand ensemble de données de manière parallèle, ce qui produira un autre ensemble de données. Mais le branchement (s'il est supporté) est le premier ennemi de la performance parce que le GPU est composé de plusieurs fonctions. Blocs SIMD

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X