在Python中以更少的关键点显示轻快的关键点

时间:2018-10-23 08:41:24

标签: python opencv computer-vision

我在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 here enter image description here enter image description here enter image description here

尽管图像不同(我可以在视觉单词方法中使用这些BRISK描述符轻松区分它们),但似乎所有这四个图像中检测到的关键点在视觉上都是相同的,或者可能是同心圆的数量很高使观众感到困惑。如何减少显示的关键点数量,以便通过这些描述符可以看到这些图像有何不同?

1 个答案:

答案 0 :(得分:1)

理想的答案是@Silencer建议过滤Keypoints。有几种方法可以实现。如果您进行调试,则可以查看ndarray Keypoints中包含哪些信息。该信息应类似于this。因此,使用此方法,您可以根据响应(建议从此开始)对Keypoints进行排序,也可以根据Keypoints的坐标进行排序。从根本上说,响应基本上是关键点的好坏,具体而言,关键点的边角性有多好。

例如:

基于索引

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]

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

res = keypoints[i].response

我看到BRISK的响应从31到320,但是您必须为图像找到最佳价值。

希望有帮助!