def get_aruco_src(pic, info, dictionary, selected_ids): # 第一个aruco码一定要检测出来(原点) # pic: 图片 # info: aruco信息 # selected_ids: 选中的id,有顺序从左往右,从上往下 # aix_delta: 左上角的像素在原图中的位置 #start_time = time.time() aix_delta = info["cut_info"][0], info["cut_info"][2] corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image=pic, dictionary=dictionary, parameters=None, ) if ids is None or len(corners) == 0: return None aruco_src = {} #end_time = time.time() #print("get_aruco_src耗时:{:.5f}秒".format(end_time - start_time)) for i in range(len(ids)): if str(int(ids[i])) in selected_ids: aruco_src[str(int(ids[i]))] = (corners[i].reshape(-1, 2) + aix_delta).tolist() return aruco_src
时间: 2024-02-14 19:18:40 浏览: 162
这段代码是用于获取图片中指定ArUco标记的四个角点坐标的函数。其中,pic表示输入的图片,info是ArUco标记的信息,dictionary是ArUco标记的字典,selected_ids是需要检测的标记的id列表。函数使用cv2库中的detectMarkers函数来检测图片中的ArUco标记,其中corners表示检测到的标记的四个角点坐标,ids表示检测到的标记的id,rejectedImgPoints表示未检测到的标记的四个角点坐标。如果未检测到指定的标记或者没有检测到任何标记,则返回None。如果检测到了指定的标记,则遍历ids和corners,将id在selected_ids中的标记的四个角点坐标保存在aruco_src字典中,并将坐标点加上aix_delta偏移量。最终返回aruco_src字典,其中包含了指定标记的四个角点在像素坐标系下的坐标。
相关问题
def get_angle_aruco(src, dst, world_size=(1, 1)): # 如果想使用T,最好保证src是在原点上的,不然求出来的值会很大,因为是绝对而不是相对的 RT, inlined = cv2.estimateAffinePartial2D(src, dst, confidence=0.95, maxIters=200000, method=cv2.LMEDS, refineIters=300) if np.sum(inlined == 1) < inlined.shape[0] / 2: return None R = RT[0:2, 0:2] T = RT[:, 2] T[0] = T[0] * world_size[0] T[1] = T[1] * world_size[1] det_r = np.linalg.det(R) R = R / (det_r ** 0.5) x = R[0, 0] y = R[0, 1] theta = math.atan2(y, x) / np.pi * 180 return R, T, theta
这段代码是用于计算二维图像上的ArUco标记的旋转和平移矩阵,以及相对于世界坐标系的旋转角度。其中,src和dst分别代表ArUco标记在图像中的四个角点在像素坐标系下的坐标,world_size表示在世界坐标系中标记的实际大小。函数使用cv2库中的estimateAffinePartial2D函数来估计旋转和平移矩阵,其中confidence表示置信度,maxIters表示最大迭代次数,method表示使用的方法,refineIters表示迭代次数。如果标记被正确识别,则返回R、T和theta。其中,R是旋转矩阵,T是平移向量,theta是旋转角度,根据旋转矩阵计算得到。最后,函数将平移向量按比例缩放到世界坐标系中的大小,并将旋转矩阵归一化,最终返回结果。
sub = rospy.Subscriber('aruco_marker_pose_debug', MarkerPoseArray, callback) 如何接收打印这个消息的位姿数据
在ROS(Robot Operating System)中,`rospy.Subscriber`是一个用于创建节点并订阅特定主题(如'aruco_marker_pose_debug')的数据的方法。当该主题发布新的`MarkerPoseArray`消息时,回调函数`callback`会被触发。
`MarkerPoseArray`是一种数据类型,其中包含了aruco标记的位姿(position and orientation)数据。当你设置了回调函数后,你可以在这个函数内部获取并处理接收到的`MarkerPoseArray`实例。具体操作通常涉及解包(unwrapping)数据结构,提取出每个标记的`pose`字段,其可能包括位置(position XYZ)和姿态(quaternion XYZW 或 Euler angles 等)。
下面是一个简单的例子,展示如何在回调函数中打印出位姿数据:
```python
def callback(data):
marker_poses = data.poses # 获取所有的Marker Pose数据
for pose in marker_poses:
position = pose.pose.position # 提取位置信息
orientation = pose.pose.orientation # 提取姿态信息
print(f"Position: {position.x}, {position.y}, {position.z}")
print(f"Orientation (quaternion): {orientation.x}, {orientation.y}, {orientation.z}, {orientation.w}")
# ...其他代码...
sub = rospy.Subscriber('aruco_marker_pose_debug', MarkerPoseArray, callback)
rospy.init_node('my_node_name') # 初始化节点
rospy.spin() # 进入ROS事件循环等待消息
```
在运行上述代码时,每当有新的aruco标记位姿数据到达,都会在控制台打印出相应的位置和姿态信息。
阅读全文