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

Veg*_*hus 3 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()
Run Code Online (Sandbox Code Playgroud)

Veg*_*hus 5

我找到了这种行为的原因.事实证明我必须添加一个

if cv.WaitKey(10) == 27:
    break
Run Code Online (Sandbox Code Playgroud)

在while循环结束时.原因似乎是(从我发现的)循环现在将等待10毫秒的时间来按下转义键.如果在此期间没有按下转义键,则循环将继续,cv.SetMouseCallback被调用并将按self.on_mouse预期运行.如果cv.WaitKey()没有在while循环的最后调用,程序会卡死在cv.ShowImage-call,从不打电话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()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此页面.