OpenCV从斑点检测中返回关键点坐标和面积,Python

19

我跟随一个 blob 检测示例(使用 cv2.SimpleBlobDetector),并成功地检测出了我的二进制图像中的 blob。但是我不知道如何提取关键点的坐标和面积。以下是用于 blob 检测的代码:

# I skipped the parameter setting part. 
    blobParams = cv2.SimpleBlobDetector_Params()
    blobVer = (cv2.__version__).split('.')
    if int(blobVer[0]) < 3:
        detector = cv2.SimpleBlobDetector(blobParams)
    else:
        detector = cv2.SimpleBlobDetector_create(blobParams)

    # Detect Blobs
    keypoints_black = detector.detect(255-black_blob)
    trans_blobs = cv2.drawKeypoints(gray_video_crop, \
        keypoints_white, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

因此,变量keypoints_black包含blob(s)的信息。当我打印变量时,它看起来像这样(发现了2个blob):

KeyPoint 0x10b10b870, KeyPoint 0x10b1301b0

那么我该如何获取关键点的质心坐标和它们的面积,以便将它们作为 OSC 消息发送进行交互。


尝试打印dir(keypoint),其中keypoint显然是一个关键点 :) 这应该会给你一个方法列表。另外,你可以尝试tuple(keypoint)来查看它是否可转换。 - deets
我尝试了tuple(keypoint),它返回的是相同的内容,只不过是以元组而非数组的形式。 - J_yang
而且 dir(keypoint) 返回了一堆方法:['delattr', 'delitem', 'doc', 'eq', 'format', 'ge', 'getattribute', #'getitem','getslice', 'gt', 'hash', 'iadd', 'imul', #'init', 'iter', 'le', 'len', 'lt', 'mul', 'ne', #'new', 'reduce', 'reduce_ex', 'repr', 'reversed', 'rmul', #'setattr', 'setitem', 'setslice', 'sizeof', 'str', 'subclasshook', #'append', 'count', 'extend', 'index','insert', 'pop', 'remove', 'reverse']。但不知道下一步该怎么做。 - J_yang
虽然Joao提供了答案,但是我对元组的建议当然是指一个关键点,而不是对象列表... - deets
2个回答

19

pt 属性:

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

一些文档


感谢提供文档链接! - johndodo
为什么坐标是浮点数? - JobHunter69

11

如果你有一个关键点列表,那么可以按照下面的方式进行打印:

for keyPoint in keyPoints:
    x = keyPoint.pt[0]
    y = keyPoint.pt[1]
    s = keyPoint.size

编辑:尺寸决定了有意义的关键点邻域的直径。您可以使用该尺寸并粗略地计算斑点的面积。


1
属性.size是指blob的直径,而不是它的面积。 - Delgan
1
@Delgan 我在回答中从未说过 .size 意味着面积,请仔细阅读。 - Karthik N G
3
你在默示地说,正如作者所问,“如何获取关键点质心的坐标和它们的面积”。任何读者都会从你的回答中错误地得出结论,即“.size”返回blob的面积。 - Delgan
非常感谢。你的回答今天真的为我节省了很多工作 :) - Megha
卡尔蒂克并没有说尺寸就是面积,只是说尺寸决定直径,而直径可以用来估算面积。所以,这很令人困惑,因为它引出了一些问题:你是指尺寸就是直径吗?这个斑点的面积是以该直径为半径的圆的面积吗?这怎么算是个估算呢?所以,关于“正确阅读”的评论过于防御性了...而且令人不悦。德尔甘的澄清是事实性的,我认为也很有用...尽管措辞有些令人不悦。请努力保持礼貌。...可悲的是,尽管提问者问到了面积,但对于这个问题的那部分并没有一个“清晰”的答案。 - undefined

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