opencv Advanced 03 - 画像とマウス間の対話の例

画像を操作する場合、現在処理中の画像を操作する必要がある場合があります。OpenCV は、
ユーザーがマウスを使って画像を操作できるようにするマウス イベントを提供します。マウス イベントは、マウスのクリック、さまざまなボタンのダブルクリック、スライド、ドラッグなど、一般的に使用されるマウス操作を識別できます。

たとえば、ユーザーがマウスをクリックすると、円が描画されます。通常は OnMouseAction() レスポンス関数を作成し、そのレスポンス関数内に実現したい動作を記述する方法が一般的です
応答関数は固定形式に従って作成され、その形式は次のとおりです。

def OnMouseAction(event,x,y,flags,param):

式では次のようになります。

  • イベントは、トリガーされるイベントの種類を示します。特定のイベントを表 19-3 に示します。
  • x、y は、マウス イベントがトリガーされたときのウィンドウ内のマウスの座標 (x、y) を表します。
  • 表 19-4 に示すように、フラグはマウスのドラッグ イベントとキーボードとマウスのジョイント イベントを表します。
  • param は、対応するイベント関数を識別する関数 ID です。これは、OnMouseAction() 関数の ID をカスタマイズするのと同じです。
  • OnMouseAction は応答関数の名前であり、カスタマイズできます。

ここに画像の説明を挿入
ここに画像の説明を挿入
応答関数を定義した後、ウィンドウ内のマウスがイベントをトリガーしたときに応答関数を見つけて実行できるように、その関数を特定のウィンドウに関連付ける (バインドする) 必要があります。関数をウィンドウにバインドするには、函 数cv2.setMouseCallback()関数を実装します。その基本構文は次のとおりです。

cv2.setMouseCallback(winname,onMouse)

式では次のようになります。

  • winname はバインドされたウィンドウ名です。
  • onMouse は、バインドされた応答関数の名前です。

トリガーされたマウスイベントを判断するプログラムを設計します。

import cv2
import numpy as np
def Demo(event,x,y,flags,param):
 if event == cv2.EVENT_LBUTTONDOWN:
  print("单击了鼠标左键")
 elif event==cv2.EVENT_RBUTTONDOWN :
  print("单击了鼠标右键")
 elif flags==cv2.EVENT_FLAG_LBUTTON:
  print("按住左键拖动了鼠标")
 elif event==cv2.EVENT_MBUTTONDOWN :
  print("单击了中间键")
# 创建名称为 Demo 的响应(回调)函数 OnMouseAction
# 将响应函数 Demo 与窗口“Demo19.9”建立连接(实现绑定)
img = np.ones((300,300,3),np.uint8)*255
cv2.namedWindow('jiaohu01')
cv2.setMouseCallback('jiaohu01',Demo)
cv2.imshow('jiaohu01',img)
cv2.waitKey()
cv2.destroyAllWindows()

操作結果:
ここに画像の説明を挿入

注: OpenCV でサポートされているマウス イベントは、次の方法で表示できます。

import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

スクロール・バー

スクロールバー(トラックバー)はOpenCVの非常に便利なインタラクティブツールで、特定のウィンドウに付属して存在します。
スクロールバーを調整することで、指定範囲内の特定の値を設定および取得できます。
OpenCV では、関数 cv2.createTrackbar() を使用してスクロール バーを定義します。その構文形式は次のとおりです。

cv2.createTrackbar(トラックバー名、winname、値、カウント、onChange)

式では次のようになります。

  • trackbarname はスクロールバーの名前です。
  • winname は、スクロール バーが接続されているウィンドウの名前です。
  • value は、スクロールバー内のスライダーの位置を決定する初期値です。
  • count はスクロールバーの最大値です。通常、最小値は 0 です。
  • onChange はコールバック関数です。通常、スクロールバー変更後の動作はコールバック関数に記述します。

函数 cv2.createTrackbar()用于生成一个滚动条スクロール バーをドラッグしてスクロール バーの値を設定すると、スクロール バーが対応する値を返します。スクロール バーの値は函数 cv2.getTrackbarPos()によって取得でき、その構文形式は次のとおりです。

retval=getTrackbarPos( トラックバー名,winname )

式では次のようになります。

  • retval は戻り値で、関数 cv2.createTrackbar() によって生成されたスクロール バーの値を取得します。
  • trackbarname はスクロールバーの名前です。
  • winname は、スクロール バーが接続されているウィンドウの名前です。

例: スクロールバーのあるパレットの実装

RGB 色空間では、どの色も赤 (R)、緑 (G)、青 (B) の 3 色で構成され、各色成分の範囲は [0, 255] です。

このセクションでは、関数 cv2.createTrackbar() と関数 cv2.getTrackbarPos() を使用して
アナログ パレットを設計します。フォームには、R、G、B の値をそれぞれ設定するために使用される 3 つのスクロール バーがあり、パレットは現在の値に応じて調整されます。ディスプレイの R、G、B 値は、対応する色をリアルタイムで表示します。

import cv2
import numpy as np
def changeColor(x):
 r=cv2.getTrackbarPos('R','image')
 g=cv2.getTrackbarPos('G','image')
 b=cv2.getTrackbarPos('B','image')
 img[:]=[b,g,r]
img=np.zeros((100,700,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,changeColor)
cv2.createTrackbar('G','image',0,255,changeColor)
cv2.createTrackbar('B','image',0,255,changeColor)
while(1):
 cv2.imshow('image',img)
 k=cv2.waitKey(1)&0xFF
 if k==27:
    break
cv2.destroyAllWindows()

ここに画像の説明を挿入

例 2: スクロールバーを使用したしきい値パラメーターの制御

import cv2
Type=0 # 阈值处理方式
Value=0 # 使用的阈值
def onType(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value,255, Type)
 cv2.imshow(windowName,dst)
def onValue(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value, 255, Type)
 cv2.imshow(windowName,dst)
o = cv2.imread("lena.png",0)
windowName = "demo.13" #窗体名
cv2.namedWindow(windowName)
cv2.imshow(windowName,o)
# 创建两个滚动条
tType = "Type" # 用来选取阈值处理方式的滚动条
tValue = "Value" # 用来选取阈值的滚动条
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName,0, 255, onValue)
if cv2.waitKey(0) == 27:
 cv2.destroyAllWindows()

プログラムを実行すると、フォームオブジェクト内に、閾値と閾値の処理方法を制御する2つのスクロールバーが同時に表示されます。スクロールバーを調整すると、しきい値処理で使用されるしきい値としきい値処理方法をそれぞれ。実行結果は図に示されています。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132295748