OCR機能付きペンスキャナーで商品チェックするぞ(2)
前回「WorldPenScan USB」なるペン型スキャナを購入したところまででしたが
今回は検証用としてペンスキャナで読み取った商品コードから商品名を表示するアプリケーションを作成します。
まずペン型スキャナから取得できる内容ですが
1.OCR(画像から文字を認識する機能)処理されたテキストデータ
2.読み込んだ画像データ
上記2点が取れます。今回は1のOCR処理済のテキストデータを使います。
ざっくりですが仕様を決めます。
1.商品マスタに登録されている「商品コード」がOCR処理されたテキスト上に
存在するかをチェックする。
2.1で存在が確認された「商品コード」に対する「商品名」を画面上に表示する
上記2点のみです。
1は通常バーコードリーダーを使う場合はリーダーで読まれた「商品コード」を「商品マスタ」の中から探すのが通常のアプローチですが、OCR処理済のテキストは「商品コード」のみではなく、「読み取った範囲の文字を読んだもの」になるため余計な情報が入ってくることが予想されます。カタログなどでは文字で表記されている「商品コード」のすぐ近くに説明文が入っていたりすることは珍しくないので、殆どの場合一緒に読まれてしまうでしょう。通常のやり方で永遠にマッチングしない物になってしまうので、逆のアプローチをとります。
さて、開発環境ですが今回は「FileMaker」で作っていきます。
去年会社で導入して、ちょこっとした物は凄く早くできそうなのですが
私自身がまだあまり慣れてないので、勉強がてらやってみますね。
FileMakerを開いて「ファイル」→「新規ソリューション」でソリューション名を決め
保存したら作成開始です。
まず初めに「テーブル」を作成していきます。
今回作るテーブルは2つ
1.「items」は商品の情報を格納する為の商品マスタです。
2.「input」は入力用のテーブルになります。ペンスキャナからの情報を受け付ける
為の物です。
次にフィールドを追加していきます。まずはitems
1.「item_cd」は商品コードを表します。スキャナで読み取った商品コードとマッチングをさせます。
2.「item_name」は商品名です。1でマッチングした場合に対となる「商品名」を表示させるための項目です。
次は「input」のフィールドです。
「items」と変わらないですね(笑)。ただし重要な違いとして「オプション」でグローバルを設定しています。グローバル設定の詳細はグローバルフィールド(グローバル格納を使用するフィールド)の定義を参照願います。
今回グローバルを使っている理由は入力を受け付ける為だけで使用しています。
他の開発環境で作る場合では、なんのフィールドにも関連付けられていないテキストボックスとかに入力値をいれて判定とかやればいいのですが、FileMakerでは殆どのオブジェクトはフィールドに関連付けしないといけないので、入力用のテーブルをグローバル設定にして使用しています。
次に通常であればFileMakerの肝となるリレーションを設定するのですが、今回は設定しません。
次は画面の作成です。itemsの画面は登録と検索に使います。
特におしゃれもせず単純に並べます。
次はペンスキャナからの入力を受け付けるinputの画面です。
入力の項目は「item_cd」のみ、item_cdにOCR処理された「商品コードを含んだテキスト」が入力され、一致する商品コードがあれば隣のitem_Name(商品名)に表示されます。
最後はスクリプトの作成です。
item_cd編集ボックスのスクリプトトリガの「OnObjectSave」(入力内容が保存されるとき)に下記のスクリプトを発動するようにします。
何をしているかといえば、最初の仕様で書いたように
OCR処理されたテキストは商品コード以外を含んでいる可能性が高い為通常と逆のアプローチをとります。
OCR処理済テキストのテキストの中に、「マスタ登録された商品コード」が入っているかをチェックする為、商品マスタテーブルの「item_cd」を一行ずつループで回し、
Position関数を使って0以上の値が帰ってくれば現在処理中の行の商品コードが存在する事になるので「input」の商品名に該当した行のitem_nameをコピーします。
これで完成のはず!
まずは商品マスタにそこらへんにあった「ラスパイマガジン2月号」を登録します。
そして手入力でテスト
item_cd編集ボックスに写真にも写っている「66996-42」と入力しEnter
おぉー。ちゃんと「ラスパイマガジン」と表示されました。
ちなみに一致しない内容を入力すると
となります。
では、商品コード以外の内容も入力してみましょう。
「ABCD66996-42aaa」と入力してみました。
おぉー。ちゃんと認識しました。さっきのラスパイの結果と同じ写真ですが、スクリプトで商品コード以外の文字はいらないので、マッチした場合は商品マスタの商品CDをコピーして表示しています。
一個だけではテストにもならないので、他にもいくつか登録をしてテスト。
ちゃんと動くのを確認して、いよいよペン型スキャナ「WorldPenScan USB」を使ってのテストです!。
ちなみにこのペン型スキャナは読み込むとそのまま現在フォーカスの当たっているところに読み込んだ内容を書き込んでくれます(さらにクリップボードにも残る)。USBバーコードリーダーでよくある「キーボードエミュレーション」なんでしょうね。ということは、先ほど作ったinput画面のitem_cdのところにフォーカスを当てておいて、そのままスキャナで読み込めば動くはず!
あれ?
スキャナはちゃんと読み込んでいるのに画面に変化が無い。
まったく画面に変化無し。
何回やっても変化無し。
念の為クリップボードに残ってないかテキストファイルを作って貼ってみましたが何も無し。
原因が掴めないので、FileMakerのUI周りを確認。VisualStudioについてくる「spy++」でウィンドウハンドルの状態を確認してみると...
肝心の作成した画面まわりのハンドルが取れません。
FileMaker独自のUIを使ってるのかな?
とはいえキーボードの入力は受け付けるので、キーボードエミュレーションっぽいペン型スキャナのアプリケーション(使う時は「WorldPenScan」っていうアプリケーションを起動します)側の問題?
多分ですが、スキャナ側のアプリケーションで入力可能な属性かどうかチェックしてからOCR処理後のテキスト出力を行っているんじゃないだろうか?
クリップボードの方も相変わらず取れないし....
んー諦めるしかないのか!?
いや!私もしょぼいとはいえエンジニアの端くれ!足掻いてやるぜ!
大分長くなってしまったので今日はここまでです。
次回力技で解決します。こうご期待(見てる人いるのかな?)