webcam working
This commit is contained in:
parent
e1da9a6dca
commit
7911245ff9
2 changed files with 30 additions and 10 deletions
|
@ -1,22 +1,32 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import cv2
|
||||
import time
|
||||
import logging
|
||||
import shutil
|
||||
import threading # added threading
|
||||
|
||||
from siwatsystem.pympta import load_pipeline_from_zip, run_pipeline
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s")
|
||||
|
||||
# Global variables for frame sharing
|
||||
global_frame = None
|
||||
global_ret = False
|
||||
capture_running = False
|
||||
|
||||
def video_capture_loop(cap):
|
||||
global global_frame, global_ret, capture_running
|
||||
while capture_running:
|
||||
global_ret, global_frame = cap.read()
|
||||
time.sleep(0.01) # slight delay to reduce CPU usage
|
||||
|
||||
def clear_cache(cache_dir: str):
|
||||
if os.path.exists(cache_dir):
|
||||
shutil.rmtree(cache_dir)
|
||||
os.makedirs(cache_dir, exist_ok=True)
|
||||
|
||||
def main(mpta_file: str, video_source: str):
|
||||
global capture_running
|
||||
CACHE_DIR = os.path.join(".", ".mptacache")
|
||||
clear_cache(CACHE_DIR)
|
||||
logging.info(f"Loading pipeline from local file: {mpta_file}")
|
||||
|
@ -30,13 +40,19 @@ def main(mpta_file: str, video_source: str):
|
|||
logging.error(f"Cannot open video source {video_source}")
|
||||
return
|
||||
|
||||
# Start video capture in a separate thread
|
||||
capture_running = True
|
||||
capture_thread = threading.Thread(target=video_capture_loop, args=(cap,))
|
||||
capture_thread.start()
|
||||
|
||||
logging.info("Press 'q' to exit.")
|
||||
try:
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
logging.error("Failed to capture frame.")
|
||||
break
|
||||
# Use the global frame and ret updated by the thread
|
||||
if not global_ret or global_frame is None:
|
||||
continue # wait until a frame is available
|
||||
|
||||
frame = global_frame # local copy to work with
|
||||
|
||||
detection, bbox = run_pipeline(frame, model_tree, return_bbox=True)
|
||||
if bbox:
|
||||
|
@ -50,9 +66,11 @@ def main(mpta_file: str, video_source: str):
|
|||
if cv2.waitKey(1) & 0xFF == ord('q'):
|
||||
break
|
||||
finally:
|
||||
# Stop capture thread and cleanup
|
||||
capture_running = False
|
||||
capture_thread.join()
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
# Clear cache on shutdown
|
||||
clear_cache(CACHE_DIR)
|
||||
logging.info("Cleaned up .mptacache directory on shutdown.")
|
||||
|
||||
|
|
|
@ -106,7 +106,8 @@ def run_pipeline(frame, node: dict, return_bbox: bool = False):
|
|||
best_box = box_cpu
|
||||
|
||||
bbox = None
|
||||
if detection and node.get("crop", False) and best_box is not None:
|
||||
# Modified bounding box calculation: always compute bbox if best_box exists
|
||||
if detection and best_box is not None:
|
||||
coords = best_box.xyxy[0]
|
||||
x1, y1, x2, y2 = map(int, coords)
|
||||
h, w = frame.shape[:2]
|
||||
|
@ -114,7 +115,8 @@ def run_pipeline(frame, node: dict, return_bbox: bool = False):
|
|||
x2, y2 = min(w, x2), min(h, y2)
|
||||
if x2 > x1 and y2 > y1:
|
||||
bbox = (x1, y1, x2, y2)
|
||||
frame = frame[y1:y2, x1:x2]
|
||||
if node.get("crop", False):
|
||||
frame = frame[y1:y2, x1:x2]
|
||||
|
||||
if detection is not None:
|
||||
for branch in node["branches"]:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue