cv2.createTrackbar将userdata参数传递给回调

时间:2016-11-18 15:31:53

标签: python python-2.7 opencv callback

我阅读了有关cv2.createTrackbar的文档。它说

  

onChange - 指向每次滑块时调用的函数   改变立场。该函数应该原型为void   FOO(INT,无效*); ,其中第一个参数是轨迹栏位置   第二个参数是用户数据(参见下一个参数)。如果   回调是NULL指针,没有调用回调,但只是   价值已更新。

但我不知道如何将userdata传递给Python中的onChange回调。

我定义了我的回调函数:

def callback(value,cur_img):
    cv2.GaussianBlur(cur_img, (5, 5), value)

我收到了错误:

callback() takes exactly 2 arguments (1 given)

因为它只将bar值参数传递给回调。
但我真的需要cur_img用于cv2.GaussianBlur函数。如何将cur_img参数传递给回调?

2 个答案:

答案 0 :(得分:2)

您可以使用lambda表达式作为回调函数创建函数闭包。在包装类中的播放器时,我有同样的问题,并且想要使用我的类实例的属性。以下类方法的片段。

def play(self):
     ... other code...
     cv2.namedWindow('main', cv2.WINDOW_NORMAL)
     cv2.createTrackbar('trackbar', 'main', 0,
         100,
         lambda x: self.callback(x, self)
         )
     ... other code...

def callback(tb_pos, self):
    #tb_pos receives the trackbar position value
    #self receives my class instance, but could be
    #whatever you want

答案 1 :(得分:0)

您可以使用functools的部分函数Python docs for partial来创建部分函数,​​然后回调函数将仅占用1个arg。例如:

import cv2
from functools import partial

def callback(x, a, b=None, c=None):
  print(x, a, b, c)

def addTracks(window_name):
  cv2.createTrackbar(bar1_name, window_name, 0, 255, partial(callback, a='R', b='G', c='B'))
  cv2.createTrackbar(bar2_name, window_name, 0, 255, partial(callback, a='R'))

这类似于使用函数闭包,但我觉得它更简单更整洁。