OpenCVのnamedWindow()で作られたウィンドウやimshow()で自動で表示されたウィンドウのマウスイベントのコールバック関数を登録するにはsetMouseCallback()関数を用います。
setMouseCallback()関数の構文
cv2.setMouseCallback(winname, onMouse[, userdata])
引数
winname | コールバック関数に関連付けるウィンドウのタイトル |
onMouse | 登録するコールバック関数名 |
userdata | コールバック関数へ渡す値(オプション) (ウィンドウタイトルを渡すと便利) |
登録するコールバック関数の構文
コールバック関数の関数名は何でも構いませんが、引数は以下のようにする必要があります。
def onMouse(event, x, y, flags, params):
引数
event | 押されたマウスボタンの種類および状態の値。別途、下記参照 |
x | マウスポインタのX座標(ウィンドウの座標ではなく画像上のX座標) |
y | マウスポインタのX座標(ウィンドウの座標ではなく画像上のY座標) |
flags | Shift, Ctrl, Altキーの押された種類。別途、下記参照 |
params | コールバック関数登録時に渡された値 |
●eventの値
cv2.EVENT_MOUSEMOVE | マウスが動いたとき(ボタンは押されていない) |
cv2.EVENT_LBUTTONDOWN | マウスの左ボタンが押されたとき |
cv2.EVENT_RBUTTONDOWN | マウスの右ボタンが押されたとき |
cv2.EVENT_MBUTTONDOWN | マウスの中央ボタンが押されたとき |
cv2.EVENT_LBUTTONUP | マウスの左ボタンが離されたとき |
cv2.EVENT_RBUTTONUP | マウスの右ボタンが離されたとき |
EVENT_MBUTTONUP | マウスの中央ボタンが離されたとき |
EVENT_LBUTTONDBLCLK | マウスの左ボタンがダブルクリックされたとき |
EVENT_RBUTTONDBLCLK | マウスの右ボタンがダブルクリックされたとき |
EVENT_MBUTTONDBLCLK | マウスの中央ボタンがダブルクリックされたとき |
EVENT_MOUSEWHEEL | flagの値が正のとき、マウスホイールを上へ回転 flagの値が負のとき、マウスホイールを下へ回転 |
EVENT_MOUSEHWHEEL | ? |
●flagsの値
cv2.EVENT_FLAG_LBUTTON | マウスの左ボタン |
cv2.EVENT_FLAG_RBUTTON | マウスの右ボタン |
cv2.EVENT_FLAG_MBUTTON | マウスの中央ボタン |
cv2.EVENT_FLAG_CTRLKEY | Ctrlキー |
cv2.EVENT_FLAG_SHIFTKEY | Shiftキー |
cv2.EVENT_FLAG_ALTKEY | Altキー |
サンプルプログラム
import cv2
import numpy as np
def create_test_image():
'''テスト画像の作成'''
img = np.zeros((30, 50, 3), dtype = np.uint8)
cv2.circle(img, (10, 15), 10, (255, 0, 0), -1, cv2.LINE_AA)
cv2.circle(img, (25, 15), 10, (0, 255, 0), -1, cv2.LINE_AA)
cv2.circle(img, (40, 15), 10, (0, 0, 255), -1, cv2.LINE_AA)
return img
def onMouse(event, x, y, flags, params):
'''マウスのコールバック関数
Parameters
----------
event : int
押されたマウスボタンの種類
x : int
マウスポインタの画像上のX座標
y : int
マウスポインタの画像上のY座標
flags : int
Shift, Ctrl, Altキーの押された種類
params :
コールバック関数登録時に渡された値
'''
if disp_image is not None:
print(f"[{x}, {y}] (R, G, B) = ({disp_image[y, x, 2]}, {disp_image[y, x, 1]}, {disp_image[y, x, 0]}) event = {event} flags = {flags} params = {params}")
# テスト画像の生成
disp_image = create_test_image()
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.imshow('Image', disp_image)
# コールバック関数の登録
cv2.setMouseCallback('Image', onMouse, "Image")
cv2.waitKey()
実行結果
参照ページ
https://docs.opencv.org/4.8.0/d7/dfc/group__highgui.html#ga89e7806b0a616f6f1d502bd8c183ad3e
https://docs.opencv.org/4.8.0/d0/d90/group__highgui__window__flags.html#gaab4dc057947f70058c80626c9f1c25ce
https://docs.opencv.org/4.8.0/d0/d90/group__highgui__window__flags.html#ga927593befdddc7e7013602bca9b079b0
コメント