Help us understand the problem. What is going on with this article?

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

More than 3 years have 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")

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした