Spaces:
Running
Running
show cpu usage
Browse files
app.py
CHANGED
@@ -4,12 +4,14 @@ from cv2.typing import MatLike
|
|
4 |
import threading
|
5 |
import time
|
6 |
import os
|
|
|
7 |
|
8 |
class Session:
|
9 |
-
def __init__(self, id: str, latest_frame: MatLike, measured_fps: float, show_fps: bool):
|
10 |
self.id = id
|
11 |
self.latest_frame: MatLike = latest_frame
|
12 |
self.measured_fps = measured_fps
|
|
|
13 |
self.show_fps = show_fps
|
14 |
|
15 |
app = Flask(__name__)
|
@@ -38,29 +40,32 @@ def frame_processor(session_id: str):
|
|
38 |
while True:
|
39 |
ret, frame = cap.read()
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
if not ret:
|
42 |
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
43 |
continue
|
44 |
else:
|
45 |
if session.show_fps:
|
46 |
-
text = f"{session_id}: {session.measured_fps:.0f}"
|
47 |
font = cv2.FONT_HERSHEY_SIMPLEX
|
48 |
font_scale = 1
|
49 |
thickness = 2
|
50 |
color = (0, 255, 0)
|
51 |
-
|
52 |
-
x = frame.shape[1] - text_width - 10
|
53 |
-
y = 30
|
54 |
-
cv2.putText(frame, text, (x, y), font, font_scale, color, thickness, cv2.LINE_AA)
|
55 |
-
session.latest_frame = frame
|
56 |
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
last_time = now
|
64 |
|
65 |
# control framerate
|
66 |
next_frame_time += frame_duration
|
@@ -70,6 +75,8 @@ def frame_processor(session_id: str):
|
|
70 |
else:
|
71 |
next_frame_time = time.time()
|
72 |
|
|
|
|
|
73 |
def stream_mjpeg(session_id: str):
|
74 |
global sessions
|
75 |
|
@@ -93,7 +100,7 @@ def video_feed():
|
|
93 |
session_id = request.args.get("id", "default")
|
94 |
|
95 |
if session_id not in [s.id for s in sessions]:
|
96 |
-
session = Session(session_id, None, 0, True)
|
97 |
sessions.add(session)
|
98 |
threading.Thread(target=frame_processor, args=[session_id], daemon=True).start()
|
99 |
|
|
|
4 |
import threading
|
5 |
import time
|
6 |
import os
|
7 |
+
import psutil
|
8 |
|
9 |
class Session:
|
10 |
+
def __init__(self, id: str, latest_frame: MatLike, measured_fps: float, cpu_usage: float, show_fps: bool):
|
11 |
self.id = id
|
12 |
self.latest_frame: MatLike = latest_frame
|
13 |
self.measured_fps = measured_fps
|
14 |
+
self.cpu_usage = cpu_usage
|
15 |
self.show_fps = show_fps
|
16 |
|
17 |
app = Flask(__name__)
|
|
|
40 |
while True:
|
41 |
ret, frame = cap.read()
|
42 |
|
43 |
+
# measure FPS
|
44 |
+
frame_count += 1
|
45 |
+
now = time.time()
|
46 |
+
if now - last_time >= rolling_duration:
|
47 |
+
session.measured_fps = frame_count / (now - last_time)
|
48 |
+
session.cpu_usage = psutil.cpu_percent(interval=None)
|
49 |
+
frame_count = 0
|
50 |
+
last_time = now
|
51 |
+
|
52 |
if not ret:
|
53 |
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
54 |
continue
|
55 |
else:
|
56 |
if session.show_fps:
|
|
|
57 |
font = cv2.FONT_HERSHEY_SIMPLEX
|
58 |
font_scale = 1
|
59 |
thickness = 2
|
60 |
color = (0, 255, 0)
|
61 |
+
text = f"ID: {session_id}\n FPS: {session.measured_fps:.0f}\n CPU: {session.cpu_usage:02.0f}%"
|
|
|
|
|
|
|
|
|
62 |
|
63 |
+
y0, dy = 30, 36
|
64 |
+
for i, line in enumerate(text.split('\n')):
|
65 |
+
(text_width, text_height), _ = cv2.getTextSize(line, font, font_scale, thickness)
|
66 |
+
x = frame.shape[1] - text_width - 10
|
67 |
+
y = y0 + i*dy
|
68 |
+
cv2.putText(frame, line, (x, y), font, font_scale, color, thickness, cv2.LINE_AA)
|
|
|
69 |
|
70 |
# control framerate
|
71 |
next_frame_time += frame_duration
|
|
|
75 |
else:
|
76 |
next_frame_time = time.time()
|
77 |
|
78 |
+
session.latest_frame = frame
|
79 |
+
|
80 |
def stream_mjpeg(session_id: str):
|
81 |
global sessions
|
82 |
|
|
|
100 |
session_id = request.args.get("id", "default")
|
101 |
|
102 |
if session_id not in [s.id for s in sessions]:
|
103 |
+
session = Session(session_id, None, 0, 0, True)
|
104 |
sessions.add(session)
|
105 |
threading.Thread(target=frame_processor, args=[session_id], daemon=True).start()
|
106 |
|