在Python中使用较少的关键点显示Brisk算法的关键点

3

我在Python中有以下代码

import cv2
import numpy as np

def save_keypoints(image_path, type_image):
    img = cv2.imread(image_path)
    gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    kp, descriptors =cv2.BRISK_create(10).detectAndCompute(gray,None)
    mg=cv2.drawKeypoints(gray, kp, None, 
    flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    cv2.imwrite('brisk_keypoints-'+ type_image+'.jpg',mg)

if __name__=="__main__":
    save_keypoints("original.bmp" ,"original")
    save_keypoints("fake600.bmp" ,"fake600")
    save_keypoints("fake1200.bmp" ,"fake1200")
    save_keypoints("fake2400.bmp" ,"fake2400")

基本上,该代码将保存检测到BRISK关键点的图像。然而,这是应用此代码在四个图像中的结果:

enter image description hereenter image description hereenter image description hereenter image description here

虽然这些图像不同(我可以很容易地通过使用这些BRISK描述符在视觉单词包方法中来区分它们),但似乎所有这四个图像中检测到的关键点在视觉上相同,或者说高数量的同心圆会使观察者感到困惑。如何减少显示的关键点数量,以便我可以通过这些描述符看到这些图像的不同之处?


1
尝试通过关键点响应进行选择.. - Kinght 金
@Silencer,你能否给我一个关于如何做到这一点的例子吗? - mad
1个回答

2
理想的答案应该是像@Silencer建议的那样过滤Keypoints。您可以通过调试查看ndarrayKeypoints中包含的信息。该信息应该类似于此处。因此,您可以根据响应(我建议从这个开始)或Keypoints的坐标对其进行排序。响应基本上是Keypoint有多好,粗略地说,特定Keypoint的拐角程度有多好。

例如:

根据索引

keypoints = detector.detect(frame) #list of keypoints
x = keypoints[i].pt[0] #i is the index of the Keypoint you want to get the position
y = keypoints[i].pt[1]

您可以在lambda表达式(而不是循环)或numpy函数中使用此代码进行快速优化。同样,对于响应,您可以执行以下操作:

res = keypoints[i].response

我见过 BRISK 的响应范围从 31 到 320,但你需要找到最适合你的图像的最佳值。希望这能帮到你!

1
谢谢您的回答,但我在这方面还是个新手,所以需要您的帮助。假设我只想绘制两个关键点(31和32),我该如何使用cv2.drawKeypoints在Python中实现呢?再次感谢。 - mad
1
没问题。正如你看到的那样,函数drawKeypoints接受第二个参数为“Keypoint”的_容器_,因此你可以传递i==31和i==32处的关键点,它应该可以工作。 - Rick M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接