在学习过程中 手动不断去调参拟合霍夫圆 不仅麻烦而且会漏检
而用滑动条就可以很大程度上解决这个问题
两个API
cv2.createTrackbar(a,b,c,d,e) 主要功能:定义滑动面板
a:滑动条的名字
b:防止滑动条的窗口的名字
c:滑动条的默认值
d:滑动条的最大值
e:回调函数 每一次滑动面板都会调用
cv2.getTrackbarPos(a,b) 主要作用:获取滑动条的位置
a:滑动条的名字
b:滑动条所在的窗口
相比cv2.createTracbar 它是由返回值的即滑动条的位置
我默认dp为1,对其余四个参数滑动调参
代码如下
def callback(object):
pass
img = cv2.imread("figure.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(img, 5)
img = cv2.resize(img, (960, 540))
cv2.namedWindow("image")
# cv2.createTrackbar("minDist", "image", 0, 100, callback)
cv2.createTrackbar("param1", "image", 1, 100, callback) # 有一些参数不能取1 所以保险起见所有的参数都从1开始
cv2.createTrackbar("param2", "image", 20, 50, callback)
cv2.createTrackbar("minRadius", "image", 50, 100, callback)
cv2.createTrackbar("maxRadius", "image", 1, 200, callback)
while (True):
img_copy = img.copy()
param1 = cv2.getTrackbarPos("param1", "image")
param2 = cv2.getTrackbarPos("param2", "image")
minRadius = cv2.getTrackbarPos("minRadius", "image")
maxRadius = cv2.getTrackbarPos("maxRadius", "image")
print(param1, param2, minRadius, maxRadius)
# circle = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 200, param2, minRadius, 100)
try:
circle = cv2.HoughCircles(img_copy, cv2.HOUGH_GRADIENT, 1, 100, param1=param1, param2=param2, minRadius=minRadius,
maxRadius=maxRadius)
except BaseException:
print("调的参数有问题,请重调参数")
# print(circle)
if circle is None:
pass
else:
for i in circle[0, :]: # 遍历矩阵每一行的数据
if i[0] is None or i[1] is None or i[2] is None:
break
else:
cv2.circle(img_copy, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.imshow("image", img_copy)
key = cv2.waitKey(1)
if key == ord("q"):
break
cv2.destroyAllWindows()