在大图像中使用 findCirclesGrid()
Using findCirclesGrid() in large images
我在 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)
对于较大的图像,它 returns 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
即可解决问题![=17=]
您可能需要做的主要事情是调整斑点检测器的最小面积和最大面积。
使用参数创建一个斑点检测器(不要使用默认参数),并调整检测器将接受的最小面积和最大面积。在将创建的检测器传递到 findcirclesgrid 函数之前,您可以先显示所有找到的斑点。
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 )
我在 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)
对于较大的图像,它 returns 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
即可解决问题![=17=]
您可能需要做的主要事情是调整斑点检测器的最小面积和最大面积。 使用参数创建一个斑点检测器(不要使用默认参数),并调整检测器将接受的最小面积和最大面积。在将创建的检测器传递到 findcirclesgrid 函数之前,您可以先显示所有找到的斑点。
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 )