Python + OpenCVでマウスクリック後の画面遷移判定をする

前々からpythonOpenCVに興味があったので少し触ってみる

やりたいこと

準備する物

  • python2.7.6(3.x系でも問題ないはず)
  • OpenCV(今回はv2.4.8、Cmakeで自前ビルド)
  • ImageGrab(pythonライブラリ、簡単にスクリーンショットが撮れる)
  • numpy(これがないとopencvが動かないようなので必須)

実践

 処理の流れとしては以下のようなイメージ、基本的に345をループ実行する

  1. 一定間隔でスクショ画像を取得
  2. 予め保存してある画面情報と比較して閾値以上の画像を検索、現在の画面状態を把握する
  3. マウス移動&クリック
  4. 指定の遷移状態が確認できるまで待機
  5. 次のマウス操作

 今回は外部設定ファイルにマウスクリック位置と、クリック後の画面状態のセットを登録し、それらを指定順番で実行する形式にしてみた・・・が適当に作りすぎて汚いコードになっちゃったので重要な部分の動きだけ抜粋

画像の比較サンプル
import cv2 as cv
# 画像のロード
img1 = cv.imread(filename1)
img2 = cv.imread(filename2)
# ヒストグラム作成
hist1 = cv.calcHist([img1],[0],None,[256],[0,256])
hist2 = cv.calcHist([img2],[0],None,[256],[0,256])
# この値が1.0に近いほど似た画像であるもよう
value = cv.compareHist(hist1, hist2, 0) 
画面キャプチャ
import ImageGrab
def GetScreenCaptureImg(x, y, w, h) :
    # 指定領域をキャプチャ
    img = ImageGrab.grab((x,y,w,h))
    img.save()
マウス操作
from ctypes import *
user32 = windll.user32
def Move(x,y):
    user32.SetCursorPos(x,y)
def Click():
    user32.mouse_event(0x2,0,0,0,0)#押す
    user32.mouse_event(0x4,0,0,0,0)#離す

結果

  • 誤判定だらけかと思いきや、なかなかの精度で画面遷移判定をしてくれたので満足。
  • マウス操作だけのアプリと比べて画面遷移が確認できてから次のマウス操作を実行するため、タイミングのズレやラグが気にならない
  • マウスのコントロールが取られるので他の作業ができない

以上