| import cv2 |
| import numpy as np |
| import gradio as gr |
| import requests |
| from io import BytesIO |
| from apify_client import ApifyClient |
|
|
| |
| client = ApifyClient("apify_api_YIdcCj4RBwUSEJfohmQo95dENLkUiJ3NzqTh") |
|
|
| def fetch_image_url(): |
| |
| run = client.task("epE74b4Zp6Z0ueWAo").call() |
|
|
| |
| for item in client.dataset(run["defaultDatasetId"]).iterate_items(): |
| print("Fetched screenshot URL:", item['screenshotUrl']) |
| return item['screenshotUrl'] |
|
|
| def download_image(url): |
| response = requests.get(url) |
| if response.status_code != 200: |
| print("Failed to download image. Status code:", response.status_code) |
| return None |
|
|
| image = np.array(bytearray(response.content), dtype=np.uint8) |
| image = cv2.imdecode(image, cv2.IMREAD_COLOR) |
| if image is None: |
| print("Failed to decode image.") |
| return image |
|
|
| def calculate_tci_from_url(): |
| image_url = fetch_image_url() |
| image = download_image(image_url) |
| if image is None: |
| return "Error: Could not download or decode the image." |
|
|
| |
| cv2.imwrite("downloaded_image.jpg", image) |
| |
| |
| image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) |
|
|
| |
| color_ranges = { |
| 'orange': ((10, 100, 100), (20, 255, 255)), |
| 'red': ((0, 100, 100), (10, 255, 255)), |
| 'red2': ((160, 100, 100), (180, 255, 255)), |
| 'green': ((40, 40, 40), (80, 255, 255)), |
| 'dark_red': ((0, 50, 50), (10, 100, 100)) |
| } |
|
|
| |
| masks = {} |
| for color, (lower, upper) in color_ranges.items(): |
| masks[color] = cv2.inRange(image_hsv, np.array(lower), np.array(upper)) |
|
|
| |
| masks['red'] = cv2.bitwise_or(masks['red'], masks['red2']) |
| del masks['red2'] |
|
|
| |
| total_pixels = image.shape[0] * image.shape[1] |
| percentages = {color: (np.sum(mask != 0) / total_pixels) * 100 for color, mask in masks.items()} |
| print("Color percentages:", percentages) |
|
|
| |
| orange_percentage = percentages['orange'] |
| green_percentage = percentages['green'] |
| red_percentage = percentages['red'] |
| dark_red_percentage = percentages['dark_red'] |
|
|
| |
| sum_percentage = orange_percentage + green_percentage + red_percentage + dark_red_percentage |
|
|
| |
| normalized_percentages = { |
| 'P0': (green_percentage / sum_percentage) * 100, |
| 'P1': (orange_percentage / sum_percentage) * 100, |
| 'P2': (red_percentage / sum_percentage) * 100, |
| 'P3': (dark_red_percentage / sum_percentage) * 100 |
| } |
| print("Normalized percentages:", normalized_percentages) |
|
|
| |
| TCI = (0 * normalized_percentages['P0'] + |
| 1 * normalized_percentages['P1'] + |
| 2 * normalized_percentages['P2'] + |
| 3 * normalized_percentages['P3']) |
|
|
| return TCI |
|
|
| |
| interface = gr.Interface( |
| fn=calculate_tci_from_url, |
| inputs=[], |
| outputs=gr.Textbox(label="Traffic Congestion Index (TCI)") |
| ) |
|
|
| |
| if __name__ == "__main__": |
| interface.launch(share=True) |