Hi all, I just started graphics programming with pyglet. opencv's
VideoCapture stream outputs BGR numpy arrays, and most online
tutorials/solutions use array.tostring() or array.tobyte() to let
pyglet.image.ImageData construct the texture. It works but the conversion
is relatively slow ~30 ms per frame. Then I started trying out ctypes
arrays:
import pyglet
import numpy as np
import cv2
from threading import Thread
stream = cv2.VideoCapture(0)
stream.set(cv2.CAP_PROP_FPS, 30)
_, frame_raw = stream.read()
SCREEN_HEIGHT, SCREEN_WIDTH, NCOLOR = frame_raw.shape
window = pyglet.window.Window(SCREEN_WIDTH, SCREEN_HEIGHT)
fps_display = pyglet.clock.ClockDisplay()
def get_from_stream():
global frame_raw
while True:
_, frame_raw = stream.read()
thread_get_from_stream = Thread(target=get_from_stream)
thread_get_from_stream.daemon = True
thread_get_from_stream.start()
@window.event
def on_draw():
window.clear()
# image = pyglet.image.ImageData(SCREEN_WIDTH, SCREEN_HEIGHT, 'BGR',
frame_raw[:, ::-1, :].tobytes(), -SCREEN_WIDTH * 3) # flip horizontally
image = pyglet.image.ImageData(SCREEN_WIDTH, SCREEN_HEIGHT, 'BGR',
np.ctypeslib.as_ctypes(frame_raw[:, ::-1, :].ravel()), -SCREEN_WIDTH * 3) #
flip as well
# image = pyglet.image.ImageData(SCREEN_WIDTH,
SCREEN_HEIGHT, 'BGR', np.ctypeslib.as_ctypes(frame_raw[:, ::-1,
:].copy().ravel()), -SCREEN_WIDTH * 3) # copy and flip
# image = pyglet.image.ImageData(SCREEN_WIDTH, SCREEN_HEIGHT, 'BGR',
np.ctypeslib.as_ctypes(frame_raw.ravel()), -SCREEN_WIDTH * 3) # no flip
image.blit(0, 0)
fps_display.draw()
pyglet.clock.schedule_interval(lambda x: None, 1/30.)
pyglet.app.run()
See the four lines in on_draw(). THe first line with frame_raw[:, ::-1,
:].tobytes() works at ~20FPS. What's strange about the second is that there
is a lot of flickering alternating between black screen and images, and
during the flickering some images are flipped, some are not! I thought this
has anything to do with how views are seen at lower levels, but when I use
the third line with a copy(), the situation is the same! Then when I use
the fourth line, there is no strange flipping issues but flickering still
persists. What's going on?
--
You received this message because you are subscribed to the Google Groups
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/d/optout.