Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ruby-opencvのテンプレートマッチングのサンプル
# ruby-opencvのテンプレートマッチングのサンプル
# https://github.com/ruby-opencv/ruby-opencv
require 'opencv'
include OpenCV
# (1) 画像を読み込み
image = CvMat.load('image.jpg') # テンプレートと比較する画像
template = CvMat.load('template.jpg') # テンプレート画像
# (2) CvMat#match_template でテンプレートマッチング
#
# CvMat#match_template(template [, method = CV_TM_SQDIFF])
# 引数
# template (CvMat/IplImage): 探索するテンプレート画像
# method (Integer/Symbol): テンプレートマッチング手法
# 戻り値
# 比較結果のマップ (CvMat)
#
# methodにはcvMatchTemplateと同じく、
# 定数 CV_TM_SQDIFF/CV_TM_SQDIFF_NORMED/CV_TM_CCORR/CV_TM_CCORR_NORMED/CV_TM_CCOEFF/CV_TM_CCOEFF_NORMED
# を指定(デフォルトはCV_TM_SQDIFF)
# それぞれの代わりに、シンボル :sqdiff/:sqdiff_normed/:ccorr/:ccorr_normed/:ccoeff/:ccoeff_normed でも可
#
# 参考 http://opencv.jp/opencv-2.2/c/imgproc_object_detection.html#cvMatchTemplate
#
result = image.match_template(template, CV_TM_SQDIFF) # CV_TM_SQDIFF の代わりに :sqdiff でも同じ
# (3) テンプレートに対応する位置に描画
#
# CvMat#min_max_loc は画像の [最小値, 最大値, 最小値の座標, 最大値の座標] の配列を返す (cvMinMaxLocのラッパー)
# match_template の手法で CV_TM_SQDIFF を指定した場合は、最も相関が高い位置が result の最小値となるので、
# 最小値の座標を取得する
pt1 = result.min_max_loc[2]
pt2 = CvPoint.new(pt1.x + template.width, pt1.y + template.height)
image.rectangle!(pt1, pt2, :color => CvColor::Black, :thickness => 3)
# (4) 結果を表示
GUI::Window.new('Template matching').show image
GUI::wait_key
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment