Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中用较少的关键点显示轻快的关键点_Python_Opencv_Computer Vision - Fatal编程技术网

在Python中用较少的关键点显示轻快的关键点

在Python中用较少的关键点显示轻快的关键点,python,opencv,computer-vision,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.d

我有以下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")
基本上,代码将保存一个检测到快速关键点的图像。但是,以下是在四幅图像中应用此代码的结果:


尽管这些图像是不同的(我可以很容易地用这些生动的描述符在一袋视觉文字的方法中区分它们),但似乎在所有这四幅图像中检测到的关键点在视觉上是相同的,或者可能是大量的同心圆让观众感到困惑。如何减少显示的关键点的数量,以便通过这些描述符看到这些图像的不同?

理想的答案是@消音器建议过滤
关键点。有几种方法可以实现这一点。如果进行调试,可以查看
ndarray
关键点中包含的信息。信息应该是这样的。因此,使用此选项,您可以根据响应对
关键点
进行排序(我建议从这个开始),也可以根据
关键点的坐标进行排序。响应基本上是关键点有多好,粗略地说,就是特定关键点的拐角度有多好

例如:

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

res = keypoints[i].response
我已经看到了BRISK从31到320的回应,但是你必须找到你的形象的最佳价值


希望有帮助

尝试通过关键点响应进行选择。@消音器您能给我一个如何进行选择的示例吗?谢谢您的回答,但我在这方面有点新手,所以我需要您的帮助。假设我只想画两个关键点(31和32)。在python中如何使用cv2.drawKeypoints实现这一点?再次谢谢你,没问题。如您所见,函数
drawKeypoints
接受
Keypoint
的容器作为其第二个参数,因此您可以在
i==31和i==32处传递关键点,它应该可以工作
res = keypoints[i].response