MatchTemplateを使ったアノテーション貼り付け位置の補正

概要

FAXで届いた注文請書の所定の位置に、社印画像を自動で貼り付けます。

その際に、縦横のずれをMatchTemplateを利用して計算し、枠からはみ出すことなくアノテーションを貼り付けることができます。

文書上の特徴的な部分を切り取ってテンプレート画像とし、それが受信した文書のどこにあるのか、位置を特定(座標を取得)します。

その座標と、基本の座標の位置とのずれを計算し、アノテーション貼り付けの座標を補正します。

注文請書
Fax受信
\10_貼り付け前
\10_貼り付け前
注文請書.xdw(被探索画像)
位置を補正して貼り付け
\20_貼り付け済
注文請書.xdw
MatchTemplateでマッチング判定(位置測定)
テンプレート画像

設定の前準備

フォルダの準備

フォルダ構成は以下の通りです。

  • C:\Home\Demo\テンプレートマッチング2
    • 10_貼り付け前
      監視フォルダ。
    • 20_貼り付け済
      アノテーション貼り付け済みのファイルを格納するフォルダ。
    • 90_System
      • 10_Command
        matchTemplateのプログラムファイル。
        • MatchTemplate.html
          ※プログラムファイルはあらかじめ ダウンロード し、解凍したファイルをこのフォルダへ入れて下さい。
        • OpenCvSharp.Extensions.dll
        • OpenCvSharp.dll
        • OpenCvSharpExtern.dll
        • matchTemplate.exe
      • 20_画像
        • テンプレート_注文請書.tif
          注文請書のテンプレート画像。
        • 社印.bmp
          貼り付け画像。
      • 30_MatchTemplate
        結果格納用一時フォルダ。
      • 90_Log
        ログの出力先。

フォルダ構成のダウンロード(Cドライブのルートに解凍してください。)

テンプレートマッチング2.zip

テンプレート画像の作成

普段扱っている実際の注文請書を使用して、テンプレート画像を作成します。

  1. DocuWorksDeskで注文請書を開き、ファイルメニュー>イメージ変換出力 をクリックします。

  2. 変換形式を「TIFFファイル」にします。保存先を適宜設定して下さい。

  3. 解像度は、普段のFax受信時の解像度に合わせます。ここでは「200」dpiとします。

  4. 色は「白黒」を選びます。

  5. OKを押し、変換します。

  6. 変換した帳票を「ペイント」アプリで開き(Windows10の場合)、帳票内の特徴的な部分(その種類の帳票に必ず存在する部分)をトリミングし、上書き保存します。

  7. トリミングした画像を、「テンプレート_注文請書.tif」として \90_System\20_画像 へ移動します。

  8. これでテンプレート画像の準備は完了です。

貼り付け画像の準備

確認印として貼り付ける社印の画像の準備をします。

  1. 紙に社印を押したものを用意します。

  2. それをスキャンし、注文請書の所定の枠内に納まる大きさにトリミングします。

  3. トリミングしたものを、ビットマップ(bmp)形式で保存し、 「社印.bmp」として \90_System\20_画像 へ移動します。

  4. これで貼り付け画像の準備は完了です。

設定

ここからは、eDocArrangementが初期状態からの設定を説明しますが、以下のリンクから完成した設定をダウンロードしていただくこともできます。ダウンロードは、リンク名を右クリックし、「名前をつけてリンクを保存」を選択することで実行できます。

設定ファイルのダウンロード

eDocArrangement.zip

グローバルデータとログの設定

  1. eDocArrangementを立ち上げ、ツールメニュー>グローバルデータの設定にて、「名前」欄を「TopFolder」、「文字列」欄を「C:\Home\Demo\テンプレートマッチング」とし、追加します。

  2. また、設定画面にて、ログの設定をします。

  3. 詳しい設定方法は、 設定例(共通)グローバルデータとログの設定 を参照して下さい。

社印貼り付け設定

  1. 設定一覧の下の「新規」をクリックします。「設定1」を右クリックし、設定名を変更します(ここでは「社印貼り付け」とします)

  2. 基本設定タブの「フォルダ自動監視を行う」をチェックします。

  3. 「監視設定」タブにて、監視フォルダ名欄で右クリック → グローバルデータ書式 → グローバルデータ取得(TopFolder)を選び、その後に、\10_貼り付け前 と入力します。

  4. 右側の「追加」ボタンを押すと、「監視フォルダ一覧」に追加されます。

前処理

  1. 右上の「処理名」より「マクロ実行」を選択し 「処理追加」を押して、社印貼り付け設定に追加し、処理名を「前処理」と変更します。

  2. マクロ欄には、図のようにマクロを記入します。(画像内のマクロは、長いので右側及び下側が隠れています)

    (任意ですが、各マクロの上に「#(コメント)」で各処理の内容を書いておくと、後でわかり易いでしょう。)

  3. それぞれのマクロについて説明します。

    #テンプレートマッチング結果 初期化
    {%SET_U(wk,帳票判定,なし)}
    

    ↑ 帳票判定の結果を保存するユーザーデータを用意し、初期化しておきます。

    #貼り付け位置初期化
    {%SET_U(属性,貼り付け座標X,143.67)}
    {%SET_U(属性,貼り付け座標Y,85.63)}

    ↑ 画像(社印)を貼り付ける基本の位置を、座標で指定します。単位はmmです。

    #テンプレートマッチング関連ファイル名
    {%SET_U(wk,探索画像ファイル名,{%GET_G(TopFolder)}\90_System\30_MatchTemplate\search.tif)}
    {%SET_U(wk,結果ファイル名,{%GET_G(TopFolder)}\90_System\30_MatchTemplate\result.txt)}

    ↑ 被探索画像のファイルの場所や結果ファイルを保存する場所のパスをユーザーデータをセットします。

    #探索画像ファイル削除
    {%DELETE_FILE({%GET_U(wk,探索画像ファイル名)})}

    ↑ 前回の処理で(search.tifとして)残っているファイルがあれば、削除します。

    #テンプレート画像_注文請書
    {%SET_U(wk,テンプレート画像1,{%GET_G(TopFolder)}\90_System\20_画像\テンプレート_注文請書.tif)}
    

    ↑ テンプレート画像のパスをユーザーデータにセットします。

    #結果ファイル削除
    {%DELETE_FILE({%GET_U(wk,結果ファイル名)})}
    

    ↑ 前回の処理で(result.textとして)残っているファイルがあれば、削除します。

TIFF変換

  1. 右上の「処理名」より「マクロ実行」を選択し「処理追加」をクリックして社印貼り付け設定に追加し、処理名を「TIFF変換」と変更します。

  2. マクロ欄には、図のようにマクロを記入します。(画像内のマクロは、長いので右側が隠れています)

  3. このマクロについて説明します。

  4. #tiff変換
    {%DW_OUTPUT_TIFF_IMAGE({%GET_U(wk,探索画像ファイル名)},200,MONO,1,1,PACKBITS)}

    ↑ 入力されたXDWファイルの1ページ目のみをTiffファイルに変換します。マクロ中「200」という数値は、画像の解像度(dpi)を表します。これは、テンプレート画像の解像度と一致している必要があります。

MatchTemplateのコマンド呼び出し

  1. 右上の「処理名」より「コマンド実行」を選択し 「処理追加」を押して、社印貼り付け設定に追加します。(コマンド実行1)

  2. コマンドには以下のように記入します。

    "{%GET_G(TopFolder)}\90_System\10_Command\matchTemplate.exe" -t "{%GET_U(wk,テンプレート画像1)}" -s "{%GET_U(wk,探索画像ファイル名)}" -u mm -z "{%GET_U(wk,結果ファイル名)}"

    コマンドの書式については、 MatchTemplate 仕様 を参照して下さい。(結果はテキストファイルで出力されます)

結果取得

  1. 右上の「処理名」より「マクロ実行」を選択し 「処理追加」を押して、社印貼り付け設定に追加し、処理名を「結果取得」と変更します。

  2. マクロ欄には、図のようにマクロを記入します。

  3. それぞれのマクロについて説明します。

    #テンプレートマッチング結果取得
    {%CSV_FILE_READ({%GET_U(wk,結果ファイル名)},結果,0)}
    

    ↑ 結果のCSVファイルを読み込みます。

    #結果をユーザーデータにセット
    {%SET_U(属性,類似度,{%GET_U(結果_2,1)})}
    {%SET_U(属性,X座標,{%GET_U(結果_2,2)})}
    {%SET_U(属性,Y座標,{%GET_U(結果_2,3)})}
    

    ↑ 取得した結果に、それぞれ「類似度」「X座標」「Y座標」と名前をつけます。

    #差分を初期化
    {%SET_U(属性,差分X,0)}
    {%SET_U(属性,差分Y,0)}

    ↑ 画像(社印)を貼り付ける基本の位置を「差分」=「0(ゼロ)」として設定しておきます。これをもとに、テンプレートマッチングで取得した数値とのずれを計算します。

    {%LOG_OUT(リターンコード:{%GET_U(結果_1,1)})}
    {%LOG_OUT(類似度:{%GET_U(結果_2,1)})}
    {%LOG_OUT(X座標:{%GET_U(結果_2,2)})}
    {%LOG_OUT(Y座標:{%GET_U(結果_2,3)})}

    ↑ ログに結果を出力します。

    #--
    
    #リターンコード(1行目)の判定
    {%IF({%GET_U(結果_1,1)}=0,
      #マッチング確率のチェック
      {%IF(0.7<{%GET_U(属性,類似度)},
        #基本の位置と入力の帳票位置の差分を計算
        {%SET_U(属性,差分X,{%CALC({%GET_G(BaseX)}-{%GET_U(属性,X座標)})})}
        {%SET_U(属性,差分Y,{%CALC({%GET_G(BaseY)}-{%GET_U(属性,Y座標)})})}
      ,)}
    ,)}
    
    #--

    ↑ 判定結果により、マッチング確率をチェックします。マッチしていた場合は、基本となる注文請書内のテンプレート画像の位置座標(グローバルデータに「BaseX」「BaseY」としてセットされています)と、被探索画像内のテンプレート画像の位置座標との差分を計算します。

    {%LOG_OUT(差分X:{%GET_U(属性,差分X)})}
    {%LOG_OUT(差分Y:{%GET_U(属性,差分Y)})}

    ↑ 上記の計算で割り出した差分の数値をログに出力します。

    #貼り付け位置補正
    {%SET_U(属性,貼り付け座標X,{%CALC({%GET_U(属性,貼り付け座標X)}-{%GET_U(属性,差分X)})})}
    {%SET_U(属性,貼り付け座標Y,{%CALC({%GET_U(属性,貼り付け座標Y)}-{%GET_U(属性,差分Y)})})}
    

    ↑ 基本の貼り付け位置の座標から、差分の数値を引いて、貼り付け位置の補正値を算出します。

貼り付け

  1. 右上の「処理名」より「マクロ実行」を選択し「処理追加」をクリックして社印貼り付け設定に追加し、処理名を「貼り付け」と変更します。

  2. マクロ欄には、図のようにマクロを記入します。(画像内のマクロは、長いので右側が隠れています)

  3. このマクロについて説明します。

  4. #社印画像のパス
    {%SET_U(wk,path,{%GET_G(TopFolder)}\90_System\20_画像\社印.bmp)}
    

    ↑ 貼り付け画像のパスをユーザーデータにセットします。

    #社印貼り付け
    {%DW_PASTE_BITMAP_ANNOTATION(1,{%GET_U(wk,path)},{%CALC({%GET_U(属性,貼り付け座標X)}*100)},{%CALC({%GET_U(属性,貼り付け座標Y)}*100)})}

    ↑ 計算によって割り出された座標位置に、画像(社印)を貼り付けます。座標の単位は100分の1mmで指定する必要があるので、100倍します。

文書移動

  1. 右上の「処理名」より「文書移動」を選択し 「処理追加」を押して、社印貼り付け設定に追加し、処理名を「文書移動1」と変更します。

  2. 「移動先フォルダ」に以下のように記入します。

    {%GET_GLOBAL_DATA(TopFolder)}\20_貼り付け済
    
  3. 「移動先に同名の文書が存在する場合の処理」は、「ファイル名に連番を付加する」を選びます。

動作確認

設定が正しく動作するかどうか、テストします。

最初に「10_貼り付け前」フォルダ内に、注文請書(スキャンされ入力されたもの)のDocuWorks文書を作ります。

サンプルの注文請書は、基本のもの「注文請書.xdw」、基本よりも上にずれて入力されたもの「注文請書(左上ずれ).xdw」、基本よりも右にずれて入力されたもの「注文請書(右下ずれ).xdw」の3種類を用意しました。

これらのファイルは、繰り返しテスト出来るように、アーカイブしておきます。

以上の準備が整ったら、eDocArrangementの監視ボタンを押します。

処理が正しく動き、20_貼り付け済みフォルダ内が以下の画像のようになっているか確認します。

また、それぞれのファイルを開いて、全てのファイルにおいて、貼り付け画像が正しい位置に貼られていることを確認します。

↑「注文請書.xdw」

↑「注文請書(左上ずれ).xdw」

↑「注文請書(右下ずれ).xdw」

グローバルデータ

グローバルデータの内容は以下の通りです。トップフォルダを変更する場合は、以下の定義を変更してください。グローバルデータは、メニューのツールのグローバルデータの設定から変更できます。

BaseY、BaseYは、テンプレート画像の作成時に使用した文書を使って、テンプレートマッチングの処理を行い、ログに出力されたX座標をBaseX、Y座標をBaseYに指定します。

名前
TopFolder C:\Home\Demo\テンプレートマッチング2
BaseX 86.87
BaseY 17.4