尝试从点列表中找到距离屏幕中间最近的点

时间:2017-12-10 06:59:20

标签: python opencv

我正在尝试在生成的列表关键点中找到最接近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,我可以循环每个人找到最接近的:(

1 个答案:

答案 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属性抓取它的实际位置。