我阅读了有关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参数传递给回调?
答案 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'))
这类似于使用函数闭包,但我觉得它更简单更整洁。