Ruby
OpenCV

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

More than 1 year has passed since last update.

ちなみに 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")

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