TypeError:函数需要3个参数(只提供了1个),python

0 投票
2 回答
3246 浏览
提问于 2025-04-18 04:36

我正在尝试为轮廓创建一个滑动条,但当我运行代码时出现了这个错误:

TypeError: thresh_callback() takes exactly 3 arguments (1 given)

这是代码:

def thresh_callback(thresh,blur,img):
    edges = cv.Canny(blur,thresh,thresh*2)
    drawing = np.zeros(img.shape,np.uint8)     # Image to draw the contours
    contours,hierarchy = cv.findContours(edges,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        color = np.random.randint(0,255,(3)).tolist()  # Select a random color
        cv.drawContours(drawing,[cnt],0,color,2)
        cv.imshow('output',drawing)
    cv.imshow('input',img)

def Pics():
    vc = cv.VideoCapture(2)
    retVal, frame = vc.read();
    while True :
        if frame is not None:
            imgray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
            blur = cv.GaussianBlur(imgray,(5,5),0)
            thresh = 100
            max_thresh = 255
            cv.createTrackbar('canny thresh:','input',thresh,max_thresh,thresh_callback)
            thresh_callback(thresh,blur,frame)
        rval, frame = vc.read()
        if cv.waitKey() & 0xFF == 27:
            break
    cv1.DestroyAllWindows()

2 个回答

0

你把你的函数 thresh_callback 作为回调函数传给了 cv.createTrackbar( 这个方法。看起来这个方法是希望能调用一个只接受一个参数的函数来处理某些事件。

0

你把 thresh_callback 这个函数传给了 cv.createTrackbar,在这个过程中,你的函数只接收了一个参数。我猜你还是想用你代码里定义的 blurframe,所以可以试试用 functools.partial 来帮你设置这些参数:

import functools

...

        partialed_callback = functools.partial(thresh_callback, blur=blur, img=frame)
        cv.createTrackbar('canny thresh:','input',thresh,max_thresh,partialed_callback)

这样做会创建一个新的函数版本,里面的 blurframe 已经被设置好了,所以你的 thresh_callback 函数在被调用时,会使用循环中定义的 frameblur,而 thresh 则是从 createTrackbar 里传过来的。

另外,你可能不想在调用 cv.createTrackbar 后的那一行里再调用一次 thresh_callback(thresh,blur,frame),因为那样会导致这个函数被调用两次,而且第二次调用时 thresh 的值总是会是 100。

撰写回答