Cool Stack

Tutoriel n°2 : PyGame et Numpy : Afficher un tableau Numpy à l'écran

L'objectif de ce tutoriel est de montrer comment afficher un tableau de pixel à l'écran. Ce concept peut être utile lors de l'utilisation d'OpenCL pour le calcule d'image. En PyOpenCL on utilise des tableaux Numpy.array pour transmettre des informations entre le GPU et le CPU. On récupére donc le résultat dans un tableau Numpy.array. Nous allons donc ici nous contenter d'afficher dans une fenêtre une surface de pixel aléatoire à partir d'un tableau numpy.

import pygame
import numpy

Créer une fenêtre PyGame

La création d'une fenêtre avec PyGame se fait très facilement. Il suffit de connaitre la taille de la fenêtre que l'on souhaite. Ici 640 pixels de largeur et 480 pixels de hauteur avec 32 bits par pixel.

screen = pygame.display.set_mode((640, 480))

Numpy pour générer un tableau de bruit

Ici on crée un tableau remplit de valeur aléatoire.

A = numpy.random.rand(640, 480)
A = A * 255  * 255 * 255
A = A.astype(numpy.uint32)

On peut bien évidemment lorsque l'on a compris le principe l'écrire en une seule ligne si l'on préfère

A = (numpy.random.rand(640, 480) * 255 * 255 * 255).astype(numpy.uint32)

Afficher le tableau de valeur en tant qu'image

Le transfère de l'image ce fait en deux temps :

Créer un tableau-surface (pygame.surfarray) Afficher l'image à l'écran La première étape se fait à l'initialisation et la seconde à chaque image.

bits = pygame.surfarray.pixels2d(pygame.Surface((640, 480)))
pygame.surfarray.blit_array(screen, bits)

Conclusion

Encore une fois on constate que l'utilisation de python et des modules PyGame et Numpy simplifie grandement les efforts de développement. Voici le code pour afficher une fenêtre de bruit aléatoire, un peu comme une télévision sans antenne.

import pygame
import numpy
import random
screen = pygame.display.set_mode((640, 480))
running = 1
bits = pygame.surfarray.pixels2d(pygame.Surface((640, 480)))
while running:
  event = pygame.event.poll()
  if event.type == pygame.QUIT:
      running = 0
  A = (numpy.random.rand(640, 480) * 255 * 255 * 255).astype(numpy.uint32)
  bits[:] = A[:]
  pygame.surfarray.blit_array(screen, bits)
  pygame.display.flip()

Posted Lun 04 janvier 2010 by Stéphane Planquart in programmation graphique