Merge pull request #1671 from PySimpleGUI/Dev-latest
Made slider active. Moving it causes video playback to begin at new …
This commit is contained in:
		
						commit
						08f0febf4d
					
				
					 1 changed files with 25 additions and 20 deletions
				
			
		|  | @ -11,13 +11,15 @@ from sys import exit as exit | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| Demo program to open and play a file using OpenCV | Demo program to open and play a file using OpenCV | ||||||
| Unsure how to get the frames coming from OpenCV into the right format, so saving each frame to | It's main purpose is to show you: | ||||||
| a temp file.  Clearly... clearly... this is not the optimal solution and one is being searched for now. | 1. How to get a frame at a time from a video file using OpenCV | ||||||
|  | 2. How to display an image in a PySimpleGUI Window | ||||||
| 
 | 
 | ||||||
| Until then enjoy it working somewhat slowly. | For added fun, you can reposition the video using the slider. | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|  |     # ---===--- Get the filename --- # | ||||||
|     filename = sg.PopupGetFile('Filename to play') |     filename = sg.PopupGetFile('Filename to play') | ||||||
|     if filename is None: |     if filename is None: | ||||||
|         exit(69) |         exit(69) | ||||||
|  | @ -26,19 +28,22 @@ def main(): | ||||||
|     num_frames = vidFile.get(cv.CAP_PROP_FRAME_COUNT) |     num_frames = vidFile.get(cv.CAP_PROP_FRAME_COUNT) | ||||||
|     fps = vidFile.get(cv.CAP_PROP_FPS) |     fps = vidFile.get(cv.CAP_PROP_FPS) | ||||||
| 
 | 
 | ||||||
|     sg.ChangeLookAndFeel('Dark') |     sg.ChangeLookAndFeel('Black') | ||||||
| 
 | 
 | ||||||
|     # define the window layout |     # ---===--- define the window layout --- # | ||||||
|     layout = [[sg.Text('OpenCV Demo', size=(15, 1),pad=((510,0),3), justification='center', font='Helvetica 20')], |     layout = [[sg.Text('OpenCV Demo', size=(15, 1), font='Helvetica 20')], | ||||||
|               [sg.Image(filename='', key='image')], |               [sg.Image(filename='', key='_image_')], | ||||||
|               [sg.Slider(range=(0, num_frames), size=(115, 10), orientation='h', key='slider')], |               [sg.Slider(range=(0, num_frames), size=(60, 10), orientation='h', key='_slider_')], | ||||||
|               [sg.Button('Exit', size=(10, 2), pad=((600, 0), 3), font='Helvetica 14')]] |               [sg.Button('Exit', size=(7, 1), pad=((600, 0), 3), font='Helvetica 14')]] | ||||||
| 
 | 
 | ||||||
|     # create the window and show it without the plot |     # create the window and show it without the plot | ||||||
|     window = sg.Window('Demo Application - OpenCV Integration', no_titlebar=False, location=(0,0)).Layout(layout) |     window = sg.Window('Demo Application - OpenCV Integration', no_titlebar=False, location=(0,0)).Layout(layout) | ||||||
| 
 | 
 | ||||||
|  |     image_elem = window.Element('_image_')    # locate the elements we'll be updating. Does the search only 1 time | ||||||
|  |     slider_elem = window.Element('_slider_') | ||||||
|  | 
 | ||||||
|     # ---===--- LOOP through video file by frame --- # |     # ---===--- LOOP through video file by frame --- # | ||||||
|     i = 0 |     cur_frame = 0 | ||||||
|     while vidFile.isOpened(): |     while vidFile.isOpened(): | ||||||
|         event, values = window.Read(timeout=0) |         event, values = window.Read(timeout=0) | ||||||
|         if event in ('Exit', None): |         if event in ('Exit', None): | ||||||
|  | @ -46,16 +51,16 @@ def main(): | ||||||
|         ret, frame = vidFile.read() |         ret, frame = vidFile.read() | ||||||
|         if not ret:  # if out of data stop looping |         if not ret:  # if out of data stop looping | ||||||
|             break |             break | ||||||
|  |         if int(values['_slider_']) != cur_frame-1:        # if someone moved the slider manually, the jump to that frame | ||||||
|  |             cur_frame = int(values['_slider_']) | ||||||
|  |             vidFile.set(cv.CAP_PROP_POS_FRAMES, cur_frame) | ||||||
|  |         slider_elem.Update(cur_frame) | ||||||
|  |         cur_frame += 1 | ||||||
| 
 | 
 | ||||||
|         window.FindElement('slider').Update(i) |  | ||||||
|         i += 1 |  | ||||||
| 
 |  | ||||||
|         # let img be the PIL image |  | ||||||
|         img = Image.fromarray(frame)    # create PIL image from frame |         img = Image.fromarray(frame)    # create PIL image from frame | ||||||
|         bio = io.BytesIO()              # a binary memory resident stream |         bio = io.BytesIO()              # a binary memory resident stream | ||||||
|         img.save(bio, format= 'PNG')    # save image as png to it |         img.save(bio, format= 'PNG')    # save image as png to it | ||||||
|         imgbytes = bio.getvalue()       # this can be used by OpenCV hopefully |         imgbytes = bio.getvalue()       # this can be used by OpenCV hopefully | ||||||
|         window.FindElement('image').Update(data=imgbytes) |         image_elem.Update(data=imgbytes) | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| main() | main() | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue