TypeError:函数只接受3个参数(给定1个),python

TypeError:函数只接受3个参数(给定1个),python,python,opencv,Python,Opencv,我正在尝试为轮廓创建轨迹栏,但运行代码时出现以下错误: 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 cont

我正在尝试为轮廓创建轨迹栏,但运行代码时出现以下错误:

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()

您正在将函数
thresh\u callback
作为回调传递给
cv.createTrackbar(
方法)。
这个方法似乎需要一个单参数函数来调用某个事件。

您正在将
thresh\u callback
传递到
cv.createTrackbar
,并且在其中的某个地方,您的函数只被一个参数调用。我假设您仍然希望使用
blur
frame
您可以在代码中确定,因此尝试使用为您设置:

import functools

...

        partialed_callback = functools.partial(thresh_callback, blur=blur, img=frame)
        cv.createTrackbar('canny thresh:','input',thresh,max_thresh,partialed_callback)
这将创建一个已设置了
blur
frame
的函数版本,因此将使用循环中定义的
frame
blur
以及
createTrackbar
中提供的
thresh
调用
thresh\u回调函数


另外,您可能不想调用
thresh\u回调(thresh、blur、frame)
在调用
cv.createTrackbar
后的行中,因为这意味着它会被调用两次,并且总是在第二次调用时使用
thresh=100

请修复缩进。我看到的示例只向回调传递了一个较低的阈值,所以只有一个参数。我认为
cv
(遗留模块,而不是cv2…)不返回帧、图像等-它的行为更像是一个c函数,您可以传入输出。这意味着
模糊
(也可能
)可能是空的?@jmetz:它是传递回调的
createTrackbar
函数,它反过来用一个参数调用回调。@jmetz:这就是为什么完全回溯在这里会有帮助。@Rob Watts我尝试了functools.partial,但我得到了以下错误:TypeError:thresh_callback()获取了一个意外的关键字参数“frame”@user3433195 Oops,它应该是
img=frame
,而不是
frame=frame
。我一直在查看您在哪里调用它,而不是在哪里定义它。这可能是因为您在
createTrackbar
之后调用了
thresh\u回调
。请尝试删除该参数查看它是否解决了问题。@Rob WAtts好的,现在我没有错误,但我无法控制轨迹栏的位置,它保持在一个位置(在本例中为100)?!!@Rob WAtts不,它没有