在大图像中使用 findCirclesGrid()

Posted

技术标签:

【中文标题】在大图像中使用 findCirclesGrid()【英文标题】:Using findCirclesGrid() in large images 【发布时间】:2017-02-03 19:56:24 【问题描述】:

我在 Python 2.7 中使用 OpenCV 3 来校准不同的相机。我使用 findCirclesGrid() 函数,它成功地在 1 兆像素图像中找到了 4 by 11 circle pattern。但是,当我尝试在更高分辨率的图像中近距离检测图案时,该功能会失败。当物体在图像中距离较远时,仍然会被检测到。我使用函数如下:

ret, corners = cv2.findCirclesGrid(image, (4, 11), flags=cv2.CALIB_CB_ASYMMETRIC_GRID)

对于较大的图像,它返回False, None。该功能似乎无法处理面积过大的圆圈。我尝试添加cv2.CALIB_CB_CLUSTERING,但这似乎没有什么不同。此外,似乎在 C++ 中,用户可以表示使用 blobdetector,但在 Python 中则不行。详情:http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findcirclesgrid

我可以以某种方式增加最大检测大小或让函数以其他方式检测模式吗?

编辑:我发现了如何使用来编辑 blobDetector 的参数

params = cv2.SimpleBlobDetector_Params()
params.maxArea = 100000
detector = cv2.SimpleBlobDetector_create(params)
ret, corners = cv2.findCirclesGrid(self.gray, (horsq, versq), None,
                flags=cv2.CALIB_CB_ASYMMETRIC_GRID, blobDetector=detector)

不过还是同样的问题。

编辑2: 现在添加cv2.CALIB_CB_CLUSTERING 即可解决问题!

【问题讨论】:

如果您(以编程方式)调整图像大小,它会起作用吗?您可以尝试一些尺寸并尝试所有尺寸。只需确保之后重新调整检测到的圆圈以适合原始大小的图像。 也许,但这不会使大分辨率变得多余吗?这意味着我只能得到重新缩放图像的精度。 那么您可能需要查看源代码是否/为什么存在检测限制。如果您尝试调整大小的解决方案,您可以对检测到的圆圈进行后处理以进行细化以获得更高的精度(手动检测每个圆圈并使用先前检测到的网格连接) 是的,我会看看这两个选项。感谢您的想法。 【参考方案1】:

您可能需要做的主要事情是调整斑点检测器的最小面积和最大面积。 使用参数创建一个 blob 检测器(不要使用默认参数),并调整检测器将接受的 minarea 和 max area。在将创建的检测器传递给 findcirclesgrid 函数之前,您可以先显示所有找到的 blob。

Python 示例代码

params = cv2.SimpleBlobDetector_Params()
# Setup SimpleBlobDetector parameters.
print('params')
print(params)
print(type(params))


# Filter by Area.
params.filterByArea = True
params.minArea = 200
params.maxArea = 18000

params.minDistBetweenBlobs = 20


params.filterByColor = True
params.filterByConvexity = False

# tweak these as you see fit
# Filter by Circularity
# params.filterByCircularity = False
params.minCircularity = 0.2

# # # Filter by Convexity
# params.filterByConvexity = True
# params.minConvexity = 0.87

# Filter by Inertia
params.filterByInertia = True
# params.filterByInertia = False
params.minInertiaRatio = 0.01

detector = cv2.SimpleBlobDetector_create(params)

# Detect blobs.
keypoints = detector.detect(gray)

im_with_keypoints = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)



fig = plt.figure()
im_with_keypoints = cv2.drawKeypoints(gray, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(cv2.cvtColor(im_with_keypoints, cv2.COLOR_BGR2RGB),
           interpolation='bicubic')

titlestr = '%s found %d keypoints' % (fname, len(keypoints))
plt.title(titlestr)

fig.canvas.set_window_title(titlestr)


ret, corners = cv2.findCirclesGrid(gray, (cbcol, cbrow), flags=(cv2.CALIB_CB_ASYMMETRIC_GRID + cv2.CALIB_CB_CLUSTERING ), blobDetector=detector )

【讨论】:

即使这个问题不再相关,我仍然接受感谢您的麻烦。谢谢,保卢斯。

以上是关于在大图像中使用 findCirclesGrid()的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 通知,图标和大图像中的小故障

如何使用 Open CV 3 python 3 用鼠标从大图像中裁剪 ROI

OpenCV 的 findCirclesGrid 没有找到圆圈网格

findCirclesGrid函数求教!

如何使用python中的平移矩阵将小图像的特定坐标放置到大图像的特定坐标

itk中重新取样操作下的坐标变化[非公开]