求目标物体的yaw角

发布于:2024-12-18 ⋅ 阅读:(86) ⋅ 点赞:(0)

从实例分割点集到计算物体的 Yaw 角度的原理和编程

在计算机视觉中,通过多个实例分割得到的点集可以提取每个对象的几何特征,最终计算物体的 yaw 角度(在水平面上的旋转角)。以下详细描述从点集处理到求解 yaw 角度的整个流程及其数学原理。

  1. 从实例分割到点集的获取

实例分割通过模型(如 yolov5)生成二值掩码图,每个物体区域用一组像素点表示:
• 输入:实例分割的二值掩码,非零像素表示物体。
• 输出:像素点集 ( x i , y i ) i = 1 n {(x_i, y_i)}_{i=1}^n (xi,yi)i=1n

点集形式是后续几何计算的基础。

  1. 使用 findContours 提取轮廓

OpenCV 的 cv2.findContours 函数将二值图像中的非零像素点集合为边界曲线。数学原理基于:
• 边界追踪算法:如 Suzuki–Abe 算法,对像素间的连接关系建模,生成多边形轮廓。

步骤
输入:二值图像。
输出:轮廓点集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } \{(x_1, y_1), (x_2, y_2), \dots, (x_m, y_m)\} {(x1,y1),(x2,y2),,(xm,ym)}
3. 用 minAreaRect 计算最小外接矩形

OpenCV 的 cv2.minAreaRect 基于点集计算最小面积的旋转矩形。数学原理如下:

旋转最优性

•	凸包假设:最小外接矩形的边必与点集的凸包边重合。
•	旋转卡壳:依次遍历凸包的每条边,将其旋转到与 x 轴平行,计算此时的外接矩形面积,选取最小值。

矩形参数

cv2.minAreaRect 返回:
1. 中心点 ( c x , c y ) (cx, cy) (cx,cy):矩形的质心。
2. 宽高 ( w , h ) (w, h) (w,h):矩形的两条边长。
3. 旋转角度 θ \theta θ:矩形与 x 轴正方向的夹角,范围为 ( − 9 0 ∘ , 0 ∘ ] (-90^\circ, 0^\circ] (90,0]

注意

•	如果 $w < h$,则 OpenCV 定义的 $\theta$ 表示短边与 x 轴夹角。
•	若需统一为长边夹角,则需重新调整角度。
  1. 计算物体的 Yaw 角度

Yaw 角度是物体在水平面上的方向角,定义为:
Yaw = { θ , w > h   θ + 9 0 ∘ , w ≤ h \text{Yaw} = \begin{cases} \theta, & w > h \ \theta + 90^\circ, & w \leq h \end{cases} Yaw={θ,w>h θ+90,wh

转换过程

•	矫正 OpenCV 的角度定义,使其与应用场景一致(如基于世界坐标系计算方向角)。
  1. 实例代码

以下代码完整实现上述流程,从实例分割掩码到求解 yaw 角度:

import cv2
import numpy as np
import math

模拟实例分割的二值掩码

mask = np.zeros((500, 500), dtype=np.uint8)
cv2.rectangle(mask, (150, 100), (350, 300), 255, -1) # 添加矩形物体
cv2.circle(mask, (400, 400), 50, 255, -1) # 添加圆形物体

提取轮廓

contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

遍历每个轮廓计算 minAreaRect 和 yaw 角度

for contour in contours:
    rect = cv2.minAreaRect(contour)  # 计算最小外接矩形
    box = cv2.boxPoints(rect)  # 获取矩形四个顶点
    box = np.int0(box)  # 转为整数
    
    # 计算物体 yaw 角度
    angle = rect[2]
    width, height = rect[1]
    if width < height:  # 矫正角度定义
        angle += 90
    
    print(f"物体中心: {rect[0]}, 宽高: {rect[1]}, 矫正后角度: {angle}")

    # 可视化
    output = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
    cv2.drawContours(output, [box], 0, (0, 0, 255), 2)
    cv2.imshow("Output", output)
    cv2.waitKey(0)

cv2.destroyAllWindows()
  1. 实际应用

    1. 机器人导航:计算障碍物或目标物体在水平面的方向。
    2. 工业检测:测量零件在生产线中的旋转角。
    3. 姿态估计:结合深度信息进一步推算物体三维姿态。

总结

通过实例分割点集处理、轮廓提取和最小外接矩形计算,可高效获取物体在二维平面上的旋转角度(Yaw)。整个过程基于几何算法和 OpenCV 提供的高效工具,适用于多种计算机视觉任务。