在openCV中检测圆圈
问题:在openCV中检测圆圈 我在为 HoughCircles 函数选择正确参数时遇到问题。我尝试从视频中检测圆圈。这个圆圈是我做的,尺寸几乎一样。问题是相机在移动。 当我更改 maxRadius 时,它仍然以某种方式检测到更大的圆圈(见右图)。我也尝试更改 param1、param2 但仍然没有成功。 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) b
问题:在openCV中检测圆圈
我在为 HoughCircles 函数选择正确参数时遇到问题。我尝试从视频中检测圆圈。这个圆圈是我做的,尺寸几乎一样。问题是相机在移动。
当我更改 maxRadius 时,它仍然以某种方式检测到更大的圆圈(见右图)。我也尝试更改 param1、param2 但仍然没有成功。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.medianBlur(gray, 25)#cv2.bilateralFilter(gray,10,50,50)
minDist = 100
param1 = 500
param2 = 200#smaller value-> more false circles
minRadius = 5
maxRadius = 10
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, minDist, param1, param2, minRadius, maxRadius)
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv2.circle(blurred,(i[0], i[1]), i[2], (0, 255, 0), 2)
也许我使用了错误的功能?
解答
您代码中的主要问题是HoughCircles
函数的第 5 个参数。
根据文档参数列表是:
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles
这意味着第 5 个参数应用circles
(它提供了一个通过引用获取输出的选项,而不是使用返回值)。
因为您没有传递circles
参数,所以您必须为第四个参数之后的所有参数传递命名参数(如param1=param1
、param2=param2
....)。
参数调优问题:
- 减小
param1
的值。param1
是传递给 Canny 的较高阈值。
在您的情况下,值应该大约是30
。
-
减小
param2
的值 文档不是很清楚,但是在50
附近设置值是可行的。 -
增加
maxRadius
值 - 半径10
远小于你的圆的半径。
这是代码:
import numpy as np
import cv2
img = cv2.imread('circles.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.medianBlur(gray, 25) #cv2.bilateralFilter(gray,10,50,50)
minDist = 100
param1 = 30 #500
param2 = 50 #200 #smaller value-> more false circles
minRadius = 5
maxRadius = 100 #10
# docstring of HoughCircles: HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
# Show result for testing:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
更多推荐
所有评论(0)