在Python类中使用鼠标事件回调

时间:2013-05-06 21:27:14

标签: python opencv callback

我想编写一个程序,以最简单的形式打开一个窗口,显示使用OpenCV捕获网络摄像头并打印鼠标光标悬停在终端窗口上的坐标。为此,我想使用回调函数。我的问题是这个回调函数似乎没有运行。运行程序时我没有收到任何错误消息,但是当我将光标悬停在相机窗口上时似乎没有任何反应。

我怀疑造成这种情况的原因可能是我的回调函数在CallBack类中,并且cv.SetMouseCallback无法访问它或其他东西。我是OpenCV和回调函数的新手,所以对我的问题可能是什么或我在这里失踪的任何建议都将不胜感激。

我的简化代码如下所示,以供参考。提前谢谢。

import cv

class CallBack:

    def __init__(self):
        cv.NamedWindow("Camera", cv.CV_WINDOW_AUTOSIZE );
        self.capture = cv.CaptureFromCAM(0)

    def on_mouse(self,event, x, y, flag, param):
        if(event == cv.CV_EVENT_MOUSEMOVE):
            print param
            print x,y

    def callback(self):
        while True:
            src = cv.QueryFrame(self.capture)
            s = "Hello World"
            cv.SetMouseCallback("Camera",self.on_mouse, param = s)
            cv.ShowImage("Camera", src)

if __name__ == '__main__':
    cb = CallBack()
    cb.callback()

1 个答案:

答案 0 :(得分:5)

我找到了这种行为的原因。结果我必须添加一个

if cv.WaitKey(10) == 27:
    break

在while循环结束时。原因似乎是(从我发现的)循环现在将等待10毫秒的时间来按下转义键。如果在此期间未按下转义键,则循环将继续,cv.SetMouseCallback被调用,self.on_mouse将按预期运行。如果在while循环结束时调用cv.WaitKey() ,则程序将卡在cv.ShowImage - 调用中,从不调用cv.SetMouseCallback,因此永远不要执行self.on_mouse

更新的简化代码如下所示。

import cv

class CallBack:

    def __init__(self):
        cv.NamedWindow("Camera", cv.CV_WINDOW_AUTOSIZE );
        self.capture = cv.CaptureFromCAM(0)

    def on_mouse(self,event, x, y, flag, param):
        if(event == cv.CV_EVENT_MOUSEMOVE):
           print param
           print x,y

    def callback(self):
        while True:
             src = cv.QueryFrame(self.capture)
             s = "Hello World"
             cv.SetMouseCallback("Camera",self.on_mouse, param = s)
             cv.ShowImage("Camera", src)

             if cv.WaitKey(10) == 27:
                  break

if __name__ == '__main__':
    cb = CallBack()
    cb.callback()

有关详细信息,请参阅this page