我正在尝试使用here中所述的简单Blob检测器,但是我所破解的最简单的代码似乎并没有产生任何结果:
img = cv2.imread("detect.png")
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(img)
此代码产生空的keypoints
数组:
[]
我试图检测到斑点的图像是:
我希望至少可以检测到2个斑点-根据simpleblobdetector
文档可检测到深色斑点,并且图像中确实包含2个斑点。
我知道这可能是我在这里缺少的非常简单的事情,但是我似乎无法弄清楚它是什么。我的疯狂猜测是,它必须与Blob的圆形度有关,但是尝试各种过滤器参数似乎无法找出正确的圆形度参数。
更新: 根据下面的评论,尽管文档中有建议,但有人建议我应该反转图像(除非我误读了该图像),我试图将其反转并再次运行示例:
img = cv2.imread("detect.png")
img = cv2.bitwise_not(img)
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(img)
但是,我怀疑这会产生相同的结果-没有检测到
[]
答案 0 :(得分:1)
问题是参数:),并且底部斑点太靠近边界...
您可以查看此github link中的默认参数。在this link末尾有一个有趣的图形,您可以在其中检查不同的参数如何影响结果。
基本上,您可以看到默认情况下按惯性,面积和凸度对其进行过滤。现在,如果您删除凸面和惯性滤镜,它将标记最上面的一个。如果删除区域过滤器,它仍将仅显示顶部斑点。底部斑点的主要问题是它离边界太近了……似乎不是检测器的“斑点”。 ..但如果在图像上添加小边框,则会出现。这是我使用的代码:
import cv2
import numpy as np
img = cv2.imread('blob.png');
# create the small border around the image, just bottom
img=cv2.copyMakeBorder(img, top=0, bottom=1, left=0, right=0, borderType= cv2.BORDER_CONSTANT, value=[255,255,255] )
# create the params and deactivate the 3 filters
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = False
params.filterByInertia = False
params.filterByConvexity = False
# detect the blobs
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(img)
# display them
img_with_keypoints = cv2.drawKeypoints(img, keypoints, outImage=np.array([]), color=(0, 0, 255),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Frame", img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
和生成的图像:
是的,您可以实现类似的结果,而无需停用过滤器,而只需更改其参数即可。例如,这些参数的工作结果完全相同:
params = cv2.SimpleBlobDetector_Params()
params.maxArea = 100000
params.minInertiaRatio = 0.05
params.minConvexity = .60
detector = cv2.SimpleBlobDetector_create(params)
这在很大程度上取决于手头的任务以及您要检测的内容。然后播放每个过滤器的最小值/最大值。