points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int)有什么用
时间: 2023-06-25 21:07:48 浏览: 135
这段代码将从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` 不是由 `cv2` 库中的 `BFMatcher` 或 `FlannBasedMatcher` 函数返回的 `DMatch` 对象列表。这些对象包含了匹配关键点的信息,其中包括匹配的两个关键点的索引。
请确保在使用 `good_matches` 之前,已经通过 `BFMatcher` 或 `FlannBasedMatcher` 函数获得了 `DMatch` 对象列表。你可以按照以下步骤进行:
1. 首先,使用 `cv2` 库中的 `ORB` 或 `SIFT` 算法对两张图片提取关键点和特征描述符。
2. 然后,使用 `cv2` 库中的 `BFMatcher` 或 `FlannBasedMatcher` 函数将两张图片的特征描述符进行匹配,并返回 `DMatch` 对象列表。
3. 最后,根据 `DMatch` 对象列表,提取出匹配关键点的信息,如下所示:
```python
# 使用 BFMatcher 进行关键点匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
good_matches = sorted(matches, key = lambda x:x.distance)[:10]
# 提取匹配关键点的信息
points1 = np.array([kp1[m.queryIdx].pt for m in good_matches]).astype(int)
points2 = np.array([kp2[m.trainIdx].pt for m in good_matches]).astype(int)
```
在上面的代码中,`kp1` 和 `kp2` 是分别在两张图片上提取的关键点列表,`des1` 和 `des2` 是分别对应的特征描述符列表。`good_matches` 是从所有匹配中挑选出的最佳匹配。
最后,使用 `good_matches` 中的索引信息从 `kp1` 和 `kp2` 中提取出匹配的关键点坐标。
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两个数组,分别表示两张图像中匹配特征点在世界坐标系下的坐标。在计算这些坐标时,需要将特征点的坐标转换为归一化坐标,并通过深度信息计算出世界坐标系下的坐标。该函数还对于没有读取到深度信息的特征点进行了过滤处理。
阅读全文
相关推荐















