Bonjour,
J’essaye de faire du traitement en temps réel d’images venant d’une webcam. Pour ce faire, j’ai écrit le programme suivant :
import cv2
from PIL import Image
import pygame as pg
from itertools import product
from multiprocessing import Pool
class NoCameraError(Exception):
pass
cam = cv2.VideoCapture(0)
def PIL_to_Surface(image):
mode = image.mode
size = image.size
data = image.tobytes()
return pg.image.fromstring(data, size, mode)
pg.init()
ret, image = cam.read()
done = False
w, h = 0, 0
if not ret:
raise NoCameraError
image = cv2.cvtColor(image, cv2.COLOR_BGRA2RGB)
image = Image.fromarray(image)
w, h = image.width, image.height
screen = pg.display.set_mode((w,h))
pixels = tuple(product(range(w), range(h), repeat=1))
clock = pg.time.Clock()
def filter(pixel):
global image
r, g, b = image.getpixel(pixel)
r *= 2
if r > 255:
r = 255
image.putpixel(pixel,(r, g, b))
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
screen.fill("white")
last_image = image
ret, image = cam.read()
if not ret:
raise NoCameraError
print(type(image))
#from cv2 to PIL
image = cv2.cvtColor(image, cv2.COLOR_BGRA2RGB)
image = Image.fromarray(image)
w, h = image.width, image.height
#PIL processes
for pixel in pixels:
filter(pixel)
#pygame conversion
surface = PIL_to_Surface(image)
#pygame processes
screen.blit(surface,(0,0))
pg.display.update()
J’essaye pour l’instant d’appliquer un filtre rouge à l’image. En théorie, ça fonctionne, mais en pratique ça rame énormément (j’ai plusieurs secondes d’attente entre deux images successives). J’ai, à l’aide de quelques testes, déterminé que le problème venait des méthodes "getpixel" et "putpixel" de PIL, trop lentes, mais je ne vois pas comment les contourner.
Merci d’avance,
+0
-0