Skip to content
Takeshi HASEGAWA edited this page Oct 22, 2015 · 3 revisions

IkaMatcher

IkaLog では画面のきまった場所にきまったデータが出ているか判断するために IkaMatcher クラスをよく使います。画面認識で反応が鈍い、誤反応が多い場合には IkaMatcher のスコアを確認することがまず大事です。

IkaMatcher のログの見方

IkaMatcher のインスタンスを生成する際に debug=True に設定すると stderr に下記のようなメッセージが出るようになります。

IkaMatcher: result=False raito BG 0.115 FG 0.771
    (threshold BG 0.300 FG 0.950) 
    label:map:タチウオパーキング

上記表示は以下の内容を示します。

  • map:タチウオパーキング のマッチングを行った
  • バックグラウンドの False-Positive の割合は 11.5% 。閾値は 30.0% なので背景のチェックはパス
  • フォアグラウンドのマッチの割合は 77.1% 。閾値は 95.0% なので前景はパスせず
  • 結果として、これは map:タチウオパーキングではない。

マッチングの手順

IkaMatcher は以下の順序で画像をマッチングします。

  • インスタンス生成時にマスクデータを読み込みます。この際背景は白色、全景は黒色となっていることとします。
 40     def __init__(self, debug=False):
 41         self.mask_finish = IkaMatcher(
 42             0, 0, 1280, 720,
 43             img_file='masks/ui_finish.png',
 44             threshold=0.950,
 45             orig_threshold=0.05,
 46             bg_method=matcher.MM_BLACK(),
 47             fg_method=matcher.MM_WHITE(sat=(0, 255), visibility=(16, 255)),
 48             label='Finish',
 49             debug=debu
  • シーンクラスのインスタンスなどから IkaMatcher の match() メソッドを呼び出すことで、マッチングが行われます。
  • まずは背景画像を抜き出します。背景画像の抜き出しは IkaMatcher インスタンス生成時の bg_method で指定された画像マスク処理を適用することで行います。
  • 抜き出した背景画像は、 0 がポジティブ、 255 がネガティブのグレースケール画像です。つまり白が多ければ多いほど意図せぬフレームであることを意味します。
  • IkaMatcher は、 threshold とバックグラウンドのスコア(白色の割合)のどちらが大きいかを比較します。このときorig_threshold を越えるほど白色の部分が多ければ、背景が意図したものでないと判断して、以後のマッチングを中断します。
  • 続いて全景を抜き出します。前景画像の抜き出しは IkaMatcher インスタンス生成時の fg_method で指定された画像マスク処理を適用することで行います。
  • 抜き出した背景画像は、 0 がネガティブ、 255 がポジティブのグレースケール画像です。つまり黒が多ければ多いほど意図せぬフレームであることを意味します。
  • IkaMatcher は、 threshold とバックグラウンドのスコア(白色の割合)のどちらが大きいかを比較します。このときthreshold を越えるほど白色の部分がないようであれば、前景が意図したものでないと判断します。
  • IkaMatcher がデバッグ状態の場合のみ、入力画像、マッチングに使用した中間画像を OpenCV の画像ウインドウを介して表示します。

目的色の抽出アルゴリズム

fg_method, bg_method に利用できるクラスは本 Wiki 更新時点で下記のものです。

| MM_WHITE | 白色の部分のみ抜き出す | | MM_NOT_WHITE | 白色でない部分のみ抜き出す | | MM_BLACK | 黒色の部分のみ抜き出す | | MM_NOT_BLACK | 暗くない部分のみ抜き出す | | MM_DARK | 暗い部分のみ抜き出す | | MM_COLOR_BY_HUE | 特定の色相のみ抜き出す |

さじ加減

  • orig_thresholdを上げ、threshold を下げるほど意図した場面/意図しない場面の両方に反応しやすくなります。
  • orig_thresholdを下げ、threshold を上げるほど意図した場面/意図しない場面の両方に反応しにくくなります。
  • キャプチャカードはそれぞれ画面の明るさや色などで特徴を持っています。あまりシビアに設定するとほかのユーザのところで反応しないことがあります。緩くしすぎても誤反応の原因になります。

ユニットテスト

誤反応や特定環境での反応が悪くパラメータを見直す場合は、同時に IkaLog レポジトリの test/ にあるユニットテストのしかるべき場所に、修正した画像の単体テストを加えてください。その後のパラメータ調整において値を変更したことによりほかの環境でこれまで反応していたものが反応しなくなった、などをテストケースから確認できあmす。

現状 IkaLog のユニットテストで使用するテストデータは IkaLog レポジトリに含めていません。ユニットテストの追加、ユニットテストを利用による修正結果のテストを行いたい場合は hasegaw まで連絡しテストデータを入手してください。

その他備考

threshold, orig_threshold は今後 fg_threshold, bg_threshold にリネーム予定です。