内容
OpenCVのAPIをある程度ラップされているCVパッケージを用いて
画像処理(今回はテンプレートマッチング)を行ないました。
内容に誤りがありましたら、ご指摘をお願いいたします。
実装
import System.Environment(getArgs)
import CV.Image
import CV.Drawing
import CV.HighGUI
import CV.TemplateMatching
import Utils.Rectangle
main :: IO()
main = do
[srcFile, tmpFile] <- getArgs
srcImg <- readFromFile srcFile :: IO (Image GrayScale D32)
opSrcImg <- readFromFile srcFile :: IO (Image RGB D32)
tmpImg <- readFromFile tmpFile :: IO (Image GrayScale D32)
(pt, _, _) <- getImageInfo tmpImg
let (pm, _) = simpleTemplateMatch CCOEFF_NORMED srcImg tmpImg
searchRect = mkRectangle pm pt
opImg <- rectangle (0, 0, 255) 3 searchRect opSrcImg
display $ (rgbToBgr.unsafeImageTo8Bit) opImg
コードの内容
画像読み込み部分
まず、元画像と検索したい画像を入力として与えます。
readFromFile関数は型注釈をつけて画像ファイルを読み込みます。
テンプレートマッチングを行うsimpleTemplateMatch関数は
GrayScaleで処理を行うため、入力画像を両方ともGrayScaleで読み込みました。
あと出力画像はカラーで画像を出力したいので、元画像をRGBカラーで読み込んでいます。
検索結果表示に関する情報取得
getImageInfo関数で、検索したい画像のサイズを取得します。
これは検索結果で見つけた画像領域を囲むためです。
テンプレートマッチング
simpleTemplateMatch関数でテンプレートマッチングを行ないます。
CCOEFF_NORMEDは代数的データ型MatchTypeのコンストラクタでEnumのインスタンスです。
この値は類似度計算方法を指定するものでOpenCVでも定義されています。
この値の意味は相関係数+正規化の計算方法でテンプレートマッチングを行なわせます。
残りの2引数は元画像と検索する画像です。
検索結果の画像を作成
simpleTemplateMatch関数の結果は最もマッチした箇所の座標が返ってきます。
mkRectangle関数は、その位置に対して、検索したい画像のサイズの大きさの長方形を作ります。
rectangle関数は色と線の太さを指定して、長方形を画像に描きます。
検索結果の画像を表示
display関数で検索結果の画像を表示します。
内部ではBRG形式で扱っているようなので、RGB形式からBGR形式に変換してから表示します。