Here's my code - I've a lot to learn so any advice, tips etc would be welcome! A few notes: I'm using OpenCV and numpy for other features in this code, not just for this snippet. The main readon for making frameDelay a class was as a way of passing another variable into the on_press function The weird infinite while loop in the delay function was so I could have a delay which could change length whilst in the actual delay.
While (((time.time() - starttime)*1000) < self.wait):
The above code didn't work as I wished. In the case of a long wait time, it would take that long before the delay length could be changed. I expect there is a better way!
As I said, here's the code! Thanks for looking.
import cv2 from pynput import mouse import time import numpy as np class frameDelay: def __init__(self): #set up initial values self.lasttime=time.time() #time since last click self.times=[0,0] #list of last two click intervals self.wait=30000 #initial frame delay def on_press(self,x, y, button, pressed): if pressed: self.times.append(time.time() - self.lasttime) #add time since last click to right of times self.times.pop(0) #delete oldest value self.wait = (((self.times + self.times)/2)*50) #average two values self.wait = int(np.clip (self.wait,1,500)) #convert to int between 10 and 100 self.lasttime = time.time() #start timer def delay(self): #wait for self.wait ms starttime=time.time() while True: if (((time.time() - starttime)*1000) > self.wait): break time.sleep(0.001) def increment(self, x): #increase the wait variable - slow down if no clicks. self.wait += x def main(): fd = frameDelay() listener = mouse.Listener( on_click=fd.on_press) listener.start() #open video file cap = cv2.VideoCapture("/Users/regvardy/mediapipe_faceswap-main/webcam_grab.mov") while(cap.isOpened()): ret, frame = cap.read() cv2.waitKey(1) fd.delay() fd.increment(30) cv2.imshow('frame',frame) cap.release() cv2.destroyAllWindows() if __name__ == "__main__": main()