私はCVの基本に頭を悩ませようとしています。最初に興味を持ったのはテンプレートマッチング(CVとは関係のないPyconの講演で言及されていた)だったので、そこから始めようと思いました。
私はこの画像から始めました:
その中からマリオを検出したい。だから私は彼を切り取った:
テンプレートを画像の周りにスライドさせて最適なものを確認するという概念を理解しています。チュートリアルに従うと、次のコードでマリオを見つけることができます。
def match_template(img, template):
s = time.time()
img_size = cv.GetSize(img)
template_size = cv.GetSize(template)
img_result = cv.CreateImage((img_size[0] - template_size[0] + 1,
img_size[1] - template_size[1] + 1), cv.IPL_DEPTH_32F, 1)
cv.Zero(img_result)
cv.MatchTemplate(img, template, img_result, cv.CV_TM_CCORR_NORMED)
min_val, max_val, min_loc, max_loc = cv.MinMaxLoc(img_result)
# inspect.getargspec(cv.MinMaxLoc)
print min_val
print max_val
print min_loc
print max_loc
cv.Rectangle(img, max_loc, (max_loc[0] + template.width, max_loc[1] + template.height), cv.Scalar(120.), 2)
print time.time() - s
cv.NamedWindow("Result")
cv.ShowImage("Result", img)
cv.WaitKey(0)
cv.DestroyAllWindows()
これまでのところ良いのですが、それから私はこれが信じられないほど壊れやすいことに気づきました。その特定の背景と、その特定のアニメーションフレームが表示されているマリオのみが検出されます。
マリオは常に同じマリオっぽい属性(サイズ、色)を持っているので、私は興味があります。彼の現在のフレームが静止しているか、さまざまな実行の1つであるかに関係なく、彼を見つけることができるテクニックがあります。サイクルスプライト?文字列に対して実行できるあいまいマッチングのようなものですが、画像に対して実行できます。
たぶん彼が唯一の赤いものなので、赤いピクセルを単純に追跡する方法はありますか?
他のすべての問題は、テンプレートから背景を削除することです。テンパテと完全に一致していなくても、MatchTemplate関数がマリオを見つけるのに役立つかもしれません。今のところ、それがどのように機能するかは完全にはわかりません(MatchTemplateにマスクパラメータがあることがわかりますが、さらに調査する必要があります)
私の主な質問は、テンプレートマッチングが、ほとんど同じであるが変化する(彼が歩いているときのように)画像を検出する方法であるかどうか、または私が調べる必要がある別の手法があるかどうかです。
アップデート:
他のマリオとのマッチングの試み
mmgpが他のものと一致させるために機能するはずであるという提案から離れて、私はいくつかのテストを実行しました。
私はこれを一致するテンプレートとして使用しました:
次に、マッチングをテストするために2、3のスクリーンショットを撮りました。
最初に、私はマリオを見つけることに成功し、最大値1を取得しました。
ただし、ジャンプするマリオを見つけようとすると、完全に失火します。
確かに、テンプレートのマリオとシーンのマリオは反対方向を向いており、アニメーションフレームも異なりますが、画像内の他の何よりもはるかに一致していると思います。色だけ。ただし、テンプレートに最も近いものとしてプラットフォームを対象としています。
これの最大値はであったことに注意してください0.728053808212
。
次に、マリオのいないシーンを試して、どうなるか見てみました。
しかし、奇妙なことに、私はマリオをジャンプした画像として正確な結果を取得します-類似性の値まで:0.728053808212
。写真に写っているマリオは、写真に写っていないマリオと同じくらい正確です。
本当に奇妙です!基礎となるアルゴリズムの実際の詳細はわかりませんが、標準偏差の観点から、テンプレートのマリオのスーツの赤と少なくとも一致するシーン内のボックスは、青よりも平均距離に近いと思いますプラットフォームですね。ですから、それが私が期待する一般的な領域にさえないことは、さらに混乱を招きます。
これは私の側のユーザーエラーか、あるいは単なる誤解だと思います。
同様のマリオがあるシーンが、マリオがまったくないシーンと同じくらい一致するのはなぜですか?