アプリ版:「スタンプのみでお礼する」機能のリリースについて

画像認識アルゴリズムについて

指定画像と同じ画像を、画面に表示されている画像から探すプログラムを趣味で開発しています。
画像を探しだすことには成功しているのですが、どうも処理スピードが遅いように感じます。
アドバイスください。

【処理の詳細】
(1)指定画像を読み込み(LOCKBITSを使用し、一次配列で色情報を取得)
(2)画面画像を読み込み(LOCKBITSを使用し、一次配列で色情報を取得)
 ※一次配列には、ARGB値が格納されております。なので、10*10の画像を読み込んだ場合、
 配列に格納される情報は、400個になります。(A、R、G、B)*100ピクセル
(3)それぞれの配列情報を、FOR文で回し全件検索を行い、完全に一致した場合、完全一致した位置を記憶

というような流れになっています。
(3)の検索アルゴリズムに問題があると思っています。
1ピクセルずつ一致させるので、比較量が半端ないのです。
if bmp(1).equals(search(1)) andalso _
bmp(2).equals(search(2)) andalso _
bmp(3).equals(search(3)) then
  次のピクセルへ
endif
このような感じで、全ての一致するか調べています。

なにか高速で処理するための知恵をお貸しください。
基本的にVB.NETは変更したくありません。
よろしくお願いします。

A 回答 (3件)

自分はVBは使いませんし、PCアプリからは遠ざかっているものです。

只今回路設計メインな人間です。
しかし過去に似たようなソフトを作成したことがります。(13年以上前のこと)
特に文献など参考にせずに、何とな~く「!」で考えた手法です。(大方同じような造りになると思いますが)

当時CPUが遅かったので、処理速度を上げる方法として
1.対象画像をグレースケールに変換(256階調)
2.解像度を下げる
3.画像の特定領域のみをスキャンする


最後にスキャン方法を線化して、特定の線上部のスキャンのみを試してみました。
これも良い結果がでたと記憶しています。(四角の枠を数個設定して、その枠上のスキャンをさせるという方法です)
大幅な高速化が実現しました。
また目的も実現できましたが、目的が異なるために果たして有効かどうかは???
自分の場合は逆の目的ですが(侵入検出ソフトのようなもの)ある意味、正常時は同じ事をさせているわけですから、似たところもあると思います。
もっと手を抜いて処理をしても良い結果が出ると思いますが。
    • good
    • 0

これは、テンプレートマッチングと呼ばれる画像認識方法になります。


「テンプレートマッチング」をキーワードに、画像処理関連のサイトを探せば、いろんな手法が載っています。
高速な処理の例もあります。
    • good
    • 2

どんな画像を対象にしてるかで違うので一概に言えませんが……


自然画像を対象とする場合は双方とも各ピクセルを256階調の輝度値に変換した上でマッチングの検査を行えば、ARGBそのままでマッチングを行うよりも処理時間を短縮できます。また、フィルタリング処理等を用いて階調を落としたりするのも効果的かも。
(逆に輝度値の似たような色を使ってパターンを塗り分けしたようなものだと効果はありませんが)

あと、精度に有通が効く場合は、マッチング評価が一定値以上なら全ピクセルを検査しなくても一致とみなすとか、逆に一定のピクセル数を検査しても一定値以下ならもう一致しないと見てスキップするとかというのもよく使われる技法です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!