我正在尝试在生成的列表关键点中找到最接近840,525的坐标。
背景: 我一直在研究一个系统,将一个blob(OpenCV给出每个中心的坐标)在屏幕中心移动到另一个blob,一次有多个生成的blob,但我想去距离我中间位置最近的斑点(840,525)。 Blob是由OpenCV发现的。当中间blob移动到鼠标指针的坐标时,该时刻由我的鼠标控制。
目前它只是将光标放在它找到的第一个点上。
detector = cv2.SimpleBlobDetector_create(params)
# Detect blobs.
keypoints = detector.detect(processed_img)
#put curser on top of blob
win32api.SetCursorPos((int(keypoints[0].pt[0]),(int(keypoints[0].pt[1]))))
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
processed_img = cv2.drawKeypoints(processed_img, keypoints, np.array([]), (255, 0, 0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
好的,OpenCV给了我一个大的列表或数组?然后我转换为像素坐标的点数。我不知道如何搜索列表或数组中的一个中间位置(840,525)。
谢谢,它不像VisualBasic,我可以循环每个人找到最接近的:(
答案 0 :(得分:2)
可以从关键点的keypoint
属性中获取OpenCV中.pt
对象的实际像素位置。
例如,在检测到图像中的关键点后,打印第一个关键点的坐标将如下所示:
>>> keypoints[0].pt
(100.80000305175781, 100.80000305175781)
您希望能够将最近的关键点抓取到某个指定位置。使用Python内置函数有两种非常简单的方法。 min()
和sorted()
函数都接受用于创建要比较的数字的key
参数 - 您需要每个关键点与设定点之间的距离。如果你做了sorted()
,你会得到按最小距离排序的所有关键点,如果你做min()
,你当然会得到最小的一个(而且会更快)。
假设您要检测到设定点(10,20)的最近关键点(此处使用(x,y)排序)。你可以这样做:
>>> pt = np.array([10, 20])
>>> nearest_kp = min(keypoints, key=lambda kp: np.linalg.norm(kp.pt - pt))
>>> nearest_kp.pt
(100.22400665283203, 100.22400665283203)
请注意,此处返回的值仍然是关键点,因此仍需要使用.pt
属性抓取它的实际位置。