【Python】OpenCVでマウス操作(マウスイベント)を検知する方法
2023.01.28 /
本記事ではPythonのOpenCVで表示した画像に対する、マウス操作(マウスイベント)を検知する方法について解説していきます。
OpenCVは高度な画像処理ができるライブラリであり、画像処理や顔認識、機械学習など幅広く利用されています。
OpenCVではクリックやマウスホイールによるスクロールといったマウス操作を検知し、各マウスイベントに対して異なる処理を指定することができます。
本記事を通して、OpenCVでのマウスイベントについて理解を深めてください。
OpenCVとは
OpenCVとは顔認識や文字認識、物体検出、機械学習のようなAI開発といった多岐にわたる用途で利用されている画像処理ライブラリです。
オープンソースであり、商用でも無料で利用できます。Pythonの標準ライブラリではないため、利用するためにはpipコマンドでインストールする必要があります。
pip install opencv-python
PythonでOpenCVを利用するための基本的な操作方法については以下記事をご参照ください。
【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つの塊として扱う仕組みです。関数について詳しく知りたい方は以下記事をご確認ください。
【Python】標準ライブラリとは:モジュール一覧とモジュール・関数との関係
setMouseCallback()メソッドで指定する関数は以下構文に従って記入します。
def 関数名(event, x, y, flags, param):
引数 | 説明 |
---|---|
event | マウスイベント(マウスの操作の種類) |
x, y | マウス操作が発生時のx, y座標 |
flags | マウスイベント発生時の動作 |
param | setMouseCallback()の第三引数から渡された値 |
eventにはマウスイベントが格納されていますので、eventを使うことでマウスイベントによって処理を分けることができます。
マウスイベントとはマウスの左クリックやダブルクリック、マウスホイールの操作といったマウスを利用した操作を指します
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のマウスイベントを使いこなせるようになってください。