Commit
·
896eec6
1
Parent(s):
264c76c
Update step methodology (stepping faster). Add water mask overlay. Reduce overlay alpha to 0.3
Browse files
app.py
CHANGED
@@ -134,7 +134,7 @@ def build_masks(seg):
|
|
134 |
return water_mask, garbage_mask, movable_mask
|
135 |
|
136 |
# Garbage mask can be highlighted in red
|
137 |
-
def highlight_chunk_masks_on_frame(frame, labels, objs, color_uncollected=(0, 0, 128), color_collected=(0, 128, 0), alpha=0.
|
138 |
"""
|
139 |
Overlays semi-transparent colored regions for garbage chunks on the frame.
|
140 |
`objs` must have 'pos' and 'col' keys. The collection status changes the overlay color.
|
@@ -151,6 +151,16 @@ def highlight_chunk_masks_on_frame(frame, labels, objs, color_uncollected=(0, 0,
|
|
151 |
cv2.drawContours(overlay, contours, -1, color, thickness=cv2.FILLED)
|
152 |
# Blend overlay with original frame using alpha
|
153 |
return cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
|
155 |
# ── A* and KNN over binary water grid ─────────────────────────────────
|
156 |
def astar(start, goal, occ):
|
@@ -191,7 +201,7 @@ def knn_path(start, targets, occ):
|
|
191 |
|
192 |
# ── Robot sprite/class -──────────────────────────────────────────────────
|
193 |
class Robot:
|
194 |
-
def __init__(self, sprite, speed=
|
195 |
img = Image.open(sprite).convert("RGBA").resize((40, 40))
|
196 |
self.png = np.array(img)
|
197 |
if self.png.shape[-1] != 4:
|
@@ -199,12 +209,17 @@ class Robot:
|
|
199 |
self.png = np.array(Image.open(sprite).convert("RGBA").resize((40,40)))
|
200 |
self.pos = [0,0]; self.speed=speed
|
201 |
def step(self, path):
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
|
|
|
|
|
|
|
|
|
|
208 |
|
209 |
# ── FastAPI & HTML content (original styling) ───────────────────────────
|
210 |
# HTML Content for UI (streamed with FastAPI HTML renderer)
|
@@ -458,7 +473,8 @@ def _pipeline(uid,img_path):
|
|
458 |
for _ in range(15000): # safety frames
|
459 |
frame=bg.copy()
|
460 |
# Draw garbage chunk masks in red-to-green (semi-transparent)
|
461 |
-
frame = highlight_chunk_masks_on_frame(frame, labels, objs)
|
|
|
462 |
# Draw object detections as red (to green) dots
|
463 |
for o in objs:
|
464 |
color = (0, 0, 128) if not o["col"] else (0, 128, 0)
|
|
|
134 |
return water_mask, garbage_mask, movable_mask
|
135 |
|
136 |
# Garbage mask can be highlighted in red
|
137 |
+
def highlight_chunk_masks_on_frame(frame, labels, objs, color_uncollected=(0, 0, 128), color_collected=(0, 128, 0), alpha=0.3):
|
138 |
"""
|
139 |
Overlays semi-transparent colored regions for garbage chunks on the frame.
|
140 |
`objs` must have 'pos' and 'col' keys. The collection status changes the overlay color.
|
|
|
151 |
cv2.drawContours(overlay, contours, -1, color, thickness=cv2.FILLED)
|
152 |
# Blend overlay with original frame using alpha
|
153 |
return cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 0)
|
154 |
+
# Water mask to be blue
|
155 |
+
def highlight_water_mask_on_frame(frame, binary_mask, color=(255, 0, 0), alpha=0.3):
|
156 |
+
"""
|
157 |
+
Overlays semi-transparent colored mask (binary) on the frame.
|
158 |
+
"""
|
159 |
+
overlay = frame.copy()
|
160 |
+
mask = binary_mask.astype(np.uint8) * 255
|
161 |
+
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
162 |
+
cv2.drawContours(overlay, contours, -1, color, thickness=cv2.FILLED)
|
163 |
+
return cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 0)
|
164 |
|
165 |
# ── A* and KNN over binary water grid ─────────────────────────────────
|
166 |
def astar(start, goal, occ):
|
|
|
201 |
|
202 |
# ── Robot sprite/class -──────────────────────────────────────────────────
|
203 |
class Robot:
|
204 |
+
def __init__(self, sprite, speed=5000): # Declare the robot's physical stats and routing (position, speed, movement, path)
|
205 |
img = Image.open(sprite).convert("RGBA").resize((40, 40))
|
206 |
self.png = np.array(img)
|
207 |
if self.png.shape[-1] != 4:
|
|
|
209 |
self.png = np.array(Image.open(sprite).convert("RGBA").resize((40,40)))
|
210 |
self.pos = [0,0]; self.speed=speed
|
211 |
def step(self, path):
|
212 |
+
while path:
|
213 |
+
dx, dy = path[0][0] - self.pos[0], path[0][1] - self.pos[1]
|
214 |
+
dist = (dx * dx + dy * dy) ** 0.5
|
215 |
+
if dist <= self.speed:
|
216 |
+
self.pos = list(path.pop(0))
|
217 |
+
else:
|
218 |
+
r = self.speed / dist
|
219 |
+
self.pos = [int(self.pos[0] + dx * r), int(self.pos[1] + dy * r)]
|
220 |
+
# Break after one logical move to avoid overshooting
|
221 |
+
break
|
222 |
+
|
223 |
|
224 |
# ── FastAPI & HTML content (original styling) ───────────────────────────
|
225 |
# HTML Content for UI (streamed with FastAPI HTML renderer)
|
|
|
473 |
for _ in range(15000): # safety frames
|
474 |
frame=bg.copy()
|
475 |
# Draw garbage chunk masks in red-to-green (semi-transparent)
|
476 |
+
frame = highlight_chunk_masks_on_frame(frame, labels, objs) # 🔴 garbage overlay
|
477 |
+
frame = highlight_water_mask_on_frame(frame, water_mask) # 🔵 water overlay
|
478 |
# Draw object detections as red (to green) dots
|
479 |
for o in objs:
|
480 |
color = (0, 0, 128) if not o["col"] else (0, 128, 0)
|