import cv2 import numpy as np def extract_green_polygons(image_path): # 1. 读取图片 img = cv2.imread(image_path) if img is None: print("无法读取图片") return [] # 获取图片尺寸 height, width = img.shape[:2] # 定义目标坐标系范围 target_w, target_h = 1465, 715 # 2. 转换颜色空间到 HSV 以便提取绿色 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义绿色的 HSV 范围 lower_green = np.array([35, 20, 200]) upper_green = np.array([85, 255, 255]) # 3. 创建掩膜 (Mask) mask = cv2.inRange(hsv, lower_green, upper_green) # 4. 图像形态学处理 kernel = np.ones((3,3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 5. 查找轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) polygons = [] for i, contour in enumerate(contours): # 过滤掉太小的区域 if cv2.contourArea(contour) < 100: continue points = [] # 6. 坐标转换 for point in contour: px, py = point[0] # 【修改点1】:这里显式转换成 float(),去除 numpy 类型包裹 # X 轴转换: 线性缩放 new_x = float((px / width) * target_w) # Y 轴转换: 图像坐标系 -> 笛卡尔坐标系 new_y = float(((height - py) / height) * target_h) # 保留两位小数 points.append((round(new_x, 2), round(new_y, 2))) polygons.append({ "id": i, "vertex_count": len(points), "coordinates": points }) return polygons # --- 使用说明 --- results = extract_green_polygons("golden_gate_bridge.png") if not results: print("未找到多边形或图片读取失败") else: for poly in results: print(f"--- 多边形 ID: {poly['id']} (顶点数: {poly['vertex_count']}) ---") # 【修改点2】:遍历坐标列表,每行输出两个数字 (x y) for x, y in poly['coordinates']: print(f"{x}, {y}") print("") # 每个多边形之间空一行,方便区分