如何通过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
相关产品推荐
相关产品推荐

