■先週、冷蔵庫内をWebカムで撮影する仕掛けを作ったのだけど、撮影が扉を開けてから数秒待って撮影するだけという単純なものなので扉の開け方次第では撮影に失敗する。扉の内側にカメラを取り付けているので、撮影範囲が扉の開角度に依存してしまう。扉の開け方はその時々なので、単純にタイミングを計るだけだとシャッターチャンスを逃してしまう。扉が適切な状態に開いたときに撮影されるのが望ましいのだけど、開角度を把握するのは難しい。
扉の機械構造に手を入れるのは無理なので、外付けで曲げセンサーあたりを使うことが考え付くところだけど、耐久性のことや価格のことを考えるとやや面倒。それよりもカメラでは常に庫内の状況をフォローできているのだから、カメラ画像で判断できればそれがいい。手っ取り早いのは冷蔵庫の枠を認識できることだけど、対象が白っぽいところでハイコントラストな画像となることから、認識させるのはそのままでは難しい。だからマーカーをおけばいいだろう。白に黒だから、ビニールテープでも貼ればいい。
パターン認識に使ったのはOpenCVライブラリで、これをVBから呼び出します。VBからの呼び出しにはM.Oshikiri氏のOpenCV関係のサンプルソースを参考にしました。
まず、冷蔵庫内にマーカーを作り、それを扉内側にとりつけたWebカムで撮影し、マーカー部分を切り出してマーカー画像としました。
OpenCVには機械学習によるパターンマッチング手段(カスケード連結器)もありますが、それは使わずMatchTemplate関数でマーカー画像のマッチング位置を出し、次にマッチング位置の画像を取り出しMatchShapes関数で形状一致の度合いを出しています。
MatchShapesを使うのは、MatchTemplate関数は画像全体の中でテンプレート画像に最も似ている場所を出してくるためで、求めるマーカー画像そのものが無くてもマッチングの位置がそれなりに求まってしまう。そのため、あらためてMatchShapes関数で形状が似通っている度合いを出して、閾値を越えているかどうかで判定としています。
MatchShapes的な機能がMatcheTemplateの中で行われていると楽と言えば楽なのですが。サンプルソースをこちらに置いておきます。


全体動作としては扉が開いたことを検知してキャプチャを開始し、マーカー画像を検出した時点でファイルに保存する。保存した時点でキャプチャは停止し、扉を閉めると再び扉開放を待ちます。