用列表推导式过滤非匹配关键点

2024-09-27 00:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用

    bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=True)
    matches = bf.match(des1,des2)

我想根据匹配项从我的kps1,kps2列表中筛选不相关的关键点。我尝试以这种方式使用DMatch.trainIdxDMatch.queryIdx字段:

new_kps1 = [kp if idx in match.trainIdx for idx,kp in enumerate(kps1) for match in matches]

我最终还是这样做的:

ls1 = []
ls2 = []
for m in matches:
    ls1 += [kps1[m.trainIdx]]
    ls2 += [kps2[m.queryIdx]]

这在列表理解中是可能的吗


Tags: in列表formatchcv2matchesidxkp
1条回答
网友
1楼 · 发布于 2024-09-27 00:19:07

可以使用Python习惯用法zip(*x)将元组列表转换为列表元组。这样,您可以在开始时只记录元组:

x = [(kps1[m.trainIdx], kps2[m.queryIdx]) for m in matches]
ls1, ls2 = map(list, zip(*x))

你甚至可以把它放在一行,以可读性为代价:

ls1, ls2 = map(list, zip(*[(kps1[m.trainIdx], kps2[m.queryIdx]) for m in matches]))

相关问题 更多 >

    热门问题