代码功能特色总结
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")
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")
适用场景
- 工业质检:检测零件摆放角度是否合规。
- 机器人抓取:计算目标物体倾斜角度以调整抓取姿态。
- 文档扫描:矫正倾斜的文本或图像。
改进建议
- 参数可配置化:
将权重(w1
、w2
)、角度阈值(如40°)通过命令行或配置文件输入。 - 多目标支持:
扩展为处理图像中的多个目标物体,分别计算角度。 - 性能优化:
使用多线程加速批量图像处理。
代码结构清晰,结合了几何特征提取与加权决策,适合需要快速获取物体角度的应用场景。