4

我想编写一个程序,以最简单的形式打开一个窗口,显示使用 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()
4

1 回答 1

5

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

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

在while循环结束时。原因似乎是(根据我的发现)循环现在将等待 10 毫秒,以便按下转义键。如果在此期间未按下转义键,则循环将继续,cv.SetMouseCallback被调用并按self.on_mouse应有的方式运行。如果在while 循环结束cv.WaitKey()没有调用 ,程序将卡在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()

有关详细信息,请参阅此页面

于 2013-05-07T20:02:09.043 回答