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("") # 每个多边形之间空一行，方便区分