0

ここで説明したようにしようとしています:スクリーンショット内の画像を検索できるように、Numpy 画像内のサブ画像を検索します。

コードは次のようになります。

import cv2
import numpy as np
import gtk.gdk
from PIL import Image

def make_screenshot():
    w = gtk.gdk.get_default_root_window()
    sz = w.get_size()
    pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, sz[0], sz[1])
    pb = pb.get_from_drawable(w, w.get_colormap(), 0, 0, 0, 0, sz[0], sz[1])
    width, height = pb.get_width(), pb.get_height()
    return Image.fromstring("RGB", (width, height), pb.get_pixels())

if __name__ == "__main__":
    img = make_screenshot()
    cv_im = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    template = cv_im[30:40, 30:40, :]
    result = cv2.matchTemplate(cv_im, template, cv2.TM_CCORR_NORMED)
    print np.unravel_index(result.argmax(), result.shape)

(cv2.TM_CCORR_NORMED の代わりに) 選択した方法に応じて、まったく異なる座標を取得していますが、例のように (30, 30) ではありません。

教えてください、そのようなアプローチの何が問題なのですか?

4

1 に答える 1

0

簡単な答え: 次の行を使用して、最適な一致のコーナーを見つける必要があります。

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)

変数 maxLoc は、最適一致の左上隅の x、y インデックスを含むタプルを保持します。

長い答え:

cv2.matchTemplate() は、各インデックスの番号が、入力画像がそのインデックスのテンプレートとどの程度一致しているかに対応する単一のチャネル画像を返します。matchTemplate への呼び出しの後に次のコード行を挿入して結果を視覚化してみてください。なぜ numpy がそれを理解するのに苦労するのかがわかります。

cv2.imshow("Debugging Window", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

minMaxLoc() は、matchTemplate によって返された結果を必要な情報に変換します。テンプレートがどこで最悪の一致を示したか、または最良および最悪の一致で結果が保持する値を知りたい場合は、それらの値も使用できます。

このコードは、ファイルから読み取ったサンプル画像で機能しました。コードの誤動作が続く場合は、イメージを意図したとおりに読み取っていない可能性があります。上記のコード スニペットは、OpenCV を使用したデバッグに役立ちます。imshow の引数 result を任意の画像オブジェクト (numpy 配列) の名前に置き換えて、目的の画像が取得されていることを視覚的に確認します。

于 2013-08-08T22:52:28.520 に答える