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

55 lines
1.7 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_building_coordinates(image_path):
# 加载图片
img = cv2.imread(image_path)
if img is None:
print("无法加载图片")
return
# 转换到灰度空间
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 针对 Google Maps 风格的建筑颜色进行阈值处理
# 建筑通常是特定的浅灰色 (约 230-245 之间)
# 我们通过 inRange 提取这个颜色区间
mask = cv2.inRange(gray, 220, 245)
# 进行形态学操作以去除细小噪声
kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
# 查找轮廓
# RETR_EXTERNAL 只查找最外层轮廓
# CHAIN_APPROX_TC89_KCOS 使用精度较高的近似算法
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS)
buildings_data = []
for cnt in contours:
# 过滤掉面积过小的噪点
if cv2.contourArea(cnt) < 50:
continue
# 多边形拟合epsilon 越小,顶点越密集,形状越精确
epsilon = 0.002 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
points = []
for point in approx:
x, y = point[0]
points.append((float(x), float(y)))
buildings_data.append(points)
# 输出结果
for i, building in enumerate(buildings_data):
print(f"# Building {i+1}")
for x, y in building:
print(f"{x}, {y}")
print() # 每个建筑间空一行
if __name__ == "__main__":
# 将 'nasa.jpg' 替换为你的文件名
extract_building_coordinates('nasa.png')