通过aruco码定位实现红绿灯检测(一)
前言
红绿灯检测属于小物体检测问题,虽然跟交通标志牌类似,都属于静态物体检测,但红绿灯的状态是实时发生变化的,这提升了检测的难度。所以我们根据识别到的aruco码进行划定区域。
提示:以下是本篇文章正文内容,下面案例可供参考
一、aruco码是什么?
姿态估计(Pose estimation)在计算机视觉领域扮演着十分重要的角色: 机器人导航、增强现实等。这一过程的基础是找到现实世界和图像投影之间的对应点。最为流行的一个途径是基于二进制平方的标记,它可以提供四个角来获取相机的信息,内部的二进制编码允许应用错误检测及校正。
aruco库是检测二进制marker的非常流行的库,可根据图像和激光雷达参数的3D点云实现2D和3D的匹配,找到至少4个二维像素和3D点云点的对应点,根据这四组对应点和相机内外参数估计相机姿态。
# 解算位姿的函数
def CalculatePositon(Point3D, Point2D, K):
''''''
Dis = np.array([0,0,0,0,0.])
Point3D = Point3D # 去中心化
ret, RvecW2C, tW2C = cv2.solvePnP(Point3D, Point2D, K, Dis) # 解算位姿
RW2C = cv2.Rodrigues(RvecW2C)[0]
# RC2W = np.linalg.inv(RW2C)
tC2W = -np.linalg.inv(RW2C).dot(tW2C)
New_tC2W = tC2W.flatten() # 相机在世界坐标系下的坐标
CamPosition = -RW2C.dot(New_tC2W) # 世界坐标系在相机坐标系下的坐标
return CamPosition
def DealMarker(Img, K, Show = False):
CamPosition = []
MarkerROI = None
Corners, IDs, _ = aruco.detectMarkers(Img, dict)
if len(Corners) == 2: # 如果检测点
Point3D = np.empty((0, 3))
Point2D = np.empty((0, 2