points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int)有什么用
时间: 2023-06-25 15:07:48 浏览: 125
这段代码将从Good Matches中提取出所有关键点1的坐标,并将其存储在一个Numpy数组points1中。具体来说,它使用了以下步骤:
1. 遍历good_matches列表中的所有匹配项。
2. 对于每个匹配项,使用x.queryIdx获取关键点1的索引值。
3. 使用keypoint1[x.queryIdx].pt获取关键点1的坐标,并将其作为列表添加到一个新的列表中。
4. 最后,将这个列表转换为一个Numpy数组,并将其类型转换为int类型。
这个数组可以用于后续的计算,例如计算变换矩阵或绘制匹配线。
相关问题
points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int) AttributeError: 'numpy.ndarray' object has no attribute 'queryIdx'
这个错误通常是因为 `good_matches` 对象不是正确的类型所导致的。通常情况下,`good_matches` 应该是一个 `list` 类型的对象,其中每个元素都是一个 `cv2.DMatch` 类型的对象,包含两个特征点之间的匹配信息。
请检查 `good_matches` 变量的类型和内容是否正确。如果 `good_matches` 不是一个 `list` 对象,可以尝试通过将其转换为 `list` 类型来解决这个问题,例如:
```
good_matches = list(good_matches)
```
如果 `good_matches` 是 `list` 对象,但是仍然无法访问 `queryIdx` 属性,可能是因为 `cv2.DMatch` 对象的版本不兼容所导致的。在这种情况下,您可以尝试使用其他版本的 OpenCV 库,或者尝试使用其他类型的匹配算法。
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
这段代码主要是实现了从两张图像中提取出匹配的特征点,并计算出这些特征点在世界坐标系下的坐标。具体来说,该函数的输入参数包括相机内参矩阵K、两张图像的深度图img_depth1和img_depth2、以及两张图像中的特征点keypoint1和keypoint2以及它们之间的匹配good_matches。该函数的输出结果包括points_3d1和points_3d2两个数组,分别表示两张图像中匹配特征点在世界坐标系下的坐标。在计算这些坐标时,需要将特征点的坐标转换为归一化坐标,并通过深度信息计算出世界坐标系下的坐标。该函数还对于没有读取到深度信息的特征点进行了过滤处理。
阅读全文