30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ruby-opencv を使ってテンプレートマッチングしてみた

Last updated at Posted at 2012-12-26

ちなみに opencv をほとんど知らないので間違いや用語の間違い,回りくどいことをやっている等ありましたら教えて下さい.

今回の環境

  • osx
  • homebrew
  • ruby-2.3.0

opencv を install する

% brew install homebrew/science/opencv

opencv2.4.12_2 がインストールされます.

ruby-opencv の install

ruby-opencv 0.0.14 を使います

% gem install opencv

画像を読み込む

require "opencv"

image = OpenCV::IplImage.load("image.jpg")

簡単に画像が読みこめて,
image.width, image.height とかでサイズが取れます.

テンプレートマッチングしてみる

template = OpenCV::IplImage.load("template.jpg")

result = image.match_template(template)

result は OpenCV::CVMat 形式で,
全てのチャンネルでテンプレートマッチした結果が格納されている模様です.
一瞬でマッチングされるのですが,すごいですね.

なお,match_templateは第2引数で評価関数を指定できます.デフォルトは :sqdiffになっています.

最良の結果を取得する

min_score, max_score, min_point, max_point = result.min_max_loc

先程はデフォルトの:sqdiff(最小二乗法)で評価したので,最小値の方を利用しないといけません.

:ccorr(なんですかね?) とかを指定したら,最大値の方を利用します.
ややこしいですね.

なお,{min,max}_point は OpenCV::CvPoint 形式です.

マッチングしたことを目視確認する

マッチングしたところを矩形で囲んでデバッグするのが一般的ですよね.
image に矩形を重畳してみましょう.

from = min_point
to = OpenCV::CvPoint.new(from.x + template.width, from.y + template.height)
image.rectangle!(from, to, :color => OpenCV::CvColor::Black, :thickness => 1)

矩形を描画するのは rectangle メソッドです.
from と toは矩形の対角線上の頂点を指定します.
第3引数はオプションですが,矩形の色とか線の太さとかを指定できます

Window に表示してみよう

矩形を重畳しただけでは,見られないので,表示しましょう
OpenCV は GUI に簡単に表示できます.

window = OpenCV::GUI::Window.new("canvas")
window.show image

ファイルに書き出してみよう

image.save_image("otuput.png")

これで基本はばっちりですね!

30
30
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?