Last active
September 11, 2022 16:21
-
-
Save MikeTheWatchGuy/8d9edb728d56b10a5ad8374b501b77cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import sys | |
if sys.version_info[0] >= 3: | |
import PySimpleGUI as sg | |
else: | |
import PySimpleGUI27 as sg | |
import cv2 as cv | |
from PIL import Image | |
import io | |
from sys import exit as exit | |
""" | |
Demo program that displays a webcam using OpenCV | |
""" | |
def main(): | |
sg.ChangeLookAndFeel('LightGreen') | |
# define the window layout | |
layout = [[sg.Text('OpenCV Demo', size=(40, 1), justification='center', font='Helvetica 20')], | |
[sg.Image(filename='', key='image')], | |
[sg.ReadButton('Exit', size=(10, 1), pad=((200, 0), 3), font='Helvetica 14'), | |
sg.RButton('About', size=(10,1), font='Any 14')]] | |
# create the window and show it without the plot | |
window = sg.Window('Demo Application - OpenCV Integration', | |
location=(800,400)) | |
window.Layout(layout).Finalize() | |
# ---===--- Event LOOP Read and display frames, operate the GUI --- # | |
cap = cv.VideoCapture(0) | |
while True: | |
button, values = window.ReadNonBlocking() | |
if button is 'Exit' or values is None: | |
sys.exit(0) | |
elif button == 'About': | |
sg.PopupNoWait('Made with PySimpleGUI', | |
'www.PySimpleGUI.org', | |
'Check out how the video keeps playing behind this window.', | |
'I finally figured out how to display frames from a webcam.', | |
'ENJOY! Go make something really cool with this... please!', | |
keep_on_top=True) | |
ret, frame = cap.read() | |
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) | |
# let img be the PIL image | |
img = Image.fromarray(gray) # create PIL image from frame | |
bio = io.BytesIO() # a binary memory resident stream | |
img.save(bio, format= 'PNG') # save image as png to it | |
imgbytes = bio.getvalue() # this can be used by OpenCV hopefully | |
window.FindElement('image').Update(data=imgbytes) | |
main() |
I changed line 33:
button, values = window.ReadNonBlocking()
to
button, values = window.read(timeout=10)
and it seemed to work fine.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm trying it with an IP camera, and it only takes the image when pushing the 'about' button. It also displays only one capture, instead of refreshing frames as the while loop iterates. Is there any way to refresh the frames to see it like a video stream?