I want to display images from an Allied Vision camera inside a tkinter frame using OpenCV and the SDK for the camera, VimbaPython.
The only possible way to initialize the camera is with a Python with
statement:
with Vimba.get_instance() as vimba:
cams = vimba.get_all_cameras()
with cams[0] as camera:
camera.get_frame()
# Convert frame to opencv image, then use Image.fromarray and ImageTk.PhotoImage to
# display it on the tkinter GUI
Everything works fine so far. But I don't only need a single frame. Instead, I need to continuously get frames and display them on the screen so that it is streaming.
I found that one way to do it is to call the .after(delay, function)
method from a tkinter Label widget.
So, after obtaining one frame, I want to call the same function to get a new frame and display it again. The code would look like that:
with Vimba.get_instance() as vimba:
cams = vimba.get_all_cameras()
with cams[0] as camera:
def show_frame():
frame = camera.get_frame()
frame = frame.as_opencv_image()
im = Image.fromarray(frame)
img = Image.PhotoImage(im)
lblVideo.configure(image=img) # this is the Tkinter Label Widget
lblVideo.image = img
show_frame()
lblVideo.after(20, show_frame)
Then this shows the first frame and stops, throwing an error saying that Vimba needs to be initialized with a with
statement. I don't know much about Python, but it looks like when I call the function with the .after()
method it ends the with statement.
I would like to know if it is possible to execute this show_frame()
function without ending the with
. Also, I can't initialize the camera every time because the program goes really slow.
Thank you
You need to use thread to run the capture code and pass the frames read via
queue
. Then the maintkinter
application reads thequeue
and show the frames periodically using.after()
.Below is an example based on your posted code:
Note that I don't have the camera and the SDK installed, the above code may not work for you. I just demonstrate how to use thread, queue and
.after()
.Below is a testing
vimba
module (saved asvimba.py
) I use to simulateVimbaPython
module usingOpenCV
and a webcam: