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

时间:2018-03-05 13:29:27

标签: python opencv

我有一个使用

生成的关键点匹配列表
path = "pdf\#{item.id}.pdf"
File.cp(upload.path, path)

我想根据匹配项从 bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=True) matches = bf.match(des1,des2) 列表中过滤掉不相关的关键点。我尝试以这种方式使用kps1,kps2DMatch.trainIdx字段:

DMatch.queryIdx

我最终这样做了:

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

这是否可能以某种方式在列表理解中?

1 个答案:

答案 0 :(得分:1)

您可以使用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]))