【OpenCV-Python】setMouseCallback(マウスのコールバック関数登録)

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください