24 May 2014, 05:11

画像認識でアプリケーション操作の自動化を実現!Sikuliがあまりに革命的で興奮した

はじめに

アプリケーションの自動操作をスクリプトで実現するために、Sikuliを調べてみました。

Sikuliとは

Sikuliとは、

  • OpenCVをつかった画像認識
  • OCRをつかった文字認識

で、アプリケーションの自動操作を実現するためのツール、スクリプト言語。

Javaで実装されているため、JVM上で動作するスクリプト言語から利用できる。

スクリプト編集のためのIDEは、 画像とプログラム言語を合わせて表示できるという、革命的なソフトウェア。 久々に、スゴイ!とおもったソフトウェアだ。

インストール

sikuli-setup.jarをダウンロードして、インストーラをダブルクリックで起動するだけ。

すると、いろいろとインストールオブションがきかれる。JRubyを選択。

slkulix.jarをダブルクリックで起動。IDEが立ち上がる。

インストールは、以下のドキュメントが詳しい。

WinUtil.dllが見つからないエラーではまる

<div class="outline-text-3" id="text-3-1">
  <p>
    runsikulix.cmdで起動するとエラーした。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">[error] ResourceLoader: loadLib: Fatal Error 110: loading: WinUtil.dll

[error] ResourceLoader: loadLib: Since native library was found, it might be a problem with needed dependent libraries C:\sikuliX\libs\WinUtil.dll: 指定されたプロシージャが見つかりません。ﴀ＀ [error] ResourceLoader: loadLib: Check, wether a valid Sikuli libs folder is in system path at runtime!

  <p>
    よくわからないのだが、環境変数のパスを通して(C:)、JDK 7 を最新版にしたらなおった。
  </p></p>
</div></p>

Hello Sikuli

以下のようなコード。

App.open("notepad.exe")
  
find("1400849474303.png")
  
type("Hello Sikuli!!")

<p>
  <a href="https://picasaweb.google.com/lh/photo/lRDJ9IcUEEb0SOkEeZUtAjyD6hjDXGH6XyE6iLrzolo?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-MTSQnqO-6L8/U4AlKQuYAII/AAAAAAAABEI/aW-X9CjdRYo/s800/HelloSikuli.png" height="137" width="307" /></a>
</p>

<p>
  実行結果はこんな感じ。驚きの結果である。
</p>

<p>
  <iframe width="420" height="315" src="//www.youtube.com/embed/SoN_zfuG1E8?rel=0" frameborder="0" allowfullscreen></iframe> </div>
</p>

実行ファイルから実行する

<div class="outline-text-2" id="text-5">
  <p>
    もちろん、IDE を経由しないでコマンドラインから実行できる。
  </p>

  <p>
    ツールバーのファイルから実行ファイルとしてエクスポートを選択。 .skl拡張子のバイナリファイルができる。(ここではtest.skl) なかみは、たんなるzipだったりする。
  </p>

  <p>
    runsikulix.cmdの引数として、.sklを渡す(注意: 1.1からの仕様)
  </p>

  <div class="org-src-container">
    <pre class="src src-language">E:\test&gt;C:\sikuliX\runsikulix.cmd -r test.skl

  <p>
    これで、コマンドラインから実行できた。
  </p></p>
</div></p>

Rubyから実行する

<div class="outline-text-2" id="text-6">
  <p>
    Sikuliの素晴らしいところは、JVM上で動作スクリプト言語を利用できる。
  </p>

  <p>
    JPython, JRubyとか。つまりは、Rubyが使える!
  </p></p>
</div>

<div id="outline-container-sec-6-1" class="outline-3">
  <h3 id="sec-6-1">
    IDEで Rubyをつかう
  </h3>

  <div class="outline-text-3" id="text-6-1">
    <p>
      保存フォルダをのぞくと、たんなる.rbファイルがある。 IDEから実行すると、Lib配下にあるsikkulix.rbがrequireされるようだ。 ようするに、rubyの文法をつかってかけるということ。
    </p>

    <p>
      たとえば、さっきのHelloSikuliをメソッド化してみる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">def hello

App.open(“notepad.exe”)

find(“1400849474303.png”)

type(“Hello Sikuli!!”) end

hello()

    <p>
      すごい。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-2" class="outline-3">
  <h3 id="sec-6-2">
    Ruby scriptとしてつかう
  </h3>

  <div class="outline-text-3" id="text-6-2">
    <p>
      Sikuli IDEでは、実行時にsikkulix.rbを読み込んでいろいろやっているようなので、 このファイルに書いてあることを真似すると、純粋なrubyとして実行できる。
    </p>

    <blockquote>
      <p>
        But be aware: Since the interpreters used are based on Java, the modules available for Python or Ruby might not be available in the Jython or JRuby environment. So before trying to use any non-standard modules or extension packages, you have to check, wether they are supported in this SikuliX environment.
      </p>
    </blockquote>

    <p>
      Java APIを JRubyを経由して呼び出すため、 JRubyのちからを借りる。以下のガイダンスに従う。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/faq/030-java-dev.html">How to use SikuliX API in your JAVA programs — SikuliX 1.1+ documentation</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-3" class="outline-3">
  <h3 id="sec-6-3">
    JRubyをインストール
  </h3>

  <div class="outline-text-3" id="text-6-3">
    <p>
      以下から、インストール。インストールしたら、binフォルダにパスを通す。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://jruby.org/">Home — JRuby.org</a>
      </li>
    </ul>

    <p>
      実行は、jrubyコマンドで実行。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-4" class="outline-3">
  <h3 id="sec-6-4">
    sikulixapi.jarをクラスパスに追加
  </h3>

  <div class="outline-text-3" id="text-6-4">
    <p>
      sikulixapi.jarのなかに、sikuliを制御する処理が入っているので、ここにクラスパスを通す。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">require 'java'

$CLASSPATH << ‘C:\sikuliX\‘ require ‘sikulixapi.jar’

<div id="outline-container-sec-6-5" class="outline-3">
  <h3 id="sec-6-5">
    必要なSikuliクラスをimport
  </h3>

  <div class="outline-text-3" id="text-6-5">
    <p>
      つづいて、必要なクラスをインポートする。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">java_import "org.sikuli.script.Screen"

    <p>
      あとは、一生懸命書くだけだ。なんどでも思う、これはスゴイ。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-6" class="outline-3">
  <h3 id="sec-6-6">
    結果
  </h3>

  <div class="outline-text-3" id="text-6-6">
  </div></p>
</div>

<div id="outline-container-sec-6-7" class="outline-3">
  <h3 id="sec-6-7">
    Environment
  </h3>

  <div class="outline-text-3" id="text-6-7">
    <ul class="org-ul">
      <li>
        windows 7 64bit
      </li>
      <li>
        JDK 7 64bit
      </li>
      <li>
        JRuby 1.7.12
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-8" class="outline-3">
  <h3 id="sec-6-8">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-6-8">
    <p>
      Official
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.sikulix.com/">SikuliX powered by RaiMan &#8211; Home</a>
      </li>
    </ul>

    <p>
      Java Doc
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://dl.dropboxusercontent.com/u/42895525/docs/index.html">https://dl.dropboxusercontent.com/u/42895525/docs/index.html</a>
      </li>
    </ul>

    <p>
      Document
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/index.html">Sikuli / SikuliX Documentation for version 1.1+ (01/2014 and later) — SikuliX 1.1+ documentation</a>
      </li>
    </ul>

    <p>
      よくまとまっている日本語のまとめ
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://safx-dev.blogspot.jp/2013/02/sikuliui.html">Safx: SikuliスクリプトでのUI操作自動化を試してみる</a>
      </li>
      <li>
        <a href="http://hontech.xii.jp/blog/archives/28">sikuliの簡単な使い方 | hontech</a>
      </li>
      <li>
        <a href="http://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:sikuli">Sikuli KamonoWiki</a>
      </li>
    </ul>

    <p>
      Ruby関連
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://blackrat.org/ruby/getting-sikuli-script-working-with-jruby-on-the-mac/">Getting Sikuli Script working with Ruby(JRuby) on the Mac | blackrat.org</a>
      </li>
      <li>
        <a href="https://answers.launchpad.net/sikuli/+question/221083">Question #221083 : Questions : Sikuli</a>
      </li>
      <li>
        <a href="http://www.software-testing.com.au/blog/2010/08/16/automating-flash-ajax-popups-and-more-using-ruby-watir-and-sikuli/">Automating Flash, AJAX, Popups and more using Ruby, Watir and Sikuli | Illiteration –</a>
      </li>
    </ul>
  </div></p>
</div></p>