ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

PythonとOpenCVで画像処理④【マウスイベント】

OpenCVのバージョンは2.4.1です

【元の画像】
*Raspberry Piのカメラで撮影したのでサイズが大きめです
f:id:rkr0314:20160124134123p:plain

【マウスイベント】

  • setMouseCallback関数を使えばマウスイベント時の処理をセットできる
  • cv2.setMouseCallback(画像, 関数名, 関数に渡すパラメータ)
  • マウスイベントが起こったとき、指定した関数に5つの引数が渡される
    • event:マウスイベントの種類
    • x:マウスイベントが起きたx座標
    • y:マウスイベントが起きたy座標
    • flags:マウスイベント時に押されていたボタンやキーの種類
    • param:setMouseCallbackの第三引数で設定したパラメータ
  • マウスイベントの種類
    • cv2.EVENT_MOUSEMOVE:マウスが移動した
    • cv2.EVENT_LBUTTONDOWN:マウスの左ボタンが押された
    • cv2.EVENT_RBUTTONDOWN:マウスの右ボタンが押された
    • cv2.EVENT_MBUTTONDOWN:マウスの中ボタンが押された
    • cv2.EVENT_LBUTTONUP:マウスの左ボタンを離した
    • cv2.EVENT_RBUTTONUP:マウスの右ボタンを離した
    • cv2.EVENT_MBUTTONUP:マウスの中ボタンを離した
    • cv2.EVENT_LBUTTONDBCLK:マウスの左ボタンがダブルクリックされた
    • cv2.EVENT_RBUTTONDBCLK:マウスの右ボタンがダブルクリックされた
    • cv2.EVENT_MBUTTONDBCLK:マウスの中ボタンがダブルクリックされた
  • マウスイベント時に押されていたボタンやキーの種類
    • 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キー


【マウスイベントを使って図形やテキストを描画】

  • 左クリック:赤い円形を生成
  • 右クリック:青い四角形を生成
  • 右クリック+Shiftキー:緑色のテキストを生成
# -*- coding: utf-8 -*-
import cv2

# マウスイベント時に処理を行う
def mouse_event(event, x, y, flags, param):

    # 左クリックで赤い円形を生成
    if event == cv2.EVENT_LBUTTONUP:
        cv2.circle(img, (x, y), 50, (0, 0, 255), -1)
    
    # 右クリック + Shiftキーで緑色のテキストを生成
    elif event == cv2.EVENT_RBUTTONUP and flags & cv2.EVENT_FLAG_SHIFTKEY:
        cv2.putText(img, "CLICK!!", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 5, (0, 255, 0), 3, cv2.CV_AA)
    
    # 右クリックのみで青い四角形を生成
    elif event == cv2.EVENT_RBUTTONUP:
        cv2.rectangle(img, (x-100, y-100), (x+100, y+100), (255, 0, 0), -1)


# 画像の読み込み
img = cv2.imread("test.jpg", 1)
# ウィンドウのサイズを変更可能にする
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
# マウスイベント時に関数mouse_eventの処理を行う
cv2.setMouseCallback("img", mouse_event)

# 「Q」が押されるまで画像を表示する
while (True):
    cv2.imshow("img", img)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cv2.destroyAllWindows()

【処理結果】
f:id:rkr0314:20160124203836p:plain


【参考】
Mouse as a Paint-Brush — OpenCV-Python Tutorials 1 documentation
opencv.jp - OpenCV: シンプルGUI(Simple GUI)サンプルコード -
opencv メモ - 五流!!日曜プログラマーのつどい