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 | ||||
| Unsure how to get the frames coming from OpenCV into the right format, so saving each frame to | ||||
| a temp file.  Clearly... clearly... this is not the optimal solution and one is being searched for now. | ||||
| It's main purpose is to show you: | ||||
| 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(): | ||||
|     # ---===--- Get the filename --- # | ||||
|     filename = sg.PopupGetFile('Filename to play') | ||||
|     if filename is None: | ||||
|         exit(69) | ||||
|  | @ -26,19 +28,22 @@ def main(): | |||
|     num_frames = vidFile.get(cv.CAP_PROP_FRAME_COUNT) | ||||
|     fps = vidFile.get(cv.CAP_PROP_FPS) | ||||
| 
 | ||||
|     sg.ChangeLookAndFeel('Dark') | ||||
|     sg.ChangeLookAndFeel('Black') | ||||
| 
 | ||||
|     # define the window layout | ||||
|     layout = [[sg.Text('OpenCV Demo', size=(15, 1),pad=((510,0),3), justification='center', font='Helvetica 20')], | ||||
|               [sg.Image(filename='', key='image')], | ||||
|               [sg.Slider(range=(0, num_frames), size=(115, 10), orientation='h', key='slider')], | ||||
|               [sg.Button('Exit', size=(10, 2), pad=((600, 0), 3), font='Helvetica 14')]] | ||||
|     # ---===--- define the window layout --- # | ||||
|     layout = [[sg.Text('OpenCV Demo', size=(15, 1), font='Helvetica 20')], | ||||
|               [sg.Image(filename='', key='_image_')], | ||||
|               [sg.Slider(range=(0, num_frames), size=(60, 10), orientation='h', key='_slider_')], | ||||
|               [sg.Button('Exit', size=(7, 1), pad=((600, 0), 3), font='Helvetica 14')]] | ||||
| 
 | ||||
|     # create the window and show it without the plot | ||||
|     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 --- # | ||||
|     i = 0 | ||||
|     cur_frame = 0 | ||||
|     while vidFile.isOpened(): | ||||
|         event, values = window.Read(timeout=0) | ||||
|         if event in ('Exit', None): | ||||
|  | @ -46,16 +51,16 @@ def main(): | |||
|         ret, frame = vidFile.read() | ||||
|         if not ret:  # if out of data stop looping | ||||
|             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 | ||||
|         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) | ||||
| 
 | ||||
|         img = Image.fromarray(frame)    # 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 | ||||
|         image_elem.Update(data=imgbytes) | ||||
| 
 | ||||
| main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue