【Python】OpenCVでマウス操作(マウスイベント)を検知する方法

時計 2023.01.28 / 時計

【Python】OpenCVでマウス操作(マウスイベント)を検知する方法

記事ではPythonOpenCVで表示した画像に対する、マウス操作マウスイベント)を検知する方法について解説していきます。

OpenCVは高度な画像処理ができるライブラリであり、画像処理や顔認識、機械学習など幅広く利用されています。

OpenCVではクリックやマウスホイールによるスクロールといったマウス操作を検知し、各マウスイベントに対して異なる処理を指定することができます。

本記事を通して、OpenCVでのマウスイベントについて理解を深めてください。

OpenCVとは

OpenCVとは顔認識や文字認識、物体検出、機械学習のようなAI開発といった多岐にわたる用途で利用されている画像処理ライブラリです。

オープンソースであり、商用でも無料で利用できます。Pythonの標準ライブラリではないため、利用するためにはpipコマンドでインストールする必要があります。

pip install opencv-python

PythonでOpenCVを利用するための基本的な操作方法については以下記事をご参照ください。

OpenCVでマウス操作を検知する:setMouseCallback()メソッド

OpenCVで画像を読み込むにはimread()メソッドを使用し、読み込んだ画像を表示するにはimshow()メソッドを使用します。

import cv2

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)

このOpenCVで表示した画像に対してマウス操作を検知するためにはsetMouseCallback()メソッドを使用します。

構文

cv2.setMouseCallback(window_name, 関数名, 関数に渡す値)

setMouseCallback()の第一引数window_nameには表示しているウィンドウの名前、第二引数にはマウス操作を検知した際に呼び出す関数名、第三引数には関数に渡す値を指定します。第三引数で関数に渡したい値が複数ある場合は[]で指定する必要があります。

import cv2

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.setMouseCallback("test_image", mouseEvents)

上記ではウィンドウ名test_imageの画像にmouseEvents()関数を紐づけし、マウス操作を検知したらmouseEvents()関数を実行するようにしました。

マウスイベントの関数を作成:5つの引数

setMouseCallback()に指定する関数の作成

次にsetMouseCallback ()メソッドの第二引数で指定しているmouseEvents()関数の作成方法を解説していきます。ここでは関数名をmouseEventsとしていますが好きな関数名で大丈夫です。

関数とは数行から数十行のコードを1つの塊として扱う仕組みです。関数について詳しく知りたい方は以下記事をご確認ください。

setMouseCallback()メソッドで指定する関数は以下構文に従って記入します。

構文

def 関数名(event, x, y, flags, param):

引数 説明
event マウスイベント(マウスの操作の種類)
x, y マウス操作が発生時のx, y座標
flags マウスイベント発生時の動作
param setMouseCallback()の第三引数から渡された値

eventにはマウスイベントが格納されていますので、eventを使うことでマウスイベントによって処理を分けることができます。

IT用語の確認

マウスイベントとはマウスの左クリックやダブルクリック、マウスホイールの操作といったマウスを利用した操作を指します

flagsにはマウスイベント発生時の動作、例えばマウスホイールを下にスクロールするとマイナスの値、上にスクロールするとプラスの値というように詳細な動作を知ることができます。

import cv2

def mouseEvents(event, x, y, flags, param):
    try:
        # 処理を記入
    except Exception as e:
        print(e)

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.setMouseCallback("test_image", mouseEvents)

マウスイベント一覧

eventに格納されるマウスイベントの一覧を以下に記します。

マウスイベント 説明
EVENT_MOUSEMOVE マウスカーソルの移動
EVENT_LBUTTONDOWN 左クリック
EVENT_RBUTTONDOWN 右クリック
EVENT_MBUTTONDOWN 真ん中ボタンのクリック
EVENT_LBUTTONUP 左クリックが離されたとき
EVENT_RBUTTONUP 右クリックが離されたとき
EVENT_MBUTTONUP 真ん中ボタンのクリックが離されたとき
EVENT_LBUTTONDBLCLK 左ボタンのダブルクリック
EVENT_RBUTTONDBLCLK 右ボタンのダブルクリック
EVENT_MBUTTONDBLCLK 真ん中ボタンのダブルクリック
EVENT_MOUSEWHEEL マウスホイールの上下の操作
EVENT_MOUSEHWHEEL マウスホイールの左右の操作

マウスイベントごとに処理を分ける場合は次のようにコードを記述します。

import cv2

def mouseEvents(event, x, y, flags, param):
    try:
        if event == cv2.EVENT_LBUTTONDOWN:
            # 左クリック時の処理を記述
        elif event == cv2.EVENT_RBUTTONDOWN:
            # 右クリック時の処理を記述
        elif event == cv2.EVENT_MOUSEMOVE:
            # マウスカーソルが移動時の処理を記述
        elif event == cv2.EVENT_MOUSEWHEEL:
            # マウスホイール操作時(上下)の処理
    except Exception as e:
        print(e)

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.setMouseCallback("test_image", mouseEvents)

スクロール(マウスホイール:EVENT_MOUSEWHEEL)のイベントについて

マウスホイールで下にスクロールするとflagsでマイナスの値になります。上にスクロールするとflagsはプラスの値になります。

このflagsの値を利用して、マウスホイールの操作によって処理を分けることができます。以下に例を示します。

import cv2

def mouseEvents(event, x, y, flags, param):
    try:
        if event == cv2.EVENT_MOUSEWHEEL:
            if flags < 0:
                # マウスホイールを下にスクロールしたときの処理
            elif flags > 0:
                # マウスホイールを上にスクロールしたときの処理
    except Exception as e:
        print(e)
path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.setMouseCallback("test_image", mouseEvents)

まとめ

本記事「【Python】OpenCVでマウス操作(マウスイベント)を検知する方法 」はいかがでしたか。

OpenCVでマウスイベント毎に処理を分けられるようになると、できることが一気に増えます。ぜひOpenCVのマウスイベントを使いこなせるようになってください。