バイナリイメージ(テンプレート)が別のイメージ(ソース)の中に含まれているかどうかを確認しようとしています。これを行うには、私が最初にこのような何か始めた:ショートカットとopencvのシミュレーション方法
(その擬似コードに似ているのpythonを、私は言語の実装よりも右側の技術でより興味が)私は実現
#this code runs once at startup
template_nonzero = count_nonzero(template)
#this code is run inside a function
mask = bitwise_and(template, source)
is_contained = count_nonzero(mask) == template_nonzero
その後
mask = bitwise_and(template, source)
mask_against_template = bitwise_xor(template, mask)
is_contained = not mask_against_template.any()
このコードは、最初のコードよりもほぼ3倍高速です。私は今、opencvの短絡と演算子のようなものがあるかどうか疑問に思っています。これは、bitwise_andがすべての白いピクセルに対して真である場合はtrueを返し、最初のfalseオペレーションを見つけた場合はfalseを返します。このようにして、xorを使用するか、bitwise_andの画像全体を実行する必要はありません。
アイデア?
編集:私は解決策を見つけることになった
mask = bitwise_and(template, source)
mask_against_template = template == mask
is_contained = mask_against_template.all()
私の知る限りでは、OpenCVのは、そのようなものを持っていませんが、あなたは(のstd :: CV ::マットイテレータとfind_ifとあなたの条件が満たされたときにtrueを返す述語を使用することができますこの場合、画素は白色ではない)。最初のTrue値で停止し、画像を1回だけチェックします。すべてが白であれば、イテレータの終了を返します。イテレータの終了は、終了後に比較することができます。 – api55