2016-11-27 3 views
0

私はopencvとpythonとのテンプレートマッチングに関するドキュメントを読んでいました。最後の部分では複数のオブジェクトとのテンプレートマッチングについて、コードはmario画像上の19個のコインを検出しますが、いくつかのオブジェクトで検出されたオブジェクトの数を数えることは可能ですlen()や任意のopencvメソッドのようなPythonの関数? http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.htmlテンプレートマッチングで検出されたオブジェクトの数を数えるには?

テンプレートマッチングコード:

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img_rgb = cv2.imread('mario.png') 
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) 
template = cv2.imread('mario_coin.png',0) 
w, h = template.shape[::-1] 

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) 
threshold = 0.8 
loc = np.where(res >= threshold) 
for pt in zip(*loc[::-1]): 
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) 

cv2.imwrite('res.png',img_rgb) 

そして結果は次のとおりです。 Mario Bros & Coins

ので、カウントする方法がある。ここ

は、コードがチュートリアルに示したです画像上でコインを検出し、その数字を端末に印刷しますか?以下のような 何か:ウルリッヒが提案されているよう

The Template Matching code showed before... 

print "Function that detect number of coins with template matching" 
>>> 19 
+0

これまでに試したことをお見せください。 – DimKoim

+0

この類似[参照](http://stackoverflow.com/q/33990259/1628638)を参照してください。しかし、そこの答えは、質問の "65対19"問題に適切な解決策を提供していません。合理的に信頼できる解決策は、以前のマッチに非常に近いマッチを数えないことです。 (入力した画像を提供すれば、人々がこれをコード化しやすくなります。) –

答えて

0

私はユニークなマッチを数えるに(自分のアプリケーションのために)適した解決策を見つけました。それは理想的ではありませんが、通常、 "感度"で遊ぶと、私のアプリケーションでは+/- 2%以内の結果が得られます。

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img_rgb = cv2.imread('mario.png') 
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) 
template = cv2.imread('mario_coin.png',0) 
w, h = template.shape[::-1] 

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) 
threshold = 0.8 
loc = np.where(res >= threshold) 

f = set() 

for pt in zip(*loc[::-1]): 
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) 

    sensitivity = 100 
    f.add((round(pt[0]/sensitivity), round(pt[1]/sensitivity))) 

cv2.imwrite('res.png',img_rgb) 

found_count = len(f) 
関連する問題