yolov8分割后获取目标角度与鞋子物体摆放角度识别


代码功能特色总结

1. 核心功能
  • 目标角度检测
    通过YOLOv8分割后的掩码图像,计算目标物体的倾斜角度(0°~180°),适用于工业检测、物体姿态分析等场景。
    在这里插入图片描述
2. 关键算法与处理流程
  1. 轮廓提取与筛选

    • 使用Canny边缘检测和cv2.findContours提取目标轮廓。
    • 通过select_largest_contour选择最大轮廓,确保处理主要目标。
  2. 几何特征分析

    • 凸包计算cv2.convexHull获取目标的外接多边形,绘制红色边界线。
    • 最小外接三角形cv2.minEnclosingTriangle计算三角形顶点,用于辅助角度修正(如180°与0°的区分)。
  3. 线段筛选与加权评估

    • 从凸包边中筛选斜率小于40°的线段(接近水平的边)。
    • 通过加权综合评估线段的垂直位置(权重w1=0.7)和长度(权重w2=0.3),选择最优线段代表目标角度。
  4. 角度计算与修正

    • 基于线段两端点坐标,用np.arctan2计算精确角度(0°~180°)。
    • 特殊处理边界值(如<5°视为0°,>175°视为180°),并通过三角形顶点位置进一步验证180°与0°的区分。
      在这里插入图片描述
3. 工程化设计
  • 批量处理支持
    自动遍历输入文件夹(mask_imagesdata/images),处理所有图像并保存结果到output文件夹。
  • 进度反馈
    实时打印处理进度(如已处理 15/20 张图片)。
  • 资源管理
    处理完成后自动删除临时输入文件夹(shutil.rmtree)。
4. 可视化输出
  • 标注叠加
    在原图(image1)上标注角度值(Angle: XX),保留原始图像信息。
  • 调试辅助
    可绘制凸包(红色)和候选线段(绿色),方便算法验证(需取消注释相关代码)。
    在这里插入图片描述
5. 鲁棒性优化
  • 归一化处理
    对线段位置和长度进行归一化(normalize函数),避免特征尺度差异影响加权评估。
  • 异常处理
    空轮廓检测(如select_largest_contour中隐含的非空检查)和角度边界条件处理。

from tools.seg_predict import segment_images
from tools.angle import process_images

if __name__ == '__main__':
    # 使用函数
    segment_images('./data/images', './weight/best_seg.pt', "./data/mask")
    process_images("data/mask",'data/images', "output")
    from ultralytics import YOLO
import os
import cv2
import numpy as np
from tqdm import tqdm

def segment_images(image_folder, model_path,output_folder_mask):
    # 创建输出文件夹
    os.makedirs(output_folder_mask, exist_ok=True)

    # 加载预训练模型
    model = YOLO(model_path)
    # 读取文件夹中的所有图像
    for filename in tqdm(os.listdir(image_folder), desc="Processing images"):
        if filename.endswith(".jpg") or filename.endswith(".png"):
            img_path = os.path.join(image_folder, filename)

            # 对图像进行推理
            results = model(img_path,imgsz=1024)
            for result in results:
                # 读取原始图像
                original_img = cv2.imread(img_path)

                # 创建一个全零数组
                mask_tmp = np.zeros((1024, 1024, 3))

                # 对每个对象进行迭代
                for i in range(len(result.masks)):
                    mask = result.masks.data[i].cpu().numpy()  # 获取对象的分割蒙版
                    mask = np.expand_dims(mask, axis=0)
                    # 复制通道维度
                    mask = np.transpose(mask, (1, 2, 0))
                    mask = np.dstack([mask, mask, mask])
                    # 累加 mask
                    mask_tmp += mask

                # 保存蒙版图像
                mask_output_path = os.path.join( output_folder_mask, f'{filename}')
                cv2.imwrite(mask_output_path, mask_tmp * 255)  # 将蒙版值从[0,1]转换为[0,255]

# 使用函数
if __name__ == '__main__':
    segment_images('../data/images', '../weight/best_seg.pt', "../data/mask")

适用场景

  • 工业质检:检测零件摆放角度是否合规。
  • 机器人抓取:计算目标物体倾斜角度以调整抓取姿态。
  • 文档扫描:矫正倾斜的文本或图像。

改进建议

  1. 参数可配置化
    将权重(w1w2)、角度阈值(如40°)通过命令行或配置文件输入。
  2. 多目标支持
    扩展为处理图像中的多个目标物体,分别计算角度。
  3. 性能优化
    使用多线程加速批量图像处理。

代码结构清晰,结合了几何特征提取与加权决策,适合需要快速获取物体角度的应用场景。