私的AI研究会 > PythonGUI1
Python プログラム作成に必要な GUI を試してみる。
OpenCV で取得できるマウスイベントから座標位置指定と図形描画のサンプルプログラムを作成する。
# OpenCVのイベントリストの出力 def printEvents(): events = [i for i in dir(cv2) if 'EVENT' in i] print (events)
定数名 | 機能 |
EVENT_FLAG_ALTKEY | 'Alt'キーが押された |
EVENT_FLAG_CTRLKEY | 'Ctrl'キーが押された |
EVENT_FLAG_LBUTTON | マウス左ボタンが押された |
EVENT_FLAG_MBUTTON | マウス中ボタンが押された |
EVENT_FLAG_RBUTTON | マウス右ボタンが押された |
EVENT_FLAG_SHIFTKEY | 'Shift'キーが押された |
EVENT_LBUTTONDBLCLK | マウス左ボタンのダブルクリック |
EVENT_LBUTTONDOWN | マウス左ボタンが押された |
EVENT_LBUTTONUP | マウス左ボタンを離した |
EVENT_MBUTTONDBLCLK | マウス中ボタンのダブルクリック |
EVENT_MBUTTONDOWN | マウス中ボタンが押された |
EVENT_MBUTTONUP | マウス中ボタンを離した |
EVENT_MOUSEHWHEEL | マウスの横ホイールが回転 |
EVENT_MOUSEMOVE | マウスが移動した |
EVENT_MOUSEWHEEL | マウスホイールが回転 |
EVENT_RBUTTONDBLCLK | マウス右ボタンのダブルクリック |
EVENT_RBUTTONDOWN | マウス右ボタンが押された |
EVENT_RBUTTONUP | マウス右ボタンを離した |
class CVMouseEvent: def __init__(self, pressL_func=None, pressR_func=None, dragL_func=None, dragR_func=None, releaseL_func=None, releaseR_func=None): self._pressL_func = pressL_func self._pressR_func = pressR_func self._dragL_func = dragL_func self._dragR_func = dragR_func self._releaseL_func = releaseL_func self._releaseR_func = releaseR_func self._is_dragL = False self._is_dragR = False # Callback登録関数 def setCallBack(self, win_name): cv2.setMouseCallback(win_name, self._callBack) def _doEvent(self, event_func, x, y): if event_func is not None: event_func(x, y) def _callBack(self, event, x, y, flags, param): # マウス左ボタンが押された時の処理 if event == cv2.EVENT_LBUTTONDOWN: self._doEvent(self._pressL_func, x, y) self._is_dragL = True # マウス右ボタンが押された時の処理 elif event == cv2.EVENT_RBUTTONDOWN: self._doEvent(self._pressR_func, x, y) self._is_dragR = True # マウス左右ドラッグ時の処理 elif event == cv2.EVENT_MOUSEMOVE: if self._is_dragL: self._doEvent(self._dragL_func, x, y) elif self._is_dragR: self._doEvent(self._dragR_func, x, y) # マウス左ボタンが離された時の処理 elif event == cv2.EVENT_LBUTTONUP: self._doEvent(self._releaseL_func, x, y) self._is_dragL = False # マウス右ボタンが離された時の処理 elif event == cv2.EVENT_LBUTTONUP: self._doEvent(self._releaseR_func, x, y) self._is_dragR = False
# マウスのxy座標に関する処理 def eventFunc(x, y): ...
# ドラッグ時に描画する関数の定義 def brushPaint(x, y): cv2.circle(img, (x, y), 20, color, -1)・コールバック関数の登録
win_name = 'PaintDemo' cv2.namedWindow(win_name) # CVMouseEventクラスによるドラッグ描画関数の登録 mouse_event = CVMouseEvent(drag_func=brushPaint) mouse_event.setCallBack(win_name)
キー入力 | 機能 |
1 | クロスヘア・カーソル |
2 | ボックス・カーソル |
3 | 直線描画 |
4 | 長方形描画 |
5 | 長方形塗りつぶし描画 |
6 | 円描画 |
7 | 円塗りつぶし描画 |
8 | 楕円描画 |
9 | 楕円塗りつぶし描画 |
r | 描画色 赤 |
g | 描画色 緑 |
b | 描画色 青 |
c | 画面消去 |
q,Esc | 終了 |
$ cd ~/workspace_py37/exercise $ python3 cvmouse.py OpenCV Event List ['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
~/workspace_py37/exercise/~