1

I have a Tkinter program. I need to have a video player embedded in Tkinter, or otherwise have an option for video playback controls directly on Tkinter. My goal is to save mouse hover positions of the object of interest in the given video.

import Tkinter as tk
from Tkinter import *
import PIL.Image,PIL.ImageTk 
import time
import cv2


class App:
    def __init__(self, window, window_title, video_source=0):
        self.window = window
        self.window.title(window_title)
        self.video_source = video_source
        self.video_loaded=False

    # open video source (by default this will try to open the computer webcam)
        self.vid = MyVideoCapture(self.video_source)

    # Create a canvas that can fit the above video source size
        self.canvas = tk.Canvas(window, width = self.vid.width, height = 
        self.vid.height)
        self.canvas.pack()

        self.canvas.bind('<Motion>',self.motion)
        self.canvas.bind('<Button-1>',self.follow_motion)
       #self.canvas.bind("<Enter>", self.on_enter)
       #self.canvas.bind("<Leave>", self.on_leave)

       # Button that lets the user take a snapshot
        self.btn_snapshot=tk.Button(window, text="Snapshot", width=50,  
        command=self.snapshot)
        self.btn_snapshot.pack(anchor=tk.CENTER, expand=True)

        self.btn_collapse=tk.Button(window, text="Collapse", width=50, 
        command=self.collapse)
        self.btn_collapse.pack(anchor=tk.CENTER, expand=True)

        self.btn_load_video=tk.Button(window, text="Load Video", width=50, 
        command=self.load_video)
        self.btn_load_video.pack(anchor=tk.CENTER, expand=True)

     #if self.video_loaded==True:
     # After it is called once, the update method will be automatically 
     called every delay milliseconds
     self.delay = 15
     self.update()


     self.window.mainloop()

     def load_video(self):
    # open video source (by default this will try to open the computer 
     webcam)
        self.vid = MyVideoCapture(self.video_source)
        self.video_loaded=True

     def snapshot(self):
     # Get a frame from the video source
        ret, frame = self.vid.get_frame()

     if ret:
        cv2.imwrite("frame-" + time.strftime("%d-%m-%Y-%H-%M-%S") +  ".jpg", 
        cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))

     def collapse(self):
         self.window.quit()  

     def follow_motion(self,event):
         global follow
         follow = not follow

     def motion(self,event):
         self.x=event.x
         self.y=event.y
         print('{},{}'.format(self.x, self.y))
         #self.canvas.itemconfigure(text='({x},{y})'.format(x = self.x, 
         #y=self.y))


     #def motion(self):
     #    x, y = self.x, self.y
     #   print('{}, {}'.format(x, y))  

     #def on_enter(self, event):
     #    self.l2.configure(text="Hello world")

     #def on_leave(self, enter):
     #    self.l2.configure(text="")       

     def update(self):
     # Get a frame from the video source
         ret, frame = self.vid.get_frame()

     if ret:
        self.photo = PIL.ImageTk.PhotoImage(image = 
        PIL.Image.fromarray(frame))
        self.canvas.create_image(0, 0, image = self.photo, anchor = tk.NW)

     self.window.after(self.delay, self.update)

class MyVideoCapture:
    def __init__(self, video_source=0):
    # Open the video source
        video_source='./videofilename.wmv'
        self.vid = cv2.VideoCapture(video_source)
        if not self.vid.isOpened():
           raise ValueError("Unable to open video source", video_source)

    # Get video source width and height
       self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
       self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)

    def get_frame(self):
        if self.vid.isOpened():
           ret, frame = self.vid.read()
           if ret:
            # Return a boolean success flag and the current frame converted 
            to BGR
              return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
           else:
              return (ret, None)
        else:
           return (ret, None)

    # Release the video source when the object is destroyed
    def __del__(self):
       if self.vid.isOpened():
          self.vid.release()

# Create a window and pass it to the Application object
root = tk.Tk()   
follow = False        
App(root, "Tkinter and OpenCV")   

Here is [the link][https://solarianprogrammer.com/2018/04/21/python-opencv-show-video-tkinter-window/] from which I got main code.

I tried the solutions mentioned in this link, and also here but still no help with the problem.

When I do:import vlc , I still get the following error:

  Traceback (most recent call last):

  File "<ipython-input-6-7c36fff9a8c5>", line 1, in <module>
  import vlc

  File "vlc.py", line 203, in <module>
   dll, plugin_path  = find_lib()

  File "vlc.py", line 173, in find_lib
  dll = ctypes.CDLL(libname)

  File "C:\Anaconda2\envs\py27\lib\ctypes\__init__.py", line 362, in __init__
   self._handle = _dlopen(self._name, mode)

  WindowsError: [Error 126] The specified module could not be found`

Appreciate any help. Thanks in advance.

Dr. Strange
  • 87
  • 11

0 Answers0