4

最も単純な形式で、OpenCV を使用して Web カメラのキャプチャを表示し、ターミナルのウィンドウ上にあるマウス カーソルの座標を出力するプログラムを作成したいと思います。このために、コールバック関数を使用したいと考えています。私の問題は、このコールバック関数が実行されていないように見えることです。プログラムを実行してもエラー メッセージは表示されませんが、カメラ ウィンドウにカーソルを合わせても何も起こりません。

これの原因は、私のコールバック関数がクラス 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()は-call でスタックし、 を呼び出さないため、 を実行することはありません。cv.ShowImagecv.SetMouseCallbackself.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 に答える