jukrapopk commited on
Commit
848ba92
·
1 Parent(s): 3269f7b

improvement: FPS counter + frame timing

Browse files
Files changed (1) hide show
  1. src/app.py +25 -9
src/app.py CHANGED
@@ -7,31 +7,47 @@ app = Flask(__name__)
7
 
8
  latest_frame = None
9
  lock = threading.Lock()
 
10
 
11
  def video_reader():
12
- global latest_frame
 
13
  cap = cv2.VideoCapture('videos/classroom.mp4')
14
  framerate = cap.get(cv2.CAP_PROP_FPS)
15
- frame_duration = 1.0 / framerate if framerate > 0 else 1.0 / 30
16
-
17
- latest_frame_accessed_time = time.time()
18
 
 
 
 
 
 
 
 
 
19
  while True:
20
- start_time = time.time()
21
  ret, frame = cap.read()
22
 
 
23
  ret, jpeg = cv2.imencode('.jpg', frame)
24
  if ret:
25
  with lock:
26
  latest_frame = jpeg.tobytes()
27
- elapsed = time.time() - start_time
28
 
29
- print(f"{1/(time.time() - latest_frame_accessed_time)} FPS")
30
- latest_frame_accessed_time = time.time()
 
 
 
 
31
 
32
- sleep_time = frame_duration - elapsed
 
 
33
  if sleep_time > 0:
34
  time.sleep(sleep_time)
 
 
35
 
36
  def generate():
37
  while True:
 
7
 
8
  latest_frame = None
9
  lock = threading.Lock()
10
+ measured_fps = 0
11
 
12
  def video_reader():
13
+ global latest_frame, lock, measured_fps
14
+
15
  cap = cv2.VideoCapture('videos/classroom.mp4')
16
  framerate = cap.get(cv2.CAP_PROP_FPS)
17
+ frame_duration = 1 / framerate
 
 
18
 
19
+ # variables to measure FPS
20
+ frame_count = 0
21
+ last_time = time.time()
22
+ rolling_duration = 0.5
23
+
24
+ # variables to control framerate
25
+ next_frame_time = time.time()
26
+
27
  while True:
 
28
  ret, frame = cap.read()
29
 
30
+ cv2.putText(frame, f"{measured_fps: .0f}", (frame.shape[1] - 70, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
31
  ret, jpeg = cv2.imencode('.jpg', frame)
32
  if ret:
33
  with lock:
34
  latest_frame = jpeg.tobytes()
35
+ frame_count += 1
36
 
37
+ # measure FPS
38
+ now = time.time()
39
+ if now - last_time >= rolling_duration:
40
+ measured_fps = frame_count / (now - last_time)
41
+ frame_count = 0
42
+ last_time = now
43
 
44
+ # control framerate
45
+ next_frame_time += frame_duration
46
+ sleep_time = next_frame_time - time.time()
47
  if sleep_time > 0:
48
  time.sleep(sleep_time)
49
+ else:
50
+ next_frame_time = time.time()
51
 
52
  def generate():
53
  while True: