2016-11-27 7 views
0

Я читал документы о сопоставлении шаблонов с opencv и python, а в последней части о совпадении шаблонов с несколькими объектами код обнаружил 19 монет на мариовом изображении, но можно ли подсчитать количество объектов, обнаруженных с помощью некоторых функция на python, например len() или любой opencv-метод?Как подсчитать количество обнаруженных объектов с помощью сопоставления шаблонов?

Вот код показал на уроке: http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html

Template Matching Код:

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

Я нашел подходящее решение (для моего приложения) в подсчете уникальных матчей, как Ulrich предложил. Это не идеально, но игра с «чувствительностью» обычно дает результаты в пределах +/- 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^