File size: 1,644 Bytes
c1dcc23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"""Throwaway diagnostic: where do feet actually go on the entry camera?"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "pipeline"))
import cv2, warnings
warnings.filterwarnings("ignore")
from ultralytics import YOLO
from geometry import foot_point

cap = cv2.VideoCapture("../CCTV Footage/CAM 3.mp4")
native = cap.get(cv2.CAP_PROP_FPS); stride = max(1, round(native / 6))
m = YOLO("yolov8n.pt")
tracks = {}  # tid -> list of (x,y)
idx = -1
while True:
    ok = cap.grab()
    if not ok: break
    idx += 1
    if idx % stride: continue
    ok, fr = cap.retrieve()
    if not ok: break
    h, w = fr.shape[:2]
    r = m.track(fr, persist=True, classes=[0], conf=0.15, imgsz=640, tracker="bytetrack.yaml", verbose=False)[0]
    if r.boxes is None or r.boxes.id is None: continue
    for tid, box in zip(r.boxes.id.cpu().numpy().astype(int), r.boxes.xyxy.cpu().numpy()):
        tracks.setdefault(int(tid), []).append(foot_point(box, w, h))
cap.release()

subst = {t: pts for t, pts in tracks.items() if len(pts) >= 4}
print(f"total tracks={len(tracks)} substantial(>=4)={len(subst)}")
# vertical line x~0.43 vs horizontal line y~0.45 — which do tracks span?
span_x = span_y = 0
for t, pts in subst.items():
    xs = [p[0] for p in pts]; ys = [p[1] for p in pts]
    if min(xs) < 0.40 and max(xs) > 0.46: span_x += 1
    if min(ys) < 0.40 and max(ys) > 0.50: span_y += 1
    print(f"  t{t:>3} n={len(pts):>3} x[{min(xs):.2f},{max(xs):.2f}] y[{min(ys):.2f},{max(ys):.2f}]")
print(f"tracks spanning vertical x=0.43 line: {span_x}")
print(f"tracks spanning horizontal y=0.45 line: {span_y}")