可以解决AttributeError: 'numpy.ndarray' object has no attribute 'queryIdx问题吗,这部分的代码是def matched_points(K, img_depth1, img_depth2, keypoint1, keypoint2, good_matches): # 测试图像特征点坐标列表(->int) points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int) # 样本图像特征点坐标列表(->int),PnP 3D-2D中的2D points2 = np.array([list(keypoint2[x.trainIdx].pt) for x in good_matches]).astype(int) points_3d1 = [] points_3d2 = [] # shape函数是Numpy中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度 for i in range(points1.shape[0]): depth1 = img_depth1[points1[i][1], points1[i][0]] # 深度信息,由于imread得到宽高顺序,所以1,0 depth2 = img_depth2[points2[i][1], points2[i][0]] if depth1 == 0 or depth2 == 0: # 没有读取到深度->bad depth continue # 坐标转化为归一化坐标 point1 = pixel2cam(points1[i], K) point2 = pixel2cam(points2[i], K) # 读取深度,这里除以5000不太清楚是固定步骤还是说可改参数( dd1 = point1 / 5000.0 dd2 = point2 / 5000.0 points_3d1.append([point1[1] * dd1, point1[0] * dd1, dd1]) # 世界坐标系坐标 points_3d2.append([point2[1] * dd2, point2[0] * dd2, dd2]) # 相机图像坐标系坐标 points_3d1 = np.array(points_3d1).astype(np.float64) points_3d2 = np.array(points_3d2).astype(np.float64) return points_3d1, points_3d2
时间: 2023-06-25 14:07:20 浏览: 59
这个问题可能是因为good_matches中的元素类型不是cv2.DMatch,而是numpy.ndarray。可以在函数调用之前将其转换为cv2.DMatch类型。
修改代码如下:
```
def matched_points(K, img_depth1, img_depth2, keypoint1, keypoint2, good_matches):
# 将good_matches转换为cv2.DMatch类型
good_matches = [cv2.DMatch(*match) for match in good_matches]
# 测试图像特征点坐标列表(->int)
points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int)
# 样本图像特征点坐标列表(->int),PnP 3D-2D中的2D
points2 = np.array([list(keypoint2[x.trainIdx].pt) for x in good_matches]).astype(int)
points_3d1 = []
points_3d2 = []
for i in range(points1.shape[0]):
depth1 = img_depth1[points1[i][1], points1[i][0]] # 深度信息,由于imread得到宽高顺序,所以1,0
depth2 = img_depth2[points2[i][1], points2[i][0]]
if depth1 == 0 or depth2 == 0: # 没有读取到深度->bad depth
continue
# 坐标转化为归一化坐标
point1 = pixel2cam(points1[i], K)
point2 = pixel2cam(points2[i], K)
# 读取深度,这里除以5000不太清楚是固定步骤还是说可改参数(
dd1 = depth1 / 5000.0
dd2 = depth2 / 5000.0
points_3d1.append([point1[1] * dd1, point1[0] * dd1, dd1]) # 世界坐标系坐标
points_3d2.append([point2[1] * dd2, point2[0] * dd2, dd2]) # 相机图像坐标系坐标
points_3d1 = np.array(points_3d1).astype(np.float64)
points_3d2 = np.array(points_3d2).astype(np.float64)
return points_3d1, points_3d2
```