代码功能特色总结
1. 核心功能
- 目标角度检测:
通过YOLOv8分割后的掩码图像,计算目标物体的倾斜角度(0°~180°),适用于工业检测、物体姿态分析等场景。
2. 关键算法与处理流程
-
轮廓提取与筛选
- 使用Canny边缘检测和
cv2.findContours
提取目标轮廓。 - 通过
select_largest_contour
选择最大轮廓,确保处理主要目标。
- 使用Canny边缘检测和
-
几何特征分析
- 凸包计算:
cv2.convexHull
获取目标的外接多边形,绘制红色边界线。 - 最小外接三角形:
cv2.minEnclosingTriangle
计算三角形顶点,用于辅助角度修正(如180°与0°的区分)。
- 凸包计算:
-
线段筛选与加权评估
- 从凸包边中筛选斜率小于40°的线段(接近水平的边)。
- 通过加权综合评估线段的垂直位置(权重
w1=0.7
)和长度(权重w2=0.3
),选择最优线段代表目标角度。
-
角度计算与修正
- 基于线段两端点坐标,用
np.arctan2
计算精确角度(0°~180°)。 - 特殊处理边界值(如
<5°
视为0°,>175°
视为180°),并通过三角形顶点位置进一步验证180°与0°的区分。
- 基于线段两端点坐标,用
3. 工程化设计
- 批量处理支持:
自动遍历输入文件夹(mask_images
和data/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")
适用场景
- 工业质检:检测零件摆放角度是否合规。
- 机器人抓取:计算目标物体倾斜角度以调整抓取姿态。
- 文档扫描:矫正倾斜的文本或图像。
改进建议
- 参数可配置化:
将权重(w1
、w2
)、角度阈值(如40°)通过命令行或配置文件输入。 - 多目标支持:
扩展为处理图像中的多个目标物体,分别计算角度。 - 性能优化:
使用多线程加速批量图像处理。
代码结构清晰,结合了几何特征提取与加权决策,适合需要快速获取物体角度的应用场景。