2016-11-27 2 views
0

Ich las die Dokumente über Vorlagenvergleich mit opencv und Python und im letzten Teil über Vorlagenvergleich mit mehreren Objekten, der Code erkennt die 19 Münzen auf dem Mario-Bild, aber, ist es möglich, die Anzahl der Objekte mit einigen erkannt zu zählen Funktion auf Python wie len() oder irgendeine opencv Methode?Wie kann die Anzahl der Objekte gezählt werden, die mit dem Template Matching erkannt wurden?

Hier wird gezeigt, der Code auf dem Tutorial: http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html

Template Matching Code:

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) 

Und das Ergebnis ist: Mario Bros & Coins

So ist es eine Möglichkeit, die zählen Münzen auf dem Bild erkannt und drucken Sie die Nummer auf dem Terminal? Etwas wie:

The Template Matching code showed before... 

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

Zeigen Sie uns, was Sie bisher versucht haben. – DimKoim

+0

Siehe ähnliche [Frage] (http://stackoverflow.com/q/33990259/1628638). Die Antwort dort bietet jedoch keine angemessene Lösung für das Problem "65 vs. 19" in der Frage. Eine einigermaßen zuverlässige Lösung wäre, keine Übereinstimmungen zu zählen, die sehr nahe bei einem vorherigen Spiel liegen. (Wenn Sie Ihre Eingabebilder bereitstellen, ist es für Personen einfacher, dies für Sie zu programmieren.) –

Antwort

0

ich eine passende Lösung gefunden (für meine Anwendung) in einzigartigen Begegnungen wie Ulrich zählen vorgeschlagen. Es ist nicht ideal, aber das Spielen mit der "Empfindlichkeit" liefert normalerweise Ergebnisse innerhalb von +/- 2% für meine Anwendung.

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) 
Verwandte Themen