2017-11-22 8 views
0

バイナリイメージ(テンプレート)が別のイメージ(ソース)の中に含まれているかどうかを確認しようとしています。これを行うには、私が最初にこのような何か始めた:ショートカットと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() 
+0

私の知る限りでは、OpenCVのは、そのようなものを持っていませんが、あなたは(のstd :: CV ::マットイテレータとfind_ifとあなたの条件が満たされたときにtrueを返す述語を使用することができますこの場合、画素は白色ではない)。最初のTrue値で停止し、画像を1回だけチェックします。すべてが白であれば、イテレータの終了を返します。イテレータの終了は、終了後に比較することができます。 – api55

答えて

1

を:

私は==私もこのコードをしようとしたことを言及するのを忘れてしまったが、XORを使用すると、使用するよりも少し速いです。短絡と動作をPythonで実装しましたが、これはcv2.bitwise_andよりもずっと遅く、cv2.bitwise_xorが続きました。しかし、私はその関数をコンパイルするためにnumbaを使いました。そして、私はcv2の4倍速く動作する関数を持つことになりました。ここでは、コードです:

@numba.jit("b1(u1[:,:],u1[:,:])") 
def is_template_in(template, image): 
    for y in range(0, template.shape[0]): 
     for x in range(0, template.shape[1]): 
      if template[y][x] and not image[y][x]: 
       return False 
    return True 
関連する問題