目標
簡単なデモ
ここでは、画像上でダブルクリックした場所に円を描く簡単なアプリケーションを作成する。
まず、マウスイベントが発生したときに実行されるマウスコールバック関数を作成する。マウスイベントは、左ボタン押下、左ボタン解放、左ボタンダブルクリックなど、マウスに関連するあらゆるものでよい。これによりマウスイベントごとに座標 (x,y) が得られる。このイベントと位置を使って、好きなことを行える。利用可能なすべてのイベントを一覧表示するには、Python ターミナルで次のコードを実行する:
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )
マウスコールバック関数の作成には、どこでも同じ特定の形式がある。異なるのは関数が何を行うかだけである。したがって、ここでのマウスコールバック関数は1つのこと、つまりダブルクリックした場所に円を描くことを行う。以下のコードを参照。コードはコメントから自明である :
import numpy as np
import cv2 as cv
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
img = np.zeros((512,512,3), np.uint8)
while(1):
break
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
void destroyAllWindows()
Destroys all of the HighGUI windows.
void setMouseCallback(const String &winname, MouseCallback onMouse, void *userdata=0)
Sets mouse handler for the specified window.
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
より高度なデモ
次に、はるかに優れたアプリケーションに進む。これでは、Paint アプリケーションのようにマウスをドラッグして、(選択したモードに応じて)長方形または円を描く。したがって、ここでのマウスコールバック関数には2つの部分があり、1つは長方形を描き、もう1つは円を描く。この具体的な例は、オブジェクト追跡や画像のセグメンテーション(領域分割)などのインタラクティブなアプリケーションの作成と理解に大いに役立つ。
import numpy as np
import cv2 as cv
drawing = False
mode = True
ix,iy = -1,-1
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
else:
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
else:
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple, thick, or filled up-right rectangle.
次に、このマウスコールバック関数を OpenCV ウィンドウにバインドする必要がある。メインループでは、長方形と円を切り替えるためにキー 'm' のキーボードバインディングを設定する。
img = np.zeros((512,512,3), np.uint8)
while(1):
if k == ord('m'):
mode = not mode
elif k == 27:
break
演習
- 前の例では、塗りつぶされた長方形を描いた。塗りつぶされていない長方形を描くようにコードを変更してみよ。