LoginSignup
10
9

More than 5 years have passed since last update.

HaskellでOpenCVを使う。(CVパッケージを用いた実装)

Posted at

内容

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形式に変換してから表示します。

入力画像と出力結果

入力画像

検索元画像
lena.jpg

検索画像
eye.png

出力画像

result.png

10
9
0

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
10
9