diff --git a/app.py b/app.py index 82a95d3..df3fd48 100644 --- a/app.py +++ b/app.py @@ -34,6 +34,20 @@ def line_intersect(p1, p2, p3, p4): return 0 <= t <= 1 and 0 <= u <= 1 +def ccw(A, B, C): + """Check if three points are in counter-clockwise order""" + return (C[1] - A[1]) * (B[0] - A[0]) > (B[1] - A[1]) * (C[0] - A[0]) + +def crossed_line(prev_pos, curr_pos, line_start, line_end): + """ + Check if movement from prev_pos to curr_pos crossed the line. + Uses orientation check - more robust for frame skipping. + """ + # Check if the two line segments intersect + if line_intersect(prev_pos, curr_pos, line_start, line_end): + return True + return False + @app.route('/') def index(): return render_template('index.html') @@ -130,13 +144,16 @@ def detect_objects_from_webcam(line_data): # If we have a previous position for this track if track_id in track_positions and track_id not in counted_ids: prev_x, prev_y = track_positions[track_id] + # Draw the movement line (orange/blue) + cv2.line(frame, (prev_x, prev_y), (center_x, center_y), (255, 100, 0), 2) + # Check if the vehicle crossed the counting line - if line_intersect((prev_x, prev_y), (center_x, center_y), line_start, line_end): + if crossed_line((prev_x, prev_y), (center_x, center_y), line_start, line_end): counted_ids.add(track_id) vehicle_count += 1 vehicle_type_counts[c] += 1 - # Draw visual feedback when vehicle is counted (green circle) - cv2.circle(frame, (center_x, center_y), 15, (0, 255, 0), 3) + # Draw visual feedback when vehicle is counted (large green circle) + cv2.circle(frame, (center_x, center_y), 25, (0, 255, 0), 5) # Update position track_positions[track_id] = (center_x, center_y) @@ -265,13 +282,16 @@ def detect_objects_from_video(video_path, line_data): # If we have a previous position for this track if track_id in track_positions and track_id not in counted_ids: prev_x, prev_y = track_positions[track_id] + # Draw the movement line (orange/blue) + cv2.line(frame, (prev_x, prev_y), (center_x, center_y), (255, 100, 0), 2) + # Check if the vehicle crossed the counting line - if line_intersect((prev_x, prev_y), (center_x, center_y), line_start, line_end): + if crossed_line((prev_x, prev_y), (center_x, center_y), line_start, line_end): counted_ids.add(track_id) vehicle_count += 1 vehicle_type_counts[c] += 1 - # Draw visual feedback when vehicle is counted (green circle) - cv2.circle(frame, (center_x, center_y), 15, (0, 255, 0), 3) + # Draw visual feedback when vehicle is counted (large green circle) + cv2.circle(frame, (center_x, center_y), 25, (0, 255, 0), 5) # Update position track_positions[track_id] = (center_x, center_y)