Background
会社でWebページに設置するウィジェットの開発をしているときに、目検でチェックをしていて嫌になったから
image_matchっていうgemを作った。
せっかく作ったから、この記事で使い方を紹介してみる。
Environment
- OS
- Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
- Ruby
- 1.9.3
- OpenCV
- >=2.4.6
Overview
このgemは今のところ以下の4つの関数を提供している。- perfect_match
- 対象の画像が用意していた画像と完全に一致するかどうか。
- perfect_match_template
- 対象の画像の中の一部が用意していたテンプレート画像と完全に一致するかどうか。
- fuzzy_match_template
- 用意していたテンプレート画像と似ている箇所が対象の画像の中にあるかどうか。
- match_template_ignore_size
- 対象の画像の中の一部が、サイズの違いを無視した場合に、用意していたテンプレート画像と一致するかどうか。
特に会社で開発している広告ウィジェットのテストにはこれらの機能では不十分な気がするから。 このgemを使う場合は基本的には以下の流れに沿う形になるはず。
- 画像を用意する。
- このgemを使ってテストコードを書く。
- テストコードを実行する。
というのも、フレームワークを使った場合の利用方法は一目瞭然だから。
Sample
1. 画像を用意する。
以下のGoogleのロゴ画像を用意してみた。2. このGemを使ってテストコードを書く。
├── Gemfile ├── google-logo.jpg └── main.rb 0 directories, 3 files
Gemfile
ここではWebページのスクリーンショットを撮るために、”capybara”と”poltergeist”を使う。Selenium RCを使えば、IE・Firefox・Chrome・Android・iOSとかでもスクリーンショットを撮ってテストできる。
source 'https://rubygems.org' gem 'capybara' gem 'poltergeist' gem 'image_match'
main.rb
require 'capybara' require 'capybara/poltergeist' require 'image_match' include ImageMatch # Get current google web page image url = 'http://google.com/' Capybara.javascript_driver = :poltergeist Capybara.register_driver :poltergeist do |app| Capybara::Poltergeist::Driver.new app, js_errors: false end Capybara.default_selector = :xpath session = Capybara::Session.new(:poltergeist) session.driver.headers = {'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X)"} session.visit(url) session.save_screenshot('screenshot.png', full: true) # Compare logo (output match result image) # When you write perfect_match_template('./screenshot.png', './google-logo.jpg'), nothing outputting result image if perfect_match_template('./screenshot.png', './google-logo.jpg', 0.9, true) puts "Find!" else puts "Nothing..." end
ハイライトされているところがこのgemに関係するところ。
requireとinclude入れてたったの3行。
perfect_match_template関数を使っているけど、
この関数の注意点としてはサイズが少しでも違うとマッチしない可能性があること。
その場合は、用意する画像のサイズを調整するか、
match_template_ignore_sizeを利用してください。
3. Run
あれ?なんでマッチしないんだ?$ bundle install --path=.bundle $ bundle exec ruby main.rb Nothing...
なるほど。今日は与謝野晶子さん用のロゴになっているのね。
じゃあ違う日に試した結果を以下に出してみる。
$ bundle exec ruby main.rb Find!
うん。期待通り。 おそらく、今は基本的には”complete_match_template”か”match_template_ignore_size”.の2つの機能しか使わないと思う。 他にも、目検でのテストをなくすために作っているものがあるから、
完成したら公開してみたい。