【问题标题】:TypeError: function takes exactly 3 arguments (1 given) ,pythonTypeError:函数只需要 3 个参数(给定 1 个),python
【发布时间】:2014-04-29 01:26:16
【问题描述】:

我正在尝试为轮廓创建一个跟踪栏,但是当我运行代码时出现此错误:

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

【问题讨论】:

  • 请修正你的缩进。
  • 我看到的例子只传递了一个低阈值到回调,所以只有 一个 参数。
  • 我认为cv(遗留模块,而不是 cv2...)不会返回帧、图像等 - 它的行为更像是一个 c 函数,因为您传入输出.这意味着blur(可能还有frame)可能是空的?
  • @jmetz: IT 是 createTrackbar 函数,它被传递了回调,它反过来用一个参数调用回调。
  • @jmetz:这就是为什么完整的回溯在这里会有所帮助。

标签: python opencv


【解决方案1】:

您将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 的函数版本,因此将使用循环中定义的 frameblur 以及 thresh 来调用 thresh_callback 函数从createTrackbar 内部提供。

另外,您可能不想在调用cv.createTrackbar 之后再调用thresh_callback(thresh,blur,frame),因为这意味着它会被调用两次,并且第二次总是使用thresh=100

【讨论】:

  • @ Rob Watts 我尝试了 functools.partial 但我得到了这个错误:TypeError: thresh_callback() got an unexpected keyword argument 'frame'
  • @user3433195 糟糕,应该是img=frame,而不是frame=frame。我一直在查看您在哪里调用它而不是在哪里定义它。
  • 这可能是因为您在createTrackbar 之后调用了thresh_callback。尝试删除该行,看看是否能解决问题。
  • @ Rob WAtts 好的,现在我没有收到任何错误,但我无法控制它保持在一个位置的轨迹栏位置(在本例中为 100)?!!
  • @Rob Watts 不,它没有
【解决方案2】:

您将函数 thresh_callback 作为回调传递给 cv.createTrackbar( 方法。 看起来这个方法需要一个单参数函数来调用某个事件。

【讨论】:

    猜你喜欢
    • 2018-07-14
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2018-08-20
    相关资源
    最近更新 更多