OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ペイントブラシとしてのマウス

目標

簡単なデモ

ここでは、画像上でダブルクリックした場所に円を描く簡単なアプリケーションを作成する。

まず、マウスイベントが発生したときに実行されるマウスコールバック関数を作成する。マウスイベントは、左ボタン押下、左ボタン解放、左ボタンダブルクリックなど、マウスに関連するあらゆるものでよい。これによりマウスイベントごとに座標 (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
# mouse callback function
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
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 # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
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:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
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)
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break

演習

  1. 前の例では、塗りつぶされた長方形を描いた。塗りつぶされていない長方形を描くようにコードを変更してみよ。