You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过YOLOv8获取多边形分割结果的四个角点?

提取YOLOv8分割多边形的四个角点方案

方法1:直接提取轮廓极值点(适用于规则正放矩形)

YOLOv8返回的masks.segments[0]是形状为(N, 2)的numpy数组,每一行对应轮廓点的[x, y]像素坐标。对于正放的棋盘矩形,可直接提取四个方向的极值点:

import numpy as np
from ultralytics import YOLO

# 加载模型并执行预测
model_trained = YOLO("runs/segment/yolov8n-seg_chessboard/weights/best.pt")
results = model_trained.predict(source="1.jpgresized.jpg", line_thickness=2, save_txt=True, save=True)

# 获取第一个分割目标的轮廓点集合
seg_points = results[0].masks.segments[0]

# 提取四个角点
leftmost = seg_points[np.argmin(seg_points[:, 0])]   # x最小的点
rightmost = seg_points[np.argmax(seg_points[:, 0])]  # x最大的点
topmost = seg_points[np.argmin(seg_points[:, 1])]    # y最小的点
bottommost = seg_points[np.argmax(seg_points[:, 1])] # y最大的点

four_corners = [leftmost, rightmost, topmost, bottommost]
print("四个角点坐标:", four_corners)

方法2:计算最小外接矩形(适用于倾斜矩形)

如果棋盘存在倾斜,直接取极值点会有偏差,可用OpenCV计算最小外接矩形获取精准角点:

import numpy as np
import cv2
from ultralytics import YOLO

# 加载模型并执行预测
model_trained = YOLO("runs/segment/yolov8n-seg_chessboard/weights/best.pt")
results = model_trained.predict(source="1.jpgresized.jpg", line_thickness=2, save_txt=True, save=True)

# 转换轮廓点为OpenCV要求的格式
seg_points = results[0].masks.segments[0].astype(np.int32)
seg_points = seg_points.reshape((-1, 1, 2))

# 计算最小外接矩形并提取四个角点
rect = cv2.minAreaRect(seg_points)
box = cv2.boxPoints(rect)
four_corners = np.int0(box)

print("倾斜矩形的四个角点:", four_corners)

方法3:提取凸包顶点(适用于带冗余点的凸多边形)

若分割轮廓存在冗余点,可先提取凸包简化轮廓,再获取顶点:

import numpy as np
import cv2
from ultralytics import YOLO

# 加载模型并执行预测
model_trained = YOLO("runs/segment/yolov8n-seg_chessboard/weights/best.pt")
results = model_trained.predict(source="1.jpgresized.jpg", line_thickness=2, save_txt=True, save=True)

# 转换轮廓点格式
seg_points = results[0].masks.segments[0].astype(np.int32)
seg_points = seg_points.reshape((-1, 1, 2))

# 计算凸包并提取顶点
hull = cv2.convexHull(seg_points)
hull_points = hull.reshape(-1, 2)
print("凸包顶点(矩形场景下为4个点):", hull_points)

注意事项

  • masks.segments中的坐标是原图像素坐标,无需额外转换
  • 若存在多个分割目标,需遍历masks.segments列表逐个处理
  • 若轮廓点有噪声,可先用cv2.approxPolyDP做轮廓近似简化

内容的提问来源于stack exchange,提问作者shainis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:09:26