Files
masa-agent/maps/golden.py
2026-01-15 17:17:14 +08:00

76 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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("") # 每个多边形之间空一行,方便区分