いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Python、OpenCVでマウスのクリック位置を取得する

 OpenCV(画像処理ライブラリ)でマウスのクリック位置を取得します。画像を表示しておき、その画像上でマウスイベント(右クリック、左ダブルクリック、……)が起こったときにコールされる関数を定義します。ここでは左クリックしたときに画像上の座標を取得して、表示することにします。後で写真から立体を再現するとき、画像上のコーナーなどの座標を求める必要があるのでそのときのための準備です。OpenCVチュートリアル、その他分かりやすいサイトもたくさんありますが、自分用にちょこちょこいじってあります。例によって最小限のコードで。

import cv2
#コールバック関数
#マウスイベントが起こるとここへ来る
def printCoor(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x, y)
img = cv2.imread('gazou.bmp')
#画像のウインドウに名前をつけ、コールバック関数をセット
cv2.namedWindow('image')
cv2.setMouseCallback('image',printCoor)
cv2.moveWindow('image', 100, 200)
while(1):
    cv2.imshow('image',img)
    #ESCキーでブレーク
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

 最新の『日経ソフトウェア』(2020年5月号)に「写真から立体物を再現」という特集があります。ライブラリを使ってやっているようです。目的は同じようですが、このブログではずっと基本的な部分、線形代数の知識から準備しています。時間は結構かかりましたが、勉強になりました。この分野(コンピュータビジョン)、そのまま数学が役に立ちますし、テーマとしても極めて興味深い。がんばって続けてみます。
 OpenCV がインストールされていない場合、import cv2 のところでエラーが出ます。その場合は
pip install opencv-python でインストールできます(windowsならコマンドプロンプトからこれを実行)。