python+opencv利用滑动条对对霍夫圆进行调参

在学习过程中 手动不断去调参拟合霍夫圆 不仅麻烦而且会漏检
而用滑动条就可以很大程度上解决这个问题
两个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()

效果图
python+opencv利用滑动条对对霍夫圆进行调参_第1张图片
有问题随时欢迎指出~

你可能感兴趣的:(opencv图形学,opencv,python,深度学习,人工智能)