Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ
公開日:
:
最終更新日:2015/02/26
Autoaction, Python autoaction, autohotkey, autokey, gui automation, programming, python, sikuli, xpresser
Photo by John Greenaway
[2015/02/07 追記]
こんなの見つけました。これがあれば不要ですね・・。
[/追記]
こんにちは、キリンです。
WindowsにAutoHotKeyという自動操作を簡単に作成できるソフトがありまして、その代替的機能をUbuntu上で実現できるソフトがないかと探していました。しかし、納得の行く既存のソフトがなかったので自分で作成してみたというお話です。
目次
AutoHotKeyとは
AutoHotkey とは、Microsoft Windowsが導入されているパーソナルコンピュータに常駐して一連の操作を自動化するためのユーティリティソフトウェアである。(Wikipediaより)
このソフト、めちゃくちゃ便利なんですよね。画像検出でGUIの操作ができるWindows上のマクロソフトの中でもカスタマイズ性に富んでいて、何よりも画像検出の速度が速い。使っていたRuby上からコマンドライン呼び出しで引数を渡しながらGUIの自動操作を行うということを良くしていました。自作DLLの呼び出しもでき、MySQLとの連動ができるライブラリの公開もあったりして、ほんとなんでもできるようになっている自動化ソフトです。
これだけ便利だと、なかなか他を使わなくなってしまうんですが、今回はLinux環境ということで諦めざるをえません。なので代替ソフトがないかなぁと探してみました。
代替ソフトウェアの候補
似たようなことを考える人は多いようで、すでにまとめてらっしゃる方がいたので記事をご紹介します。
色々紹介されていますが、個人的に使えそうだなと思ったのは以下の3つです。
AutoKey
AutoHotKeyの常駐アプリとしての機能を補完したいならこれ。ただ、画像検出でクリックする機能がない。あと、できるならpython上で動かしたい。
Sikuli
Linux上で画像検出による自動クリックを実現したいならこれ。ただ、Jythonというのが気に入らない。
Xpresser
Python上で動くライブラリ。動画は実際にXpresserを使って、GUI操作自動化スクリプトを即座に作ったhowto動画です。機能だけみてみたら個人的には大満足!
・・・のはずなんだけど、Xpresserがちゃんと動かないんです。デバッグしながら色々調べてみたところ、Xpresserで使っているSimpleCVというライブラリがちゃんと機能していない模様。
SimpleCVとは?
OpenCVのラッパーのような感じで、簡単にOpenCVを使おうよみたいな趣旨で作成されたライブラリみたいです。
SimpleCVの動作不良
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from SimpleCV import * import sys, time, socket source = Image("/home/myuser/Pictures/Tooltip_004.png", sample=True) # the image to search template = source.crop(10, 10, 30, 30) t = 5 #methods = ["SQR_DIFF","SQR_DIFF_NORM","CCOEFF","CCOEFF_NORM","CCORR","CCORR_NORM"] methods = ["CCOEFF_NORM"] # the various types of template matching available for m in methods: print "current method:", m # print the method being used result = Image("/home/myuser/Pictures/Tooltip_004.png", sample=True) dl = DrawingLayer((source.width,source.height)) fs = source.findTemplate(template,threshold=t,method=m) for match in fs: print match, match.quality dl.rectangle((match.x,match.y),(match.width(),match.height()),color=Color.RED) result.addDrawingLayer(dl) result.applyLayers() #result.show() result.save("/home/myuser/Pictures/Tooltip_004_%s.png"%(m)) time.sleep(3) |
スクリーンショットのPNGから指定位置の画像(x=10, y=10, w=30, h=30)を取り出して、ちゃんと取り出した部分を画像検出で抽出するかということを検証した簡単なプログラム。本来ならばっちりx=10, y=10の点で最も良い結果が得られるはずなのに、全然ちゃんと動かない。とんでもない点が抽出されたり、何よりQualityの値が悪すぎて使い物になりません。なので、ちゃんと動く大元のOpenCVを使って改良してみました。
GUI操作自動化ライブラリ Autoaction
Xpresserの優秀なモジュールであるxutils.pyを使って、簡単にGUIを操作自動化のライブラリを作ってみました。
まだクリックすることと、キーボードを入力することしか対応していませんが、必要になり次第、徐々に機能の拡充を図っていこうと思います。
インストール
インストールはsetup.pyしか用意していませんので、GitHub上からダウンロードして、ディレクトリのルートで下記コマンドを実行してください。
python-opencvも必要なので、インストールしてない人はapt-get等からインストールしてください。
1 |
python setup.py install |
サンプルコード
こんな感じのコードを書けば、自動でFirefoxの検索窓から”python-autoaciton”を自動で検索してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import os from autoaction import Autoaction if __name__ == "__main__": file_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "images") # Set the image directory auto = Autoaction(file_dir) # click_image() will click the image on the screen # x, y is the width from the matching point. auto.click_image("firefox_icon.png", x=5, y=5) auto.sleep(3) auto.click_image("search.png", x=5, y=5) auto.sleep(1) # type() will type the keyboard following the input string. # When you input array string, you can use special keys. auto.type(["python-autoaction", "<Enter>"]) |
まだ複合キーの送付等には対応していません。随時追加していこうと思います。
余談
作っている最中に、こんなのを見つけました。まだ詳しく調べられてませんが、実はこれで事足りるのかも?。
ご参考になれば幸いです!



About Fx-Kirin
2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。
- Web |
- More Posts (410)
Adsense
関連記事
-
-
ctypes で c_char array を c_char_p に変換する
なかなか情報がなかったのでメモ書き。
-
-
JAVA の SHA1 Digestの作り方
>>> import base64 >>> import hashlib >>> base64.b64encode(
-
-
Pythonのsocketでプロセス間通信をして価格データ等を送信する
どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ
-
-
重回帰分析による米雇用統計の予測モデルを作成してみる
この記事はPython その2 Advent Calendar 2015 の17日目の記事です。 1 はじめに
-
-
stop automatically closeing vim-ipython output with jedi-vim
Even though I commented out the following code in vim_ipytho
-
-
joblib によって謎のバグが起こる
joblib 0.14.1 にて確認.0.13.2 だと起こらない.import joblib を消すと正常に動く.
-
-
Derivatives analytics with Python の学習ノート 1,2章
洋書を読んでいると、いつも読んだ気になってちゃんと理解出来てるか自信がないことが多いので、チャプターごとに要点をまとめ
-
-
PYPIへの登録を10秒でできるようになる方法
pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリをインストールするこ
-
-
Interactive Brokers 証券の Python API を利用する
Interactive Brokers 証券とは 日本には珍しく自動売買プラットフォームが提供されいてる証券会社です。
-
-
Python x64 & MinGW64 環境の構築
流石に詰まりまくったのでまとめることにする。 MSYS2 をインストール 個人的にこれからメインで使いたいと思っ
Adsense
NEW ENTRY
-
- Linux Mint 20 での日本語の設定について。
フォントの設定とかはいろいろなところで触れられているので、他にない情報だけ。 TL;DR F
-
- joblib によって謎のバグが起こる
joblib 0.14.1 にて確認.0.13.2 だと起こらない.import joblib を消
-
- Fixing kernel error AMD-Vi: Event logged IO_PAGE_FAULT on Ryzen Machine
My pc was periodically shut down on 7:40 am JS
-
- Ubuntu で仮想ディスプレイを使う
雑多な備忘録ですが、せっかくなので残しておきます。 Ubuntu 18.04 の resolv.c
-
- PYPIへの登録を10秒でできるようになる方法
pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリ
Twitter
RSS
カテゴリー
-
人気記事一覧
任意のインジケータのシグナルでアラートやメール機能を追加する 522ビュー
まだBokehで消耗してるの?これからはPandas-Bokehを使おうぜ 219ビュー
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介 212ビュー
Ubuntu で仮想ディスプレイを使う 183ビュー
Pythonのsocketでプロセス間通信をして価格データ等を送信する 121ビュー
Add Alert and SendMailの改造 114ビュー
Synology DS216j の MySQL に外部からつなぐ 103ビュー