TypeError:函数需要3个参数(只提供了1个),python
我正在尝试为轮廓创建一个滑动条,但当我运行代码时出现了这个错误:
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
,在这个过程中,你的函数只接收了一个参数。我猜你还是想用你代码里定义的 blur
和 frame
,所以可以试试用 functools.partial
来帮你设置这些参数:
import functools
...
partialed_callback = functools.partial(thresh_callback, blur=blur, img=frame)
cv.createTrackbar('canny thresh:','input',thresh,max_thresh,partialed_callback)
这样做会创建一个新的函数版本,里面的 blur
和 frame
已经被设置好了,所以你的 thresh_callback
函数在被调用时,会使用循环中定义的 frame
和 blur
,而 thresh
则是从 createTrackbar
里传过来的。
另外,你可能不想在调用 cv.createTrackbar
后的那一行里再调用一次 thresh_callback(thresh,blur,frame)
,因为那样会导致这个函数被调用两次,而且第二次调用时 thresh
的值总是会是 100。