前回は、SikulixIDE上でprint文を使って緯度・経度を「メッセージウイドウ」に表示しましたが、これでは実用性がほとんどありませんでした。
SikuliXはJavaで作れらたソフトなのでJavaのGUIツールであるSwingが使用できました。
SikuliXで認識した座標を緯度・経度変換後、GUIで常に表示しMulti-Xの上に重ねて表示させて見ました。
Settings.MinSimilarity=0.99
MinSimilarityは画像認識時の最小類似度で、デフォルトは0.7でした。
0.7のままで画像を認識させると、「1」を「7」など誤認識をするケースがあったので0.99としました。
reg.setAutoWaitTimeout(0.1)
findAllで画像を検索する時に、一致する画像がない場合一定時間(デフォルト3秒)待機しますが、待機する必要はないので、0.1としました。
app = App.focus("MultiX") regm = app.focusedWindow()
Multi-Xのウインドウにフォーカスを設定し、フォーカスをあてたウインドウ領域を取得して、緯度経度の表示位置を決定しました。
xyreg=Region(regm.x + regm.w -317,regm.y + regm.h - 31,211,24)
限定した領域で画像検索すると処理速度が速いようなので、検索領域をMulti-X画面右下の座標表示領域に設定しました。
Env.addHotkey("u",KeyModifier.CTRL,stop)
「Ctrl+u」でSikuliXのスクリプトが停止するようにホットキーを登録しました。
pre_mouse_pos = Env.getMouseLocation() pre_ocr_pos = Env.getMouseLocation()
Env.getMouseLocation()でマウスの座標を取得します。
マウスを移動させ続けると、Multi-X画面右下の座標表示は常に更新します。座標表示更新中に画像認識を行うと誤認識するケースが発生したので、マウスが停止している時のみに画像認識を実行するようにしました。
また、同じ位置で画像認識を連続で繰り返さないようにしました。
スクリプトを実行すると緯度・経度を表示します。
SwingのJComboBoxを使用して座標系を選択し、選択した座標系で緯度・経度へ変換します。
Multi-Xのウインドウを移動したりサイズ変更すると追従しないなど怪しところがあるので、まだまだ改良が必要です。