import cv2 import numpy as np # === 1. 檔案與參數設定 === img_path = r'C:\Users\rd_de\kneronstdc\work_dirs\vis_results\good\pic_0441_jpg.rf.6e56eb8c0bed7f773fb447b9e217f779_leftImg8bit.png' # 色彩轉 label ID(RGB) CLASS_RGB_TO_ID = { (128, 64, 128): 3, # road(灰) (0, 255, 0): 1, # grass(綠) (255, 0, 255): 9, # background or sky(紫)可忽略 } ROAD_ID = 3 GRASS_ID = 1 # === 2. 讀圖並轉為 label mask === bgr_img = cv2.imread(img_path) rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) height, width, _ = rgb_img.shape label_mask = np.zeros((height, width), dtype=np.uint8) for rgb, label in CLASS_RGB_TO_ID.items(): match = np.all(rgb_img == rgb, axis=-1) label_mask[match] = label # === 3. 分析畫面中下區域 === y_start = int(height * 0.6) x_start = int(width * 0.4) x_end = int(width * 0.6) roi = label_mask[y_start:, x_start:x_end] total_pixels = roi.size road_pixels = np.sum(roi == ROAD_ID) grass_pixels = np.sum(roi == GRASS_ID) road_ratio = road_pixels / total_pixels grass_ratio = grass_pixels / total_pixels # === 4. 重心偏移分析 === road_mask = (label_mask == ROAD_ID).astype(np.uint8) M = cv2.moments(road_mask) center_x = width // 2 offset = 0 cx = center_x if M["m00"] > 0: cx = int(M["m10"] / M["m00"]) offset = cx - center_x # === 5. 結果輸出 === print(f"🔍 中央 ROI - road比例: {road_ratio:.2f}, grass比例: {grass_ratio:.2f}") if road_ratio < 0.5: print("⚠️ 偏離道路(ROI 中道路比例過少)") if grass_ratio > 0.3: print("❗ 車輛壓到草地!") if abs(offset) > 40: print(f"⚠️ 道路重心偏移:{offset} px") else: print("✅ 道路重心正常") # === 6. 可視化 === vis_img = bgr_img.copy() cv2.rectangle(vis_img, (x_start, y_start), (x_end, height), (0, 255, 255), 2) # 黃色框 ROI cv2.line(vis_img, (center_x, 0), (center_x, height), (255, 0, 0), 2) # 藍色中心線 cv2.circle(vis_img, (cx, height // 2), 6, (0, 0, 255), -1) # 紅色重心點 # 輸出圖片 save_path = r'C:\Users\rd_de\kneronstdc\work_dirs\vis_results\good\visual_check.png' cv2.imwrite(save_path, vis_img) print(f"✅ 分析圖儲存成功:{save_path}")